Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if camera is opened by any application

Tags:

android

camera

Is there any way to check if the camera is open or not? I don't want to open the camera, I just want to check its status.

like image 981
Bhupendra Avatar asked Apr 07 '13 12:04

Bhupendra


People also ask

How do I find out what apps are accessing my camera?

Open your Android's Settings app and go to Privacy, followed by the Permission manager option. There, you'll see all the different types of permissions. For example, tap on the camera option. You'll see a list of all the apps that have permission to access your camera there.

What does it mean when camera is being used by another application?

The message, "Your camera is in use by another application" may appear when you try to video call. If you receive the above message, follow these steps: Quit all applications that are using the FaceTime camera. If you don't know which applications might be using the FaceTime camera, quit all open applications.


1 Answers

If your device API version is higher than 21, CameraManager.AvailabilityCallback might be a good choice.

You need to first obtain the camera manager of the system with the following code:

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

Then, you need to register the 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);
}

This works better if API version is higher than 21. You can refer to CameraManager, CameraManager.AvailabilityCallback, and the whole package

Trying to open the camera to check if exception is thrown works good if API level is lower than 23. In API level 23, camera service is different than before, from the official docs:

Access to camera subsystem resources, including opening and configuring a camera device, is awarded based on the “priority” of the client application process. Application processes with user-visible or foreground activities are generally given a higher-priority, making camera resource acquisition and use more dependable.

Active camera clients for lower priority apps may be “evicted” when a higher priority application attempts to use the camera. In the deprecated Camera API, this results in onError() being called for the evicted client. In the Camera2 API, it results in onDisconnected() being called for the evicted client.

We can see that in API 23 or higher, trying to open the camera used by other app/process will seize the camera from app/process which was using it, instead of getting RuntimeException.

like image 166
Rayliu521 Avatar answered Sep 19 '22 15:09

Rayliu521