Android - 相机权限被拒绝而没有提示

时间:2017-04-04 16:29:21

标签: android android-camera android-external-storage

我遇到了请求权限的手动过程问题(只是一直陷入'拒绝'代码),所以我转而使用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”。它甚至没有再提示我就否认了它。

我的Manifest已正确设置为将CAMERA放在适当的位置('application'标签之外)。见下文参考:

<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..

奇怪的是,当我进入设置&gt;应用程序&gt; MyApp,Camera选项甚至没有显示在那里。

我认为这不是Dexter的一个问题,因为当我手动设置它时,它基本上做了同样的事情(我确认在查看几个SO帖子之后,它确实在这种情况下正确设置)。 / p>

有关这个问题的任何想法吗?仅供参考 - 我使用的是Galaxy S6,OS 6.0.2。遇到这种情况的其他用户似乎是具有6.0+操作系统的其他设备。提前谢谢!

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

  • Moto X(OS 5.0) - 破碎
  • Nexus 5(OS 7.0) - 正常工作
  • Samsung S6(OS 6.0.1) - 破碎
  • 破碎的Moto X(OS 6.0) - 作品

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

2 个答案:

答案 0 :(得分:11)

这个问题原来是一个第三方图书馆,在他们的文件中有这条线,超越了我们自己的许可:

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

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

答案 1 :(得分:1)

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

  

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

     

然后你需要的是在检查结果为假的情况下请求某个权限,

 function fetchValue(){
   var bill = JSON.parse(localStorage.getItem('bill'));
   var result = document.getElementById('total');


   result.innerHTML='';
    var total=0;
   for(var i=0;i < bill.length;i++){
      var items= bill[i].items;
      var date= bill[i].date;
      var price= bill[i].price;
      total+= parseFloat(price);
 }
 }

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