如何检查相机是否被任何应用程序打开

时间:2013-04-07 12:56:22

标签: android camera

有没有办法检查相机是否打开?我不想打开相机,我只想检查其状态

3 个答案:

答案 0 :(得分:12)

如果您的设备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,则效果会更好。您可以参考CameraManagerCameraManager.AvailabilityCallbackwhole package

如果API级别低于23,尝试打开相机以检查是否抛出异常。在API级别23中,摄像头服务与以前不同,来自official docs

  

基于客户端应用程序进程的“优先级”,授予对相机子系统资源的访问权限,包括打开和配置相机设备。具有用户可见或前台活动的应用程序流程通常具有更高的优先级,使得相机资源的获取和使用更加可靠。

     

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

我们可以看到,在API 23或更高版本中,尝试打开其他应用/进程使用的相机会从正在使用它的应用/进程抓住相机,而不是获取RuntimeException

答案 1 :(得分:10)

您可以使用方法Camera.open(cameraId)进行检查。

创建一个新的Camera对象以访问特定的硬件摄像头。如果其他应用程序打开了同一个摄像头,则会抛出RuntimeException。

  

抛出   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建议的那样使用这种方法,但要注意这个方法首先要获取相机。

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

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

答案 2 :(得分:2)

查看the source code of Cameraits JNI counterpart,最后the native code将相机与服务连接起来,确定相机是否正在使用的唯一方法是直接通过Camera::connect(jint)的结果。

问题是这个本机代码只能通过JNI函数android_hardware_Camera_native_setup(JNIEnv*, jobject, jobject, jint)访问,该函数设置摄像头,以便在new Camera(int)中从Java创建Camera实例时使用。

简而言之,它似乎不可能。您必须尝试打开相机,如果失败,则认为它正被另一个应用程序使用。 E.g:

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

为了更好地理解相机本机代码的基本流程,see this thread