致命异常:java.lang.IllegalArgumentException:未注册接收者:android.hardware.camera2.CameraManager

时间:2018-09-26 12:58:53

标签: android android-broadcastreceiver android-camera2 illegalargumentexception receiver

我正在开发一个手电筒应用程序,它可以打开/关闭系统辅助功能。

我在Android M(v6.0)上显示的崩溃

  

Crashlytics

以下是“问题”详细信息和堆栈跟踪:

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)

我具有以下Manifest权限和硬件功能:

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.flash" />

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />

****编辑:****

这是我用来访问摄像机的代码:

// 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();
            }
        }

}

以下是打开闪光灯/闪光灯的代码:

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();

 }

以下是关闭相机闪光灯的代码:

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();
            }
 }

startCameraPreview()方法的代码:

private void startCameraPreview() {
    try {
        camera.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

除了窗口小部件提供程序类外,我的应用程序中没有任何接收器,但是我没有任何代码行(注册/注销)接收器!

我搜索并阅读了许多有关此问题的链接资源,但我找不到任何线索来确切了解造成此问题的原因。

任何人都面临这个问题,我们将为您提供帮助。

3 个答案:

答案 0 :(得分:2)

我遇到了相同的问题(或相似的问题)。我的堆栈跟踪与您的完全相同。我已经解决了问题,方法是确保(在我的应用程序的代码中)如果以前我的应用程序未打开割炬,则不要尝试关闭割炬。

当我连续两次致电cameraManager.setTorchMode(cameraId, false)时发生崩溃。

因此,我只在应用程序中维护布尔标志,该标志现在显示了确切的割炬状态。在cameraManager.setTorchMode(cameraId, true)调用之后立即将其设置为true,如果该标志不为true,则不要执行cameraManager.setTorchMode(cameraId, false)。成功完成cameraManager.setTorchMode(cameraId, false)后,将标志设置为false。

希望这对您有帮助...

答案 1 :(得分:1)

Camera.Parameters在API级别21中已弃用。改为使用CameraManager

对于setFlashMode (String value)中的Camera.ParameterssetTorchMode (String cameraId, boolean enabled)中有一个等效方法CameraManager

答案 2 :(得分:0)

我认为这篇文章(When trying turn off camera led, app crash)很有帮助。

简而言之, 如果您尝试再次禁用手电筒(即使已禁用手电筒),则应用程序崩溃了。