setTorchMode-IllegalArgumentException

141 views Asked by At

I am getting this crash in firebase from a flashlight app.

Fatal Exception: java.lang.IllegalArgumentException: setTorchMode:2297: Camera ID "0" is a not valid camera ID
       at android.hardware.camera2.CameraManager.throwAsPublicException(CameraManager.java:1332)
       at android.hardware.camera2.CameraManager$CameraManagerGlobal.setTorchMode(CameraManager.java:1886)
       at android.hardware.camera2.CameraManager.setTorchMode(CameraManager.java:943)
       at AccService2.onSensorChanged(AccService2.java:197)
       at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:1004)
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:335)
       at android.os.Looper.loop(Looper.java:206)
       at android.app.ActivityThread.main(ActivityThread.java:8653)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

and

Fatal Exception: java.lang.IllegalArgumentException: setTorchMode:2721: Camera "1" does not have a flash unit
       at android.hardware.camera2.CameraManager.throwAsPublicException(CameraManager.java:1723)
       at android.hardware.camera2.CameraManager$CameraManagerGlobal.setTorchMode(CameraManager.java:2318)
       at android.hardware.camera2.CameraManager.setTorchMode(CameraManager.java:1211)
       at AccService2.onSensorChanged(AccService2.java:197)
       at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:991)
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:335)
       at android.os.Looper.loopOnce(Looper.java:186)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8757)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)

this is the code

            sCameraId = MAcamID.getFirstCameraIdFacing(camManager,null);

                    if (Flash_Available) {
                        String Cam_id=sCameraId;
                        if (Cam_id != null) {
                            try {
                                camManager.setTorchMode(Cam_id, !flashState);

                            } catch (CameraAccessException e) {
                                Log.e("TAG", "settorchmode Excep", e);
                            }
                        }

                     
                    }

and in this class i'm checking the camera id list to get the id of the back camera and check if it has a flash unit

public class CamId {

    public String getFirstCameraIdFacing(CameraManager cameraManager, @Nullable Integer facing) {
        if (facing == null) facing = CameraMetadata.LENS_FACING_BACK;
        String cameraId = null;
        try {
            // Get a list of all compatible cameras
            String[] cameraIdList = cameraManager.getCameraIdList();

            // Iterate over the list of cameras and return the first one matching desired
            // lens-facing configuration and backward compatibility
            for (String id : cameraIdList) {
                CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(id);

                if ( characteristics.get(CameraCharacteristics.LENS_FACING).equals(facing) &&
                        characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
                        cameraId = id;
                        break;
                    }

            }

            // If no camera matches the desired orientation, return the first one from the
            if(cameraId == null && cameraIdList.length>0) {
                cameraId = cameraIdList[0];

            }
        } catch (CameraAccessException e) {
            Log.e("CameraId ex", "getFirstCameraIdFacing: " + e.getMessage());
        }

        return cameraId;
    }

}

and i'm checking the avalablity of the flashlight this callback

public void callBack(){

        torchCallback = new CameraManager.TorchCallback() {
            @Override
            public void onTorchModeUnavailable(@NonNull String cameraId) {
                super.onTorchModeUnavailable(cameraId);
                    Flash_Available = false;

            }


            @Override
            public void onTorchModeChanged(@NonNull String cameraId, boolean enabled) {
                super.onTorchModeChanged(cameraId, enabled);
                flashState = enabled;
                    Flash_Available = true;
            }

        };
        camManager.registerTorchCallback(torchCallback, null);

    }

This crash happens for a few users but with a lot of event count, in the code i made sure to check for a valid camera id and if it has a flash unit before calling setTorchMode how this crash still happens?

1

There are 1 answers

0
Amer Al  Munajjed On

change the code

String[] cameraIdList = cameraManager.getCameraIdList();

to

String cameraIdList = cameraManager.getCameraIdList()[0];