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

Posted

技术标签:

【中文标题】Android - 在没有提示的情况下拒绝相机权限【英文标题】:Android - Camera permissions denied without prompting 【发布时间】:2017-08-29 23:35:59 【问题描述】:

我在请求权限背后的手动过程中遇到了问题(只是一直陷入“拒绝”代码),所以我改用 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();

它立即陷入“拒绝!”登录,它甚至从不提示我。我尝试了这个特定的代码来尝试多个权限(这最终是我需要做的):

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

它会提示您授予录制音频的权限,然后询问是否可以访问设备上的照片/媒体/文件(它从不询问相机)。然后一旦完成,它会打印日志:“Accepted 3 | Denied: android.permission.CAMERA”。它甚至没有再次提示我就否认了。

我的清单已正确设置,以便将 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 的问题,因为当我手动设置它时,它的作用基本相同(在查看了一些*** SO 帖子后,我确认在这种情况下它肯定设置正确)。

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

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

Moto X (OS 5.0) - 坏了 Nexus 5 (OS 7.0) - 工作 三星 S6 (OS 6.0.1) - 坏了 损坏的 Moto X (OS 6.0) - 工作

似乎不是一个固定的模式.. 绝对奇怪。我还开始了一个全新的项目并运行相同的代码 - 工作正常并允许访问我的相机。所以它似乎不是完全特定于设备的..

【问题讨论】:

您是否卸载了该应用并尝试过? 是的,我已经尝试卸载/重新安装应用程序,重新启动设备等。问题仍然存在。 :( 【参考方案1】:

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

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

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

【讨论】:

第三方是指 Dexter 还是其他库? 导致此问题的库实际上是 Kite.ly。 github.com/OceanLabs/Android-Print-SDK【参考方案2】:

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

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

那么,如果该检查为假,您需要请求某个权限,

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

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

【讨论】:

感谢您的回复,但是是的,我最初按照您指定的方式进行了设置,但问题仍然存在,与 Dexter 的情况完全相同。此外,我看到 Dexter 库经常更新,在他们的文档中我没有看到它不支持 6.0+。因此,如果它不支持它,我会感到惊讶。我使用它的方式不是在应用启动时;我在活动启动时使用它,它的处理方式与手动操作相同。另外,请在我的帖子中查看详细信息 - 相机权限甚至不是“设置”中的选项。想法? 在您的问题中发布您的完整错误,以便进行进一步分析。\ 对不起,我不确定还能发布什么?没有错误;它只是返回相机的拒绝状态,而不是其他权限。它为 Dexter 和手动执行此操作。让我知道我是否可以发布任何其他信息。除了我发布的内容,我不知道还有什么要分享的。 您之前说过您使用的是运行时权限,通常它会为任何给定的错误提供详细的错误消息。 您提出的一个关键点是,此错误仅在 api 级别 >= 6.0+ 的设备上持续存在,因此它是运行时权限,我遇到了同样的问题。某处可能还有另一个错误。

以上是关于Android - 在没有提示的情况下拒绝相机权限的主要内容,如果未能解决你的问题,请参考以下文章

Android“权限拒绝:无法使用相机”

Android 打开相机权限被拒绝

NR - iOS / Android 相机/相册/日历/定位 等权限 检测+申请代码

NR - iOS / Android 相机/相册/日历/定位 等权限 检测+申请代码

NR - iOS / Android 相机/相册/日历/定位 等权限 检测+申请代码

Android\iOS 相机权限 - 移动用户无响应