Android 相机错误“;Can';t连接到摄像头“;或者在某些手机中出现“错误”;摄像头正在被另一个应用程序使用;

Android 相机错误“;Can';t连接到摄像头“;或者在某些手机中出现“错误”;摄像头正在被另一个应用程序使用;,android,camera,android-camera,video-capture,mediarecorder,Android,Camera,Android Camera,Video Capture,Mediarecorder,我已经实现了使用AndroidMediaRecorder在后台录制音频如果音频录制正在进行,并且用户打开本机摄像头录制视频,它会 摄像头错误“无法连接到摄像头” 或者在某些手机上,错误显示为 您的相机正被其他应用程序使用 如果我停止mediarecorder,则本机摄像机视频录制工作正常,我搜索事件以了解摄像机何时开始视频,因此在我的应用程序中,我停止了mediarecorder,我找到了带有过滤器的BroadcastReceiver <receiver android:

我已经实现了使用AndroidMediaRecorder在后台录制音频如果音频录制正在进行,并且用户打开本机摄像头录制视频,它会

摄像头错误“无法连接到摄像头”

或者在某些手机上,错误显示为

您的相机正被其他应用程序使用

如果我停止mediarecorder,则本机摄像机视频录制工作正常,我搜索事件以了解摄像机何时开始视频,因此在我的应用程序中,我停止了mediarecorder,我找到了带有过滤器的BroadcastReceiver

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

新建视频新建图片捕获图片或视频并保存到目录中时激发的事件。谁知道这个问题怎么解决?我想在我的应用程序中知道本机/摄像头应用程序录制视频的时间。提前谢谢

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

 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;
}
private boolean isCameraInUse(){
Log.v(标记“isCameraInUse()”);
布尔值isCameraInUse=false;
if(android.os.Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.M)//对版本代码<23使用摄像头Api,并在其上方使用mCamera管理器。
{
字符串cameraId=null;
CameraManager=(CameraManager)mContext.getSystemService(Context.CAMERA_服务);
//通常前mCamera位于0位置。
试一试{
cameraId=camManager.getCameraIdList()[0];
}捕获(CameraAccessE异常){
Log.e(TAG,Log.getStackTraceString(e));
isCameraInUse=true;
}
试一试{
camManager.setTorchMode(cameraId,true);
camManager.setTorchMode(cameraId,false);
}捕获(CameraAccessE异常){
Log.e(TAG,Log.getStackTraceString(e));
isCameraInUse=true;
}
}否则{
摄像机c=null;
试一试{
c=摄影机打开();
}捕获(运行时异常e){
Log.e(TAG,Log.getStackTraceString(e));
关闭闪络(mContext);
isCameraInUse=true;
}最后{
如果(c!=null)c.release();
}
}
返回使用;
}

CameraManager.AvailabilityCallback
提供了
onCameraAvailable(字符串cameraId)
方法来检测摄像机是否可用。

获取所有摄像头ID与上面的@GAGAN所示相同

CameraManager camManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
        // Usually front mCamera is at position 0.
        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 link below to do various logic */ ) {
                //...
            }
            else { /* do nothing */ }
        }

注意:在其他应用程序使用您的相机硬件之前,它们都是故意使用的。很明显,除非这些应用程序不能释放你的硬件,否则你不能使用它们。你不知道这些应用程序是否真的需要摄像头。我们相信,该过程在需要时会保留硬件

但是,我们可以在相机可用(免费)时设置侦听器,以便您可以立即使用它

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
抽象类的使用是在实例化对象时,执行匿名实例化来实现回调,如
onCameraAvailable()
,它实际上是从摄影机
观察者
获得的
侦听器

回答:如果您将摄像头处理命令放入
onCameraAvailable()
回调中,我保证,您不会出现显示的错误


如果相机在后台被其他应用程序使用,这意味着其他应用程序有点问题,因为相机需要前台预览;即使在使用完相机后,他们也不会释放相机。没有人在后台使用照相机。即使在这种情况下,也不应该强制终止摄影机进程,因为内存泄漏可能会发生。因为你不知道其他进程是如何使用相机的

是的,你是对的,但我不想知道相机是否正在使用,我想知道另一个应用程序是否需要设备摄像头,所以我停止了录音。感谢您花时间研究这个问题。不幸的是,我不认为有任何方法可以检测其他应用程序是否需要摄像头硬件资源。没有什么是不可能的@GAGAN如果这个API不可用,那么我们将在google人员面前将这个东西添加到他们的应用程序中SDK@NaveedAhmad,直到进程不释放资源,这意味着它需要那个资源。@UddhavGautam谢谢你的消息,基本上不知道另一个应用程序需要哪个资源,我们不知道什么时候发布。应该有一个广播接收器消息,用于请求保存该资源的应用程序。兄弟,我正在保存MediaRecorder,对吗?现在,如果有人打开本机摄像头应用程序录制视频,则该应用程序上会出现错误,无法连接到摄像头。@navedahmad为什么不显示MediaRecorder实现代码?您必须在
yourMediaPlayer.pause()
方法和
yourCamera.lock()之前调用
yourCamera.unlock()
yourMediaPlayer.resume()之后的
。我建议你在试捕捉块中隐藏你的摄像头。解锁()和你的摄像头。释放(),这样你就可以/不能锁定/解锁,然后你就不用再做进一步的操作了。@NaveedAhmad,我在等待你的代码,这样我就可以帮你了。我在我的应用程序中用MediaRecorder录制音频时检查摄像头,我只想知道android启动视频时发生的事件,到目前为止我什么也没发现