una tomar samsung pantalla mensajes imagen hacer conversacion como celular capturar captura android camera

android - samsung - como tomar captura de pantalla



¿Cuál es la mejor manera de llamar a StartPreview() después de capturar una imagen? (2)

Deberías iniciar mCamera.takePicture desde dentro de AsyncTask (o un hilo), pero los AsyncTaks son la opción más fácil.

Una implementación realmente simple (que, por supuesto, se puede modificar) es:

El método llamado para tomar la fotografía

/** * Execute the AsyncTask that will handle the preview of the captured photo. */ public void takePicture() { TakePictureTask takePictureTask = new TakePictureTask(); takePictureTask.execute(); }

La subclase AsyncTask

/** * A pretty basic example of an AsyncTask that takes the photo and * then sleeps for a defined period of time before finishing. Upon * finishing, it will restart the preview - Camera.startPreview(). */ private class TakePictureTask extends AsyncTask<Void, Void, Void> { @Override protected void onPostExecute(Void result) { // This returns the preview back to the live camera feed mCamera.startPreview(); } @Override protected Void doInBackground(Void... params) { mCamera.takePicture(null, null, mPictureCallback); // Sleep for however long, you could store this in a variable and // have it updated by a menu item which the user selects. try { Thread.sleep(3000); // 3 second preview } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }

El campo PictureCallback

private PictureCallback mPictureCallback = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File file = null; // Check whether the media is mounted with read/write permission. if (Environment.MEDIA_MOUNTED.equals( Environment.getExternalStorageState())) { file = getOutputMediaFile(); } if (file == null) { Log.d(TAG, "Error creating media file, check storage persmissions!"); return; } try { FileOutputStream fileOutputStream = new FileOutputStream(file); fileOutputStream.write(data); fileOutputStream.close(); } catch (FileNotFoundException e) { Log.d(TAG, "File not found: " + e.getMessage()); } catch (IOException e) { Log.d(TAG, "Error accessing file: " + e.getMessage()); } } };

Una vez que se realiza una llamada a Camera.takePicture (), mi vista previa dejará de actualizarse como se describe en los documentos. ¿Cuál es la mejor manera de detectar que el proceso de captura de imágenes ha finalizado y llamar a startPreview () para que comience a actualizarse nuevamente?

La llamada no se puede colocar en ninguna de las devoluciones de llamadas pasadas a tomar imagen, de acuerdo con los documentos, ya que todos deberían haber regresado antes de invocarlo.

Mi mejor conjetura actual es crear un controlador y publicar un Runnable retrasado desde la devolución de llamada JPEG (o cualquiera que sea la última devolución de llamada definida para devolver).


Dado que PictureCallback se inicia en una secuencia separada de todos modos (no bloqueará la interfaz de usuario), no necesita utilizar una AsyncTask para llamar a la captura.

Hay dos formas de hacer lo que quiere hacer, la más fácil es la siguiente:

mCamera.startPreview(); //preview has to be started before you can take a picture mCamera.takePicture(null, null, mPictureCallback); //take a picture private PictureCallback mPictureCallback = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { camera.startPreview(); //once your camera has successfully finished //its capture it''s safe to restart the preview ... //anything else you want to do to process that image } }

El segundo sería usar una función anónima, por ejemplo:

mCamera.takePicture(null, null, new PictureCallback(){ ... });

Ambos tienen sus usos, según sus necesidades.