相机错误“无法连接到相机”或某些手机中出现错误“相机正在使用其他应用”

问题描述 投票:8回答:2

我已经实现了使用Android MediaRecorder在后台录制音频,如果录音正在进行中并且用户打开了原生相机来录制视频,它给出了

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

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

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

enter image description here

如果我停止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>

在捕获图片或视频并将其保存在目录中时触发NEW_VIDEO和NEW_PICTURE事件。任何人都知道如何解决这个问题?我希望在我的应用程序中知道Native / Camera Apps要录制视频时的事件。提前致谢

android camera android-camera video-capture mediarecorder
2个回答
0
投票

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

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

0
投票

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 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 */ }
        }

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

注意:在其他应用程序使用您的相机硬件之前,它们是由他们有目的地使用。因此,在这些应用程序不能释放您的硬件之前,您无法使用它,这很明显。你无法知道这些应用程序是否真的需要相机。我们相信流程可以在需要时保留硬件。

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

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(),这实际上是你从相机listener得到的Observer

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

如果相机在后台被其他应用程序使用,则意味着,那些其他应用程序有点儿错误,因为相机需要前景预览;即使完成相机,它们也不会释放相机。没有人在背景中使用相机。即使在这种情况下,也不应该强行杀死相机进程,因为内存泄漏可能会发生。因为您不知道其他进程如何使用相机。

© www.soinside.com 2019 - 2024. All rights reserved.