Android 如何检查摄像头是否被任何应用程序打开

Android 如何检查摄像头是否被任何应用程序打开,android,camera,Android,Camera,有没有办法检查摄像机是否打开?我不想打开相机,我只想检查它的状态。您可以使用方法camera.open(cameraId)检查它 创建新的摄影机对象以访问特定的硬件摄影机。如果其他应用程序打开同一个摄像头,这将引发RuntimeException 投掷 运行时异常 如果打开相机失败(例如,如果另一个进程或设备正在使用相机,策略管理器已禁用相机) 更新: 例如: public boolean isCameraUsebyApp() { Camera camera = null; tr

有没有办法检查摄像机是否打开?我不想打开相机,我只想检查它的状态。

您可以使用方法
camera.open(cameraId)
检查它

创建新的摄影机对象以访问特定的硬件摄影机。如果其他应用程序打开同一个摄像头,这将引发RuntimeException

投掷 运行时异常
如果打开相机失败(例如,如果另一个进程或设备正在使用相机,策略管理器已禁用相机)

更新:

例如:

public boolean isCameraUsebyApp() {
    Camera camera = null;
    try {
        camera = Camera.open();
    } catch (RuntimeException e) {
        return true;
    } finally {
        if (camera != null) camera.release();
    }
    return false;
}
您可以按照Paul的建议使用此方法,但请记住,此方法首先获取相机

如果其获取成功,则意味着没有其他应用程序正在使用此相机,请不要忘记再次释放它,否则您将无法再次获取它

它抛出的Its
RuntimeException
表示另一个进程或设备正在使用相机。策略管理器已禁用相机。

查看,最后要将相机与服务连接,确定相机是否正在使用的唯一方法似乎是直接通过
相机::连接的结果(jint)

问题是,这个本机代码只能通过JNI函数
android\u hardware\u Camera\u native\u setup(JNIEnv*,jobject,jobject,jint)
访问,该函数在
new Camera(int)
中从Java创建摄像头实例时设置摄像头

简言之,这似乎是不可能的。您必须尝试打开相机,如果它失败,则假设它正在被其他应用程序使用。例如:

public boolean isCameraInUse() {
    Camera c = null;
    try {
        c = Camera.open();
    } catch (RuntimeException e) {
        return true;
    } finally {
        if (c != null) c.release();
    }
    return false;
}

为了更好地了解摄像头本机代码的基本流程,.

如果您的设备API版本高于21,
CameraManager.AvailabilityCallback
可能是一个不错的选择

您需要首先使用以下代码获取系统的摄像头管理器:

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
然后,您需要注册
AvailabilityCallback

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    manager.registerAvailabilityCallback(new CameraManager.AvailabilityCallback() {
        @Override
        public void onCameraAvailable(String cameraId) {
            super.onCameraAvailable(cameraId);
            //Do your work
        }

        @Override
        public void onCameraUnavailable(String cameraId) {
            super.onCameraUnavailable(cameraId);
            //Do your work
        }
    }, yourHandler);
}
如果API版本高于21,则效果更好

如果API级别低于23,尝试打开摄像头以检查是否引发异常工作正常。在API级别23中,摄像头服务与以前不同,不同于:

对摄像机子系统资源的访问,包括打开和配置摄像机设备,将根据客户端应用程序流程的“优先级”授予。具有用户可见或前台活动的应用程序流程通常具有更高的优先级,从而使摄像机资源的获取和使用更加可靠

当高优先级应用程序尝试使用相机时,低优先级应用程序的活动相机客户端可能会被“逐出”。在不推荐使用的相机API中,这会导致为逐出的客户端调用onError()。在Camera2 API中,这会导致为逐出的客户端调用onDisconnected()

我们可以看到,在API 23或更高版本中,尝试打开其他应用程序/进程使用的摄像头将从正在使用它的应用程序/进程中捕获摄像头,而不是获取
RuntimeException