Home > Guide e tutorial per Android > Guida programmazione Android – Lezione 10: Camera 2

Guida programmazione Android – Lezione 10: Camera 2

Lezione10

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ì:

layout_landscape

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