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的建议使用此方法,但请记住,此方法首先获取相机
如果其获取成功,则意味着没有其他应用程序正在使用此相机,请不要忘记再次释放它,否则您将无法再次获取它
它抛出的ItsRuntimeException
表示另一个进程或设备正在使用相机。策略管理器已禁用相机。查看,最后要将相机与服务连接,确定相机是否正在使用的唯一方法似乎是直接通过相机::连接的结果(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