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?
change the code
to