Error de la cámara "No se puede conectar a la cámara" o en algunos teléfonos aparece el error "La cámara está usando otra aplicación"
He implementado para grabar audio en segundo plano usando Android MediaRecorder si la grabación de audio está en curso y el usuario abierto es la cámara nativa para grabar vídeo, que da
Error de la cámara "No se puede conectar a la cámara"
- MediaRecorder.stop () se cuelga en la cámara Samsung Galaxy
- Uso de MediaPlayer para reproducir un archivo AMR creado por MediaRecorder falla con muri null
- Transmitir un archivo MediaRecorder durante la grabación
- MediaRecorder.stop () colgando con Android 4.0 (ICS)
- MediaRecorder start () falla si se llama demasiado rápido
O en algunos teléfonos, el error aparece como
Su cámara está en uso por otra aplicación
Si dejo mediarecorder entonces la grabación video nativa de la cámara trabaja muy bien, busqué eventos para saber cuándo la cámara va a comenzar el vídeo entonces entonces en mi app paro el mediarecorder, encontré el BroadcastReceiver con los filtros
<receiver android:name=".receiver.CameraReceiver"> <intent-filter android:priority="10000"> <action android:name="android.Medintent.action.CAMERA_BUTTON" /> <action android:name="android.hardware.action.NEW_PICTURE" /> <action android:name="android.hardware.action.NEW_VIDEO" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> <data android:mimeType="video/*" /> </intent-filter> </receiver>
Los eventos NEW_VIDEO y NEW_PICTURE se activan cuando se capturan y se guardan imágenes o vídeos en el directorio. ¿Alguien sabe cómo resolver este problema? Quiero saber en mi aplicación el evento cuando Native / Camera Apps va a grabar video. Gracias por adelantado
- Mediarecorder de Android Volcado de salida reflejada
- Cómo cambiar framerate cuando se utiliza clase MediaRecorder
- La clase MediaRecorder comienza a grabar audio después de un ligero retraso
- Grabar audio con MediaRecorder y reproducir simultaniosamente con MediaPlayer
- Android MediaRecorder stop () no se llama
- Cómo silenciar el "pitido" por MediaRecorder.start ()?
- AudioSource.VOICE_CALL no funciona en android 4.0 pero funciona en android 2.3
- Android MediaRecorder API mantiene el recorte de la velocidad de bits de vídeo
Incluso tuve el mismo problema. Una vez que el recurso de la cámara está siendo utilizado por una aplicación, hasta que se libera, puede utilizarlos en alguna otra aplicación o incluso un servicio. Si cualquier servicio está utilizando el recurso de la cámara, hasta que se libere lo mismo, no podemos usar el hardware de la cámara. Puede duplicar si el hardware de la cámara se está utilizando utilizando este código: –
private boolean isCameraInUse() { Log.v(TAG, "isCameraInUse()"); boolean isCameraInUse = false; if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)//Use Camera Api for Version Code < 23 and mCamera manager above it. { String cameraId = null; CameraManager camManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE); // Usually front mCamera is at 0 position. try { cameraId = camManager.getCameraIdList()[0]; } catch (CameraAccessException e) { Log.e(TAG, Log.getStackTraceString(e)); isCameraInUse = true; } try { camManager.setTorchMode(cameraId, true); camManager.setTorchMode(cameraId, false); } catch (CameraAccessException e) { Log.e(TAG, Log.getStackTraceString(e)); isCameraInUse = true; } } else { Camera c = null; try { c = Camera.open(); } catch (RuntimeException e) { Log.e(TAG, Log.getStackTraceString(e)); turnFlashOff(mContext); isCameraInUse = true; } finally { if (c != null) c.release(); } } return isCameraInUse; }
CameraManager.AvailabilityCallback
proporciona un onCameraAvailable(String cameraId)
para detectar si la cámara está disponible o no? https://developer.android.com/reference/android/hardware/camera2/CameraManager.AvailabilityCallback.html
Obtener todos los id de cámara es el mismo que el de arriba, como se muestra en @GAGAN.
CameraManager camManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE); // Usually front mCamera is at 0 position. try { cameraId = camManager.getCameraIdList()[0]; } catch (CameraAccessException e) { Log.e(TAG, Log.getStackTraceString(e)); Log.cat("Error: ", e.getReason()+""); if(e.CAMERA_DISABLED) {//ENABLE CAMERA } else if( ... you can go to the below link to do various logic) .... else { //don nothing} }
Nota: Hasta que otras aplicaciones utilicen el hardware de la cámara, están utilizando de forma intencionada. Así que hasta que estas aplicaciones no liberen su hardware, no puede usarlo, está claro. No puedes saber si estas aplicaciones realmente necesitan la cámara. Creemos que el proceso reserva el hardware cuando lo necesita.
Pero, podemos configurar el oyente en cuando la cámara se vuelve disponible (gratis) para que pueda utilizar de inmediato.
CameraManager.AvailabilityCallback availabilityCallback = new CameraManager.AvailabilityCallback() { @Override public void onCameraAvailable(String cameraId) { // your further stuffs. You must put all of your camera related logic here. } public void onCameraUnavailable(String cameraId) { //you can logcat camera not available } };
El uso de CameraManager.AvailabilityCallback
clase abstracta es cuando se crea una instancia de objeto, se realiza una instanciación anónima que implementa callbacks como onCameraAvailabe()
, que en realidad es un listener
que está recibiendo de Camera Observer
.
Respuesta: Si hubieras puesto los comandos de procesamiento de la cámara en la devolución de llamada onCameraAvailable()
, te garantizo que no tendrías el error que demostraste.
Si la cámara es utilizada por otras aplicaciones en segundo plano, significa que esas otras aplicaciones son una especie de buggy, porque la cámara necesita una vista preliminar; No están liberando la cámara incluso después de que se hagan con ella. Nadie usa la cámara en el fondo. Incluso en este caso también, se supone que no se debe matar el proceso de la cámara con fuerza, porque puede ocurrir la memoria de fugas. Porque usted no sabe cómo otros procesos están utilizando la cámara.
- Android ClassCastException con el tipo en blanco
- Cómo cambiar "Elegir una acción" a "Completar acción usando" en Android?