
Continuiamo oggi la nostra app “camera” e vediamo come scattare una foto e come memorizzarla nella galleria.
Per prima cosa avremo bisogno di un pulsante che una volta cliccato ci permetterà di scattare la foto: ci servirà quindi una imageView. La aggiungiamo come visto nelle lezioni precedenti, stavolta però selezioniamo la modalità landscape in alto. L’icona potete trovarla qui.
Il layout dovrebbe apparire quindi così:
Ora andiamo sul file MainActivity.java e modifichiamo aggiungendo questo codice nel metodo onCreate():
ImageView icona=(ImageView)findViewById(R.id.imageView1); icona.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { camera.takePicture(null, null, after_photo); } });
E questo codice dentro la classe:
PictureCallback after_photo = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { //salviamo la foto String root = Environment.getExternalStorageDirectory().toString(); File miaCartella = new File(root + "/miaCartella"); miaCartella.mkdirs(); String nomeFoto = "miaPhoto"; File file = new File (miaCartella,nomeFoto+".jpg"); if (file.exists ()) file.delete (); try { file.createNewFile(); FileOutputStream out = new FileOutputStream(file); Bitmap bmp = BitmapFactory.decodeByteArray(data,0,data.length,null); bmp.compress(Bitmap.CompressFormat.JPEG, 90, out); out.write(data,0,data.length); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } /*la preview della camera si blocca quando scattiamo una foto, va fatta ripartire*/ camera.startPreview(); } };
Il metodo takePicture() catturerà così una foto e richiamerà il metodo onPictureTaken() di after_photo. Sarà qui che sceglieremo il nome da dare alla nostra foto e dove salvarla. Ecco il codice completo:
public class MainActivity extends Activity implements SurfaceHolder.Callback{ private Camera camera; static private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT); requestWindowFeature(Window.FEATURE_NO_TITLE); //per eliminare la barra del titolo getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //per rendere l'activity fullscreen setContentView(R.layout.activity_main); surfaceView = (SurfaceView)findViewById(R.id.camera_surface); surfaceHolder = surfaceView.getHolder(); //associamo l'holder surfaceHolder.addCallback(this); ImageView icona=(ImageView)findViewById(R.id.imageView1); icona.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { camera.takePicture(null, null, after_photo); } }); } PictureCallback after_photo = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { //salviamo la foto String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); File miaCartella = new File(root + "/miaCartella"); miaCartella.mkdirs(); String nomeFoto = "miaPhoto"; File file = new File (miaCartella,nomeFoto+".jpg"); if (file.exists ()) file.delete (); try { file.createNewFile(); FileOutputStream out = new FileOutputStream(file); Bitmap bmp = BitmapFactory.decodeByteArray(data,0,data.length,null); bmp.compress(Bitmap.CompressFormat.JPEG, 90, out); out.write(data,0,data.length); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } /*la preview della camera si blocca quando scattiamo una foto, va fatta ripartire*/ camera.startPreview(); } }; public void surfaceCreated(SurfaceHolder holder) { camera=Camera.open(); } public void surfaceDestroyed(SurfaceHolder holder) { camera.release(); } public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { try{ camera.setPreviewDisplay(arg0); camera.startPreview();} catch (IOException e){} } }
Aggiungete inoltre i permessi per salvare la foto sul dispositivo, aggiungendo all’AndroidManifest il permesso WRITE_EXTERNAL_STORAGE.
Puoi guardare tutte le lezioni passate consultando l’indice del corso di programmazione android