首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >致命异常: java.lang.IllegalArgumentException:接收器未注册: android.hardware.camera2.CameraManager

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

Stack Overflow用户
提问于 2018-09-26 20:58:53
回答 3查看 1.3K关注 0票数 8

我正在开发一个手电筒应用程序,打开/关闭系统电波。

我有一个崩溃,显示在Android M (v6.0)上

崩溃分析

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

代码语言:javascript
复制
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权限和硬件功能:

代码语言:javascript
复制
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.flash" />

代码语言:javascript
复制
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />

*编辑:*

下面是我用来访问摄像头的代码:

代码语言:javascript
复制
// 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();
            }
        }

}

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

代码语言:javascript
复制
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();

 }

另外,下面是关闭相机闪光灯的代码:

代码语言:javascript
复制
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()方法代码:

代码语言:javascript
复制
private void startCameraPreview() {
    try {
        camera.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

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

我搜索并阅读了许多关于这个问题的链接资源,但我找不到任何线索来准确地知道导致这个问题的原因。

任何遇到这个问题的人,我们都很感谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-03 03:43:33

我遇到了同样的问题(或类似的问题)。我的堆栈跟踪和你的一样。我已经解决了我的问题,确保(在我的应用程序的代码中)如果我的应用程序之前没有打开torch,我不会尝试关闭torch。

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

所以我只是在我的应用程序中维护了boolean标志,它显示了火炬当前的确切状态。在cameraManager.setTorchMode(cameraId, true)调用之后立即将其设置为true,如果标志不为true,则不要执行cameraManager.setTorchMode(cameraId, false)。在cameraManager.setTorchMode(cameraId, false)成功后,将标志设置为false。

希望这能帮到你。

票数 4
EN

Stack Overflow用户

发布于 2018-09-30 14:03:47

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-09-28 14:36:28

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

简而言之,如果你再次尝试禁用手电筒(即使手电筒已经被禁用),那么应用程序就会崩溃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52518329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档