blu*_*are 7 android illegalargumentexception receiver android-broadcastreceiver android-camera2
我正在开发一个手电筒应用程序,可以打开/关闭系统功能。
我遇到了在Android M(v6.0)上显示的崩溃
速溶药
这是问题详细信息和堆栈跟踪:
Fatal Exception: java.lang.IllegalArgumentException: Receiver not registered: android.hardware.camera2.CameraManager$1@49e5f1b
at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:789)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1222)
at android.hardware.camera2.CameraManager$3.run(CameraManager.java:1266)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Run Code Online (Sandbox Code Playgroud)
我具有以下Manifest权限和硬件功能:
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.flash" />
Run Code Online (Sandbox Code Playgroud)
和
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
Run Code Online (Sandbox Code Playgroud)
****编辑:****
这是我用来访问摄像机的代码:
// Here, I am checking if SDK >= M
if (VersionUtils.isMarshmallowOrGreater()) {
cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
if (cameraManager != null) {
try {
cameraId = cameraManager.getCameraIdList()[0];
} catch (CameraAccessException | ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
}
} else {
if (camera == null || camera.getParameters() == null) {
try {
camera = Camera.open();
params = camera.getParameters();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是打开闪光灯/闪光灯的代码:
if (VersionUtils.isMarshmallowOrGreater()) {
try {
cameraManager.setTorchMode(cameraId, true);
} catch (Exception e) {
e.printStackTrace();
}
} else {
if (camera == null || params == null || camera.getParameters() == null) {
getCamera();
return;
}
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
startCameraPreview();
}
Run Code Online (Sandbox Code Playgroud)
另外,这是关闭相机闪光灯的代码:
if (VersionUtils.isMarshmallowOrGreater()) {
try {
cameraManager.setTorchMode(cameraId, false);
} catch (Exception e) {
e.printStackTrace();
}
} else {
if (camera == null || params == null || camera.getParameters() == null) {
return;
}
try {
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
stopCameraPreview();
camera.release();
camera = null;
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
startCameraPreview()方法代码:
private void startCameraPreview() {
try {
camera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
除窗口小部件提供程序类外,我的应用程序中没有任何接收器,但是我没有任何代码行可以执行(注册/注销)接收器!
我搜索并阅读了许多有关此问题的链接资源,但找不到任何线索来确切了解引起此问题的线路。
任何人都面临这个问题,我们将为您提供帮助。
小智 4
我有同样的问题(或类似的问题)。我的堆栈跟踪与你的完全一样。我通过确保(在我的应用程序的代码中)如果我的应用程序之前未打开火炬,我不会尝试关闭火炬,从而解决了我的问题。
当我连续调用cameraManager.setTorchMode(cameraId, false)两次时发生崩溃。
所以我只是在我的应用程序中维护布尔标志,它显示当前的确切火炬状态。调用后立即将其设置为 true ,如果标志不为 true,cameraManager.setTorchMode(cameraId, true)则不执行此操作。cameraManager.setTorchMode(cameraId, false)成功后将标志设置为 false cameraManager.setTorchMode(cameraId, false)。
希望这可以帮助...
| 归档时间: |
|
| 查看次数: |
571 次 |
| 最近记录: |