telefono solucion reinicia recuperar puedo puede porque por iniciar funciona favor error como celular camara arreglar acceder android crash camera android-camera

android - solucion - no se puede iniciar la camara por favor reinicia tu telefono



Cámara Android: a veces, cuando tomo fotos, la aplicación se congela y la cámara no se puede usar (3)

He creado una aplicación que toma fotos cuando tocas la vista previa. Puedo tomar muchas fotos, pero a veces, cuando toco la vista previa para tomar una foto, no hay sonido de obturador y toda la aplicación se congela. Además, después de eso, si intento lanzar la aplicación de la cámara incorporada, recibo un mensaje de que la cámara no puede ser utilizada.

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

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

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

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 intentando algunos días para entender dónde está el problema sin éxito

Eyal


No sé qué causa ese error, realmente sería útil si publicara la salida de loggcat desde el momento en que ocurrió este error.

Pero, puedo hacer algunos gusesses. Parece que la cámara está bloqueada (la cámara incorporada no funciona). Si la fuerza de la aplicación se cerró, el bloqueo de la cámara podría deberse a un error en el manejo de errores en la cámara HAL de Samsung. Especialmente en teléfonos más antiguos, como Galaxy S, no hicieron el mejor trabajo al manejar llamadas API incorrectas o no.

Aquí hay algunas sugerencias de lo que puede haber causado este comportamiento:

  1. Debe agregar un guardia para tomar una foto. En este momento, si tocas la pantalla y tomas una foto, puedes volver a tocar la pantalla antes de que la imagen termine de tomarse. Entonces, camera.takePicture () se llamará dos veces. El segundo fracasará. Esta es mi mejor suposición.

    Agregue una 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é utilizas previewCallback? No hago nada útil aquí. Las devoluciones de vista previa a veces a veces pueden causar algo de dolor, aunque tu código se ve bien para mí. Siempre puedes tratar de eliminarlo y verificar si eso ayuda.


Acabo de encontrarme con este problema al probar mi aplicación en un Samsung Galaxy SII. Solo tiene que eliminar la devolución de llamada previa antes de tomar la fotografía:

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


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

Mientras estaba depurando, noté que la clase de oyente relevante estaba recibiendo más de una llamada cuando se presionó el botón de la cámara para tomar una foto. No estoy seguro de por qué se invoca dos veces, aunque el botón solo se haya hecho clic una vez. En cualquier caso, gracias a la sugerencia de Tomasz de usar una variable booleana, la segunda llamada se salta tomando una foto mientras el primer intento está en progreso. Y gracias a Eyal por la pregunta también. :)