Capturați și decupați o imagine cu camera aparatului

Multe dispozitive Android sunt echipate cu camere încorporate. În acest tutorial, vom lucra prin tehnica de bază pentru capturarea unei imagini utilizând camera Android și apoi trunchierea cu ajutorul aplicațiilor pe care utilizatorul le-a instalat deja pe dispozitivul lor. De-a lungul drumului, voi arăta, de asemenea, cum să contabilizez utilizatorii ale căror dispozitive nu acceptă nici acțiunile de captare a imaginilor, nici de tăiere.


Pasul 1: Începeți un nou proiect Android

Creați un nou proiect Android în Eclipse sau IDE-ul ales. În clasa principală a activității, adăugați următoarele declarații de import după declarația pachetului:

 importă android.app.Activity; import android.content.ActivityNotFoundException; import șiroid.content.Intent; import șiroid.graphics.Bitmap; importul android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import șiroid.view.View; importă android.view.View.OnClickListener; import șiroid.widget.Button; importă android.widget.ImageView; importă android.widget.Toast;

Acestea ne permit să realizăm capturarea imaginii, recoltarea și afișarea în cadrul aplicației. Deschideți fișierul XML de fișiere al aplicației, pe care îl veți găsi în dosarul "res / values". Adăugați următoarele șiruri de caractere:

 Capturați o imagine pentru a fi recoltate! Imagine Lansați aparatul foto

Vom folosi aceste șiruri în interfața cu utilizatorul.


Pasul 2: Implementați aspectul aplicației

Să proiectăm aspectul aplicației. Deschideți fișierul principal XML, care ar trebui să fie în folderul "res / layout". Utilizați un aspect liniar după cum urmează, pe care Eclipse l-ar fi furnizat deja:

  

În interiorul layoutului liniar, adăugați următorul text:

 

Aici vom afișa un text informativ folosind un șir definit în fișierul de fișiere XML. După afișarea textului, adăugați un buton după cum urmează:

 

Valoarea ID ne va permite să identificăm butonul din Java, astfel încât să putem răspunde la clicuri. Din nou, folosim un șir definit deja în XML. În cele din urmă, după buton, adăugați o imagine de vizualizare:

 

Vom plasa imaginea captuită de utilizator cu camera aparatului în interiorul acestei imagini, folosind valoarea ID pentru ao identifica în Java. Utilizăm unul dintre șiruri de caractere ca o descriere a conținutului și o resursă de fond care poate fi creată pe care o vom crea în continuare. Dacă doriți ca vizualizarea imaginii să se întindă pentru a umple spațiul disponibil, modificați atributele de lățime și înălțime la "fill_parent" în loc de "wrap_content" - rețineți că acest lucru poate face ca imaginea afișată să apară în calitate slabă.

Pentru extensia de fundal, creați un nou fișier XML în fiecare dintre folderele desenate ale aplicației dvs., numind-o "pic_border.xml" pentru a se potrivi cu valoarea pe care am folosit-o în secțiunea Image View layout. Cel mai simplu mod de a face acest lucru este să creați fișierul într-un folder desenat, să copiați codul XML în el, să îl salvați, apoi să-l copiați în celelalte foldere desenabile.

Utilizați următorul XML în noul fișier desenat "pic_border":

      

Utilizarea unei resurse de fundal tractabile este în întregime opțională, deci nu ezitați să omiteți această parte. Acesta este modul în care aplicația va arăta când este lansată:


Pasul 3: Răspundeți la clicurile utilizatorilor

În clasa Activitate a aplicației, extindeți linia de declarație a clasei de deschidere după cum urmează:

 clasa publică ShootAndCropActivity se extinde Activitatea implementează OnClickListener 

Modificați numele clasei pentru a se potrivi cu dvs. În cadrul metodei Activitate "onCreate", adăugați următoarele după codul existent care apelează metoda superclass și setarea aspectului de conținut pe care Eclipse ar fi trebuit să îl umple:

 // recupera o referință la butonul UI Buton captureBtn = (buton) findViewById (R.id.capture_btn); // clicuri pe butonul de mână captureBtn.setOnClickListener (acest lucru);

Aici pur și simplu instruim clasa să se ocupe de clicurile pe butoane. Utilizatorul va apăsa butonul pentru a lansa camera. Acum trebuie să furnizăm o metodă "onClick". Adăugați-o după cum urmează, după metoda "onCreate":

 public void onClick (Vizualizare v) if (v.getId () == R.id.capture_btn) 

În cadrul instrucțiunii "if", vom implementa utilizarea camerei.


Pasul 4: Lansați aparatul foto

În partea de sus a declarației de clasă, înainte de metoda "onCreate", adăugați următoarele variabile de instanță:

 // ține evidența intenției de captare a imaginilor finale int CAMERA_CAPTURE = 1; // capturat imagine uri private Uri picUri;

Vom folosi prima variabilă pentru a urmări interacțiunea utilizatorului în timp ce navighează la aplicația camerei și înapoi. A doua variabilă va stoca URI-ul imaginii capturate. În cadrul instrucțiunii "if" din metoda "onClick", adăugați următorul cod pentru a lansa intenția camerei, inclusiv în blocul "încercați":

 încercați // utilizați intenția standard pentru a captura o imagine Intenție capturăIntent = intenție nouă (MediaStore.ACTION_IMAGE_CAPTURE); // vom gestiona datele returnate în onActivityResult startActivityForResult (captureIntent, CAMERA_CAPTURE); 

Când se execută acest cod, aplicația camerei utilizatorului va porni și vor putea face o fotografie. Ne vom ocupa de utilizatorul care se întoarce de la aplicația camerei în cadrul metodei "onActivityResult". De acolo vom putea verifica dacă utilizatorul se întoarce din această intenție folosind variabila "CAMERA_CAPTURE" pe care o transmitem la pornirea activității. Cu toate acestea, înainte de a face acest lucru trebuie să ne ocupăm de situația în care dispozitivul de utilizator nu acceptă intenția de captare a imaginii pe care am încercat să o lansăm aici. După blocul "încercați", adăugați o "captură" după cum urmează:

 captură (ActivityNotFoundException anfe) // afișează un mesaj de eroare String errorMessage = "Whoops - dispozitivul dvs. nu acceptă capturarea imaginilor!"; Toast toast = Toast.makeText (aceasta, errorMessage, Toast.LENGTH_SHORT); toast.show (); 

Ori de câte ori încercați să lansați o intenție în afara aplicației proprii, aceasta este o precauție pe care ați dori să o luați. Acest lucru este în special cazul acțiunii de recoltare pe care o vom explora mai târziu, însă acest model de cod este un obicei bun de a adopta în general, deoarece dispozitivele utilizator variază foarte mult. Când utilizatorul acceptă fotografia pe care au capturat-o, ei se vor întoarce la aplicație.


Pasul 5: Preluați imaginea capturate

Am lansat aplicația pentru cameră folosind "startActivityForResult", astfel că acum trebuie să rezolvăm rezultatul. Adăugați metoda "onActivityResult" după metoda "onClick" după cum urmează:

 protejat void onActivityResult (int requestCode, int resultCode, date intelect) if (resultCode == RESULT_OK) 

În cadrul instrucțiunii "if", adăugați altul pentru a verifica dacă ne întoarcem din aplicația camerei, utilizând variabila pe care am trecut-o:

 // utilizatorul se întoarce de la capturarea unei imagini utilizând camera dacă (requestCode == CAMERA_CAPTURE) 

Vom reveni la metoda "onActivityResult" după ce utilizatorul își cultivă imaginea, așa că vom adăuga mai târziu un "else if". În această declarație "if", adăugați următorul cod pentru a prelua URI-ul fotografiei capturate:

 // obține Uri pentru imaginea capturată picUri = data.getData ();

Acum trebuie să transmitem acest URI unei aplicații care îl poate recolta. Vom folosi o metodă de ajutor pentru a realiza acest lucru, deci adăugați următoarea metodă de apel:

 // efectuați operațiunea de cultură performCrop ();

Pasul 6: Decupați imaginea capturate

Adăugați metoda de ajutor pe care am apelat-o după metoda "onActivityResult":

 private void performCrop () 

În cadrul acestei metode vom numi un Intent pentru a efectua recolta, deci adăugați blocuri "try" și "catch" în cazul în care dispozitivul utilizatorului nu suportă operația de recoltare:

 încercați  captură (ActivityNotFoundException anfe) // afișează un mesaj de eroare String errorMessage = "Whoops - dispozitivul dvs. nu acceptă acțiunea de recoltare!"; Toast toast = Toast.makeText (aceasta, errorMessage, Toast.LENGTH_SHORT); toast.show (); 

Folosim aceeași tehnică pe care am folosit-o la lansarea intenției camerei. Dacă dispozitivul utilizatorului nu acceptă intenția de decupare, ei vor vedea un mesaj de eroare. În interiorul blocului "încercați", lansați intenția după cum urmează:

 // apelați intenția de acțiune a culturii standard (este posibil ca dispozitivul utilizatorului să nu o accepte) intenție cropIntent = intenție nouă ("com.android.camera.action.CROP"); // indicați tipul de imagine și Uri cropIntent.setDataAndType (picUri, "image / *"); // setați proprietățile culturii cropIntent.putExtra ("crop", "true"); // indicați aspectul culturii dorite a culturiiIntent.putExtra ("aspectX", 1); cropIntent.putExtra ("aspectY", 1); // indicați ieșirea X și Y cropIntent.putExtra ("outputX", 256); cropIntent.putExtra ("outputY", 256); // recupera datele despre return cropIntent.putExtra ("return-data", true); // începe activitatea - ne ocupăm de returnarea în onActivityResult startActivityForResult (cropIntent, PIC_CROP);

Aici setăm diferite proprietăți pentru imaginea tăiată, instruind aplicația să recupereze datele de imagine rezultate atunci când cultura este completă. Dacă doriți ca dimensiunile imaginii tăiate să difere de acestea, modificați liniile "outputX" și "outputY" în consecință. Noi numim intenția folosind "startActivityForResult", așa că vom relua rezultatul din "onActivityResult" din nou. Ca și intenția camerei foto, vom transmite o variabilă pentru a urmări care Intenție ne întoarcem, deci adăugați o declarație de variabilă în partea de sus a clasei, alături de celelalte variabile de instanță:

 // urmăriți intenția de recoltare finală int PIC_CROP = 2;

Pe lângă decupare, utilizatorul poate selecta o zonă a imaginii.


Pasul 7: Afișați imaginea tăiată

În cele din urmă, putem recupera imaginea tăiată și afișăm-o în interfața de utilizare a aplicației. În cadrul metodei "onActivityResult", după instrucțiunea "if" în care verificați codul de solicitare "CAMERA_CAPTURE", adăugați o verificare "if else" pentru codul "PIC_CROP", caz în care revenim din operațiunea de recoltare :

 // utilizatorul se întoarce de la decuparea imaginii altfel dacă (requestCode == PIC_CROP) 

În cadrul acestei declarații, putem prelua imaginea decupată returnată după cum urmează:

 // obține datele returnate Bundle extras = data.getExtras (); // a obține bitmapul decupat Bitmap thePic = extras.getParcelable ("data");

Acum avem imaginea decupată de utilizator ca un Bitmap. Să afișăm imaginea în Imagine după cum urmează:

 // recupera o referință la ImageView ImageView picView = (ImageView) findViewById (R.id.picture); // afișați imaginea răsturnată returnată picView.setImageBitmap (thePic);

Acum, imaginea decupată va apărea în interiorul aplicației de aplicație imediat ce utilizatorul revine din decupare. Salvați și rulați aplicația pe un dispozitiv real pentru al testa.


Concluzie

În acest tutorial am explorat procesul de captare și de recoltare de bază în Android SDK. Cu toate acestea, acțiunea de recoltare, în special, poate fi puțin imprevizibilă pe diferitele dispozitive de utilizare aflate în exploatare. O mulțime de aplicații diferite pot gestiona operațiunea de recoltare, astfel încât unii dezvoltatori adoptă un algoritm mai complex pentru a rezolva opțiunile utilizatorului, prezentând aceste aplicații utilizatorului ca listă de opțiuni de alegere. Oricare ar fi aplicațiile oferite de mediul de utilizare, procesul de bază al capturii și culturii rămâne același.

Cod