相机错误“无法连接到相机”或在某些电话中出现错误“相机正在使用另一个应用程序”

我已经实现了使用Android MediaRecorder在后台录制audio,如果audio录制正在进行中,用户打开本机摄像机录制video,它给

相机错误“无法连接到相机”

或在某些电话上,错误显示为

您的相机正在被另一个应用程序使用

在这里输入图像说明

如果我停止mediarecorder然后本机相机录像工作正常,我search事件知道什么时候相机要开始video,所以然后在我的应用程序停止媒体录像机,我发现BroadcastReceiver与filter

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

捕获图片或video并将其保存在目录中时触发NEW_VIDEONEW_PICTURE事件。 任何人都知道如何解决这个问题? 我想在我的应用程序中知道当Native / Camera Apps去录制video时的事件。 提前致谢

Solutions Collecting From Web of "相机错误“无法连接到相机”或在某些电话中出现错误“相机正在使用另一个应用程序”"

即使我有同样的问题。 一旦应用程序使用相机资源,直到它被释放,您可以在其他应用程序甚至服务中使用它们。 如果任何服务正在使用相机资源,直到它释放相同的,我们不能使用相机硬件。 您可以使用以下代码重新检查相机硬件是否正在使用: –

  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提供了onCameraAvailable(String cameraId)方法来检测相机是否可用? https://developer.android.com/reference/android/hardware/camera2/CameraManager.AvailabilityCallback.html

获取所有摄像头ID与@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} } 

https://developer.android.com/reference/android/hardware/camera2/CameraAccessException.html#CAMERA_IN_USE

注意: 在其他应用程序使用您的相机硬件之前,他们正在有目的地使用它们。 所以,直到这些应用程序不释放你的硬件,你不能使用它,很明显。 你不知道这些应用程序是否真的需要相机。 我们相信stream程会在需要时保留硬件。

但是,我们可以设置相机变得可用(免费)的监听器,以便您可以立即使用。

  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 } }; 

使用CameraManager.AvailabilityCallback抽象类是当你实例化对象时,你做匿名实例化实现像onCameraAvailabe() ,这实际上是一个listener ,你从Camera Observer获得的callback。

回答:如果您将相机处理命令放在onCameraAvailable()callback中,我保证,您不会得到您显示的错误。

如果相机被其他应用程序在后台使用,这意味着,其他应用程序是一种越野车,因为相机需要前景预览; 即使完成后也不会释放相机。 没有人在后台使用相机。 即使在这种情况下,你也不应该强行杀死相机进程,因为会发生内存泄漏。 因为你不知道其他进程如何使用相机。