+ All Categories
Home > Documents > Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf ·...

Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf ·...

Date post: 27-Jan-2020
Category:
Upload: others
View: 1 times
Download: 0 times
Share this document with a friend
35
Aplicatii mobile pentru afaceri Master SIA Lect. Octavian Dospinescu (c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA
Transcript
Page 1: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Aplicatii mobile pentru afaceri

Master SIA

Lect. Octavian Dospinescu

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 2: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Tematica generala curs • Camera foto …zambiti, va rog…

• posibilitatea de a „deschide” aparatul foto al dispozitivului mobil şi de a previzualiza imaginile din mediul înconjurãtor;

• posibilitatea de a realiza o fotografie instant;

• posibilitatea de a salva automat fotografia obţinutã;

• posibilitatea de a realiza fotografii atât în format portrait cât şi în format landscape;

• posibilitatea de a „închide” aparatul foto cu care este dotat dispozitivul mobil. (c) Octavian Dospinescu & Marian Perca

2012-2013 pentru Master SIA

Page 3: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Concepte importante

• Camera;

• SurfaceView;

• SurfaceHolder;

• PictureCallback.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 4: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Concepte importante

• Camera;

• SurfaceView;

• SurfaceHolder;

• PictureCallback.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 5: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Camera – clasa centrala

• prin intermediul ei putem sã generãm o instanţã care va folosi camera hardware încorporatã în dispozitivul mobil.

• Principalele metode ale clasei Camera sunt:

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 6: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Camera – metode utile

• Camera.open() – permite obţinerea unei instanţe a camerei foto.

• setPreviewDisplay() – stabileşte suprafaţa pe care se vor afişa previzualizãrile obţinute cu camera foto;

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 7: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Camera – metode utile

• startPreview() – declanşeazã operaţiunea de Preview, iar rezultatul va fi afişat pe suprafaţa stabilitã prin metoda setPreviewDisplay();

• stopPreview() – are ca efect oprirea acţiunii de previzualizare, efectul imediat regãsindu-se pe suprafaţa precizatã prin setPreviewDisplay();

• release() – opreşte camera foto şi elibereazã resursa hardware astfel încât sã nu consume energie şi sã poatã fi utilizatã de o eventualã altã aplicaţie;

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 8: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Concepte importante

• Camera;

• SurfaceView;

• SurfaceHolder;

• PictureCallback.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 9: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

SurfaceView - concepte

• SurfaceView este o clasã care permite afişarea graficã a unei suprafeţe pe ecranul dispozitivului.

• Vom folosi aceastã clasã pentru a obţine de fapt o suprafaţã utilã de tip SurfaceHolder pe care sã o „pasãm” metodei setPreviewDisplay() atunci când dorim sã realizãm previzualizarea imaginilor din mediul ambiant.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 10: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

SurfaceView

• Având în vedere cã vom realiza implementarea pentru dispozitive mobile, este de aşteptat ca o suprafaţã de tip SurfaceView sã se re-orienteze în funcţie de cum este poziţionat dispozitivul: portrait sau landscape.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 11: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

SurfaceView – momente importante

• în „viaţa” unui SurfaceView apar 3 tipuri de evenimente pe care le putem trata prin intermediul unei interfeţe de tip SurfaceHolder.Callback:

• surfaceCreated

• surfaceChanged

• surfaceDestroyed

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 12: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

SurfaceView - evenimente

• surfaceCreated: aceastã metodã este apelatã imediat dupã ce suprafaţa este creatã

• surfaceChanged: aceastã metodã este apelatã imediat dupã orice modificare structuralã (format sau mãrime) care are loc asupra suprafeţei de afişare.

• surfaceDestroyed: aceastã metodã este apelatã imediat dupã ce suprafaţa este distrusã.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Ajutor suplimentar:

http://developer.android.com/reference/android/view/SurfaceHolder.Callback.html

Page 13: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Concepte importante

• Camera;

• SurfaceView;

• SurfaceHolder;

• PictureCallback.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 14: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

PictureCallback - concepte

• PictureCallback este o interfaţã pe care o vom utiliza în scopul „interceptãrii” butonului foto în momentul în care aparatul se declanşeazã de cãtre utilizator.

• Metoda pe care o vom implementa este onPictureTaken() care se executã ori de câte ori aparatul este declanşat de cãtre utilizator.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 15: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

PictureCallback - corelatii sugerate

• Se recomandã sã folosim aceastã interfaţã în corelaţie cu metoda takePicture(), primind astfel imaginea capturatã de cãtre aparatul foto sub forma unui array de bytes.

• Pentru mai multe informaţii despre aceastã interfaţa accesaţi linku-ul: http://developer.android.com/reference/android/hardware/Camera.PictureCallback.html.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 16: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Aplicatie foto – sugestie de layout

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 17: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Layout - componente

• btnStartPreview: declanşeazã previzualizarea;

• btnStopPreview: opreşte previzualizarea;

• btnFoto: realizeazã fotografia.

• un control grafic de tip ImageView care va avea rolul de a afişa pe ecran fotografia capturatã;

• un control de tip SurfaceView care va avea rolul de a afişa pe ecran previzualizarea obţinutã prin lentila aparatului foto.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 18: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

AndroidManifest.xml permisiuni necesare

• permisiunea de a utiliza echipamentul hardware de tip camerã foto: android.permission.CAMERA;

• permisiunea de a salva imaginile pe sdcard-ul extern: android.permission.WRITE_EXTERNAL_STORAGE.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 19: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

AndroidManifest.xml permisiuni necesare

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 20: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Aplicatie FOTO - implementare

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

public class FrmCameraComplet extends Activity implements SurfaceHolder.Callback, PictureCallback {

//controale locale

Button btnStartPreview,btnFoto,btnStopPreview;

SurfaceView suprafata;

SurfaceHolder suprafataReala;

Camera cameraMea;

boolean estePrevizualizare=false;

…///

.../// }

Page 21: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Aplicatie FOTO – evenimentul onCreate()

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//get the layout's objects

btnStartPreview = (Button) findViewById(R.id.btnStartPreview);

btnFoto = (Button) findViewById(R.id.btnFoto);

btnStopPreview = (Button) findViewById(R.id.btnStopPreview);

suprafata = (SurfaceView) findViewById(R.id.srfPrevizualizare);

suprafataReala=suprafata.getHolder();

suprafataReala.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

suprafataReala.addCallback(this);

afisare("Succes la poze!");

}

Page 22: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

public void onClickStartPreview(View view)

{

try

{

cameraMea = Camera.open();

if(cameraMea!=null)

{

cameraMea.setPreviewDisplay(suprafataReala);

cameraMea.startPreview();

estePrevizualizare=true;

afisare("Click pentru a face poza!");

}

}

catch (Exception eroare)

{

afisare("Eroare: " + eroare.getMessage().toString());

}

}

Aplicatie FOTO – butonul startPreview()

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 23: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

public void onClickStopPreview(View view)

{

if(cameraMea!=null) // && estePrevizualizare==true

{

cameraMea.stopPreview();

cameraMea.release();

cameraMea=null;

estePrevizualizare=false;

}

}

Aplicatie FOTO – butonul stopPreview()

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 24: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

public void onClickFoto(View view)

{

if(cameraMea!=null)

{

//iau imaginea curenta de pe aparatul deschis

cameraMea.takePicture(null, null, this);

//iau imaginea salvata pe SdCard si o afisez

Bitmap imagine;

imagine = BitmapFactory.decodeFile("/mnt/sdcard/primaMeaPoza.jpg");

ImageView jpgView = (ImageView) findViewById(R.id.imgEcran);

jpgView.setImageBitmap(imagine);

}

else

{

afisare("Camera este inchisa?!?");

}

/////////////////////

}

Aplicatie FOTO – butonul btnFoto()

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 25: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Aplicatie FOTO – butonul btnFoto()

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

//iau imaginea curenta de pe aparatul deschis

cameraMea.takePicture(null, null, this);

• în momentul în care utilizatorul doreşte sã facã o fotografie, acţioneazã

butonul btnFoto şi secvenţa aferentã va avea ca efect declanşarea

metodei takePicture() care la ultimul parametru specificã faptul cã

interfaţa PictureCallback este implementatã în contextul curent (this).

Ideea este cã invocarea metodei takePicture() are de fapt ca efect apelarea

unei metode numite onPictureTaken() care are ca parametri un array de tip

byte ce conţine de fapt imaginea şi un obiect de tip Camera.

Page 26: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

@Override

public void onPictureTaken(byte[] data, Camera camera) {

//atunci cand se ia fotografia din hardware

afisare("Facem foto!");

File directorCurent;

directorCurent = Environment.getExternalStorageDirectory();

String numePoza;

File fisierPoza;

fisierPoza = new File(directorCurent, "primaMeaPoza.jpg");

afisare(fisierPoza.getAbsolutePath());

try

{

FileOutputStream scriitor;

scriitor = new FileOutputStream(fisierPoza);

scriitor.write(data);

scriitor.close();

afisare("Am salvat!!!" + data.length);

}

catch (Exception eroare)

{

afisare("Eroare: " + eroare.getMessage());

}

}

Aplicatie FOTO – evenimentul onPictureTaken()

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 27: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

SurfaceView – revine (ne)sperat!

Având în vedere cã suprafaţa de afişare se poate modifica din punct de vedere structural, la fiecare astfel de eveniment trebuie sã ne sincronizãm aplicaţia şi eventual aparatul foto cu noua stare a suprafeţei de preview.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 28: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

SurfaceView – revine (ne)sperat!

Strategia este urmãtoarea:

• la crearea suprafeţei: se deschide camera foto;

• la distrugerea suprafeţei: se închide camera foto şi se elibereazã resursele hardware şi de memorie aferente;

• la modificarea suprafeţei: se întrerupe previzualizarea, se obţine noua suprafaţã cu noile caracteristici şi se începe o nouã previzualizare pe aceastã suprafaţã nouã.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 29: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

SurfaceView – la crearea suprafetei

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

@Override

public void surfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

cameraMea = Camera.open();

Log.i("surface", "s-a creat suprafata");

}

Page 30: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

cameraMea.stopPreview();

cameraMea.release();

cameraMea=null;

estePrevizualizare=false;

Log.i("surface", "s-a distrus suprafata");

}

SurfaceView – la distrugerea suprafetei

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 31: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)

{

// TODO Auto-generated method stub

Log.i("surface", "s-a modificat suprafata");

if(estePrevizualizare==true)

{

cameraMea.stopPreview();

estePrevizualizare=false;

}

if(cameraMea!=null)

{

try

{

cameraMea.setPreviewDisplay(holder);

cameraMea.startPreview();

estePrevizualizare=true;

}

catch(Exception eroare)

{

afisare("Eroare: " + eroare.getMessage().toString());

}

}

}

SurfaceView – la modificarea suprafetei

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 32: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Conditii emulator pentru camera

• stabilirea parametrului Configure Camera Facing Front la valoarea Emulated.

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 33: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Previzualizare pe emulator: sah!

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 34: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Foto! pe emulator: mat!

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA

Page 35: Aplicatii mobile pentru afaceriaplicatii-mobile.ro/.../2012/12/AMA_2012_curs_6_Camera.pdf · 2012-12-03 · • în momentul în care utilizatorul doreşte sã facã o fotografie,

Directii de viitor…

• posibilitatea de a organiza fotografiile sub forma unui album, prin salvarea cu denumiri diverse;

• posibilitatea de a realiza capturi foto „spion”, fãrã acordul expres al utilizatorului aplicaţiei, urmând ca aceste fotografii sã fie trimise periodic la un server (server-ul sotului/sotiei/prietenei/prietenului prietenei);

• posibilitatea de a controla blitz-ul aparatului foto în mod programatic;

• şi nu în ultimul rând, posibilitatea de a ne fotografia „mai frumoşi şi mai isteţi” .

(c) Octavian Dospinescu & Marian Perca 2012-2013 pentru Master SIA


Recommended