Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cámara Android – A veces, cuando tomo fotos, la aplicación se congela y la cámara no es utilizable

He construido una aplicación que toma fotos cuando se toca la vista previa. Puedo tomar muchas fotos, pero a veces cuando toco la vista previa para tomar una foto, no hay sonido del obturador y toda la aplicación se bloquea. Además, después de eso, si intento lanzar el lanzamiento de la cámara incorporada aplicación, recibo un mensaje que la cámara no se puede utilizar.

No sé la razón de que el comportamiento, que sucede al azar y cuando sucede tengo que reiniciar el dispositivo (Samsung Galaxy S) para poder usar la cámara de nuevo.

En el DDM, después del accidente puedo ver la siguiente línea: keyDispatchingTimedOut

Aquí está el código relevante: CameraActivity Clase:

public class CameraActivity extends Activity { private static final String TAG = "CameraDemo"; Preview preview; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); preview = new Preview(this); ((FrameLayout) findViewById(R.id.preview)).addView(preview); ((FrameLayout) findViewById(R.id.preview)).setOnTouchListener(preview); Log.d(TAG, "Camera Activity Created."); } } 

Clase de vista previa:

  class Preview extends SurfaceView implements SurfaceHolder.Callback, OnTouchListener { private static final String TAG = "Preview"; SurfaceHolder mHolder; public Camera camera; Context ctx; boolean previewing = false; Preview(Context context) { super(context); ctx = context; // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } // Called once the holder is ready public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where // to draw. camera = Camera.open(); } // Called when the holder is destroyed public void surfaceDestroyed(SurfaceHolder holder) { if (camera != null) { camera.setPreviewCallback(null); camera.stopPreview(); camera.release(); camera = null; } previewing = false; } // Called when holder has changed public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { if(previewing){ camera.stopPreview(); previewing = false; } if (camera != null){ try { camera.setDisplayOrientation(90); camera.setPreviewDisplay(holder); camera.setPreviewCallback(new PreviewCallback() { // Called for each frame previewed public void onPreviewFrame(byte[] data, Camera camera) { Log.d(TAG, "onPreviewFrame called at: " + System.currentTimeMillis()); Preview.this.invalidate(); } }); camera.startPreview(); previewing = true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public boolean onTouch(View v, MotionEvent event) { camera.takePicture(shutterCallback, rawCallback, jpegCallback); return false; } // Called when shutter is opened ShutterCallback shutterCallback = new ShutterCallback() { public void onShutter() { Log.d(TAG, "onShutter'd"); } }; // Handles data for raw picture PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { Log.d(TAG, "onPictureTaken - raw"); } }; // Handles data for jpeg picture PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { FileOutputStream outStream = null; try { // Write to SD Card outStream = new FileOutputStream(String.format("/sdcard/TVguide/Detection/detected.jpg", System.currentTimeMillis())); // <9> outStream.write(data); outStream.close(); Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); } catch (FileNotFoundException e) { // <10> //Toast.makeText(ctx, "Exception #2", Toast.LENGTH_LONG).show(); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally {} Log.d(TAG, "onPictureTaken - jpeg"); Toast.makeText(ctx, "SAVED", Toast.LENGTH_SHORT).show(); camera.startPreview(); } }; } 

Por favor ayuda, estoy tratando de unos días para entender dónde está el problema sin éxito

Eyal

  • StartPreview falló pero no todos los dispositivos
  • Problema de orientación de la cámara en Android
  • ¿Qué podría provocar que una actividad de Android se reiniciara infinitamente al regresar de la cámara?
  • Objetivo de la cámara no funciona con Samsung Galaxy S3
  • Objetivo de la cámara de Android
  • Android: orientación / rotación de la pantalla para la vista previa de la cámara
  • Android Rotar imagen antes de guardar
  • Excepción de puntero nulo en la intención de la cámara cuando elijo una cámara de terceros
  • 3 Solutions collect form web for “Cámara Android – A veces, cuando tomo fotos, la aplicación se congela y la cámara no es utilizable”

    No sé qué causa ese fallo, realmente ayudaría si usted fijó la salida del loggcat del tiempo de cuando ocurrió este error.

    Pero, puedo hacer algunas gusesses. Parece que la cámara está bloqueada (la cámara incorporada no funciona). Si la aplicación se cierra, el bloqueo de la cámara puede deberse a una manipulación errónea de errores en la cámara HAL de Samsung. Especialmente en los teléfonos antiguos, como Galaxy S, no hicieron el mejor trabajo en el manejo de llamadas incorrectas o no estándar.

    Estas son algunas sugerencias de lo que puede haber causado este comportamiento:

    1. Debe agregar un protector para la toma de fotografías. En este momento, si toca la pantalla y toma la foto, puede volver a tocar la pantalla antes de que la imagen termine de tomar. Así, camera.takePicture () se llamará dos veces. El segundo fracasará. Esta es mi mejor conjetura.

      Añada alguna boolean isTakingPicture = false y luego:

       public boolean onTouch(View v, MotionEvent event) { if (!isTakingPicture) { camera.takePicture(shutterCallback, rawCallback, jpegCallback); isTakingPicture = true; } return false; } ... public void onPictureTaken(byte[] data, Camera camera) { isTakingPicture = false; ... 
    2. ¿Para qué utiliza previewCallback? No hago nada útil aquí. Previsualizar las devoluciones de llamada a veces puede a veces causar algún dolor, aunque su código parece bien para mí. Usted puede siempre intentar quitarlo y comprobar si eso ayuda.

    Acabo de ejecutar en este problema al probar mi aplicación en un Samsung Galaxy SII. Sólo tienes que eliminar la devolución de llamada antes de tomar la foto:

     mCamera.setPreviewCallback(null); mCamera.takePicture(null, null, mPictureCallback); 

    He experimentado un problema similar reportado aquí. En LG p705 y Samsung Galaxy Trend, después de tomar una foto, la vista previa se ha congelado y la cámara ya no se puede utilizar hasta que el teléfono se reinicia. Sin embargo, en Galaxy S3, la vista previa continúa mostrándose correctamente incluso después de varias fotos.

    Durante la depuración, me di cuenta de que la clase de escucha relevante estaba recibiendo más de una llamada cuando se presionó el botón de la cámara para tomar la foto. No estoy seguro de por qué se está invocando dos veces, a pesar de que el botón fue sólo haga clic una vez. En cualquier caso, gracias a la sugerencia de Tomasz de utilizar una variable booleana, la segunda llamada omite la toma de foto mientras se está realizando el primer intento. Y gracias a Eyal por la pregunta también. 🙂

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.