Android - 相机权限在没有提示的情况下被拒绝

Android - Camera permissions denied without prompting

我 运行 遇到了请求权限背后的手动过程的问题(一直陷入 'denied' 代码),所以我转而使用 Dexter 来简化。我在 onCreate() 中实现了以下代码,并重新安装了该应用程序:

Dexter.withActivity(this)
            .withPermission(Manifest.permission.CAMERA)
            .withListener(new PermissionListener() {
                @Override public void onPermissionGranted(PermissionGrantedResponse response) {
                    Log.d(TAG, "GRANTED!");
                    initCamera();
                }
                @Override public void onPermissionDenied(PermissionDeniedResponse response) {
                    Log.d(TAG, "DENIED!");
                }
                @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                    Log.d(TAG, "PERMISSION RATIONAL SHOULD BE SHOWN!");

                }
            }).check();

它立即落入"DENIED!"日志,它甚至都不提示我。我尝试了这个特定的代码来尝试多个权限(这最终是我需要做的):

Dexter.withActivity(activity)
            .withPermissions(Manifest.permission.CAMERA,
                    Manifest.permission.RECORD_AUDIO,
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .withListener(new MultiplePermissionsListener() {
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport report) {
                    Log.d(TAG, "Accepted: " + report.getGrantedPermissionResponses().size() + " | Denied: " + report.getDeniedPermissionResponses().get(0).getPermissionName());
                }

                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                    Log.d(TAG, "continuing permissions request..");

                    token.continuePermissionRequest();
                }
            })
            .check();

它会提示录制音频的权限,然后会询问设备上 photos/media/files 的访问权限(它从不询问相机)。一旦完成,它会打印日志:"Accepted 3 | Denied: android.permission.CAMERA"。它甚至没有再次提示我就否认了。

我的 Manifest 已正确设置,以便在正确的位置(在 'application' 标签之外)放置 CAMERA。参考如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.app">

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

<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
etc..

奇怪的是,当我进入“设置”>“应用程序”>“我的应用”时,相机选项甚至都没有显示。

我认为这不是 Dexter 的问题,因为当我手动设置它时,它基本上做同样的事情(并且我确认在查看一些顶部后它在这种情况下确实设置正确 S.O. 帖子).

对这里可能出现的问题有什么想法吗?仅供参考 - 我使用的是 Galaxy S6,OS 6.0.2。遇到此问题的其他用户似乎是其他 6.0+ OS 的设备。提前致谢!

编辑: 测试各种设备,它适用于某些设备,但不适用于某些设备:

似乎不​​是一个固定的模式。绝对是 st运行ge。我还启动了一个 b运行d 新项目和 运行 相同的代码 - 工作正常并允许访问我的相机。所以它似乎不是完全特定于设备的..

您需要的是本机运行时权限而不是 dexter,从 Android 6.0(API 级别 23)开始,用户在应用 运行 时向应用授予权限,而不是他们安装应用程序。这种方法简化了应用程序安装过程,因为用户在安装或更新应用程序时不需要授予权限。它还使用户可以更好地控制应用程序的功能;例如,用户可以选择授予相机应用访问相机但不访问设备位置的权限。用户可以随时通过转到应用程序的“设置”屏幕撤销权限。

// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.YOUR_PERMISSION);

then what you need is to request a certain permission if that check is false,

 ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.YOUR_PERMISSION},
            MY_PERMISSION_CODE);

请注意,您还需要根据您已经展示的内容在清单中声明它们。 For more information.

这个问题原来是第三方库,它在他们的清单中有这一行,覆盖了我们自己的许可:

<uses-permission android:name="android.permission.CAMERA" tools:node="remove" />

解决方案是手动将他们的项目作为模块导入(而不是使用 gradle),然后注释掉该行,或者更简单 - 您可以添加 "tools:node="replace""到主项目的 CAMERA 许可行的末尾,之后它工作正常;后一种方法不需要导入项目。