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

问题描述 投票:0回答:4

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

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

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

我搜索并阅读了有关此问题的许多链接资源,但我找不到任何线索来准确了解导致此问题的行。

有人遇到过这个问题,感谢您的帮助。

android android-broadcastreceiver android-camera2 illegalargumentexception receiver
4个回答
4
投票

我有同样的问题(或类似的问题)。我的堆栈跟踪与你的完全一样。我通过确保(在我的应用程序的代码中)如果我的应用程序之前没有打开火炬,我不会尝试关闭火炬,从而解决了我的问题。

当我连续调用

cameraManager.setTorchMode(cameraId, false)
两次时发生崩溃。

所以我只是在我的应用程序中维护布尔标志,它显示了目前确切的火炬状态。在

cameraManager.setTorchMode(cameraId, true)
调用后立即将其设置为 true,如果标志不为 true,则不执行
cameraManager.setTorchMode(cameraId, false)
。成功后将标志设置为 false
cameraManager.setTorchMode(cameraId, false)

希望这有帮助...


1
投票

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

对于

setFlashMode (String value)
中的
Camera.Parameters
setTorchMode (String cameraId, boolean enabled)
中存在等效方法
CameraManager


0
投票

我认为这篇文章(当尝试关闭摄像头时,应用程序崩溃)很有帮助。

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


0
投票

已经太晚了,但我认为新手机中有很多摄像头,也许摄像头 0 没有闪光灯,但摄像头 1 有,所以我只是搜索,如果有人仍然有这个问题,我找到了这个解决方案

     // Check if the device has a rear-facing camera
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        // Get the list of camera ids
        String[] cameraIds = cameraManager.getCameraIdList();
        
        // Check each camera for flash availability
        for (String cameraId : cameraIds) {
            CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
            
            // Check if the camera has a flash unit
            Boolean hasFlash = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
            
            if (hasFlash != null && hasFlash) {
                // Flash is available for this camera, you can proceed with accessing and controlling it
                // Your code to interact with the flash
                break; // Exit the loop since we found a camera with flash
            }
        }
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
} else {
    // The device doesn't have a rear-facing camera, handle this situation accordingly
    // For example, disable flash-related features or display a message to the user
}
© www.soinside.com 2019 - 2024. All rights reserved.