Android M权限对话框不显示

我目前正在尝试使我的应用程序适应Android M的新权限模型。

我正在收集所有我需要的权限,然后运行

Log.i("Permissions", "Requesting permissions: " + permissions); requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions); 

requiredPermissions拥有我需要的权限像android.permission.WRITE_EXTERNAL_STORAGE

那个例程是肯定执行的,因为我在logcat中有Log行:

 08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE 

但是权限对话框从不显示,更不用说是调用onRequestPermissionsResult()了。

我究竟做错了什么? 基于一些教程,我发现我不会错过任何东西。 我只有模拟器进行testing,没有物理设备。 这是来自设置的关于屏幕: 图像

这可能是值得一提的别的:如果我尝试从主屏幕打开已安装的应用程序的概述,我只得到launcher3 has exited 。 我不确定这可能是相关的。

有没有人知道为什么它没有显示?

我遇到了同样的问题,但后来我意识到我忘记了将清单文件添加到清单文件中。 添加uses-permission标签后,系统显示对话框。 也许帮助某人。

我遇到同样的问题,因为我正在使用负值作为REQUEST_CODE。

 requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1) 

使用正值后,系统显示对话框。 希望它可以帮助别人。

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

在AndroidManifest.xml中

注意:您想获得的权限。 例如:android.permission.ACCESS_FINE_LOCATION等

我只是有同样的问题。 我的问题是我在清单中的错误位置写了许可。 确保使用权限不在应用程序中:

  <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.android.gms.samples.vision.face.photo" android:installLocation="auto" android:versionCode="1" android:versionName="1" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:hardwareAccelerated="true" android:label="FacePhotoDemo" android:allowBackup="true" android:icon="@drawable/icon"> 

我有同样的问题,并添加像这样的shouldShowRequestPermissionRationale问题解决:

 if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { } else { ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); } 

基于Hilal的评论(非常感谢!):在我的情况下,我的应用程序确实使用tabhost,并且从tabhost中的Activity请求权限。 开始一个单独的活动,请求它正在工作的权限。

我花了整整一天的时间来找出是什么原因造成了这个问题。 原来的答案帮助我在这里: https : //stackoverflow.com/a/40775623/3040498

我通过添加tools:remove="android:maxSdkVersion"修复tools:remove="android:maxSdkVersion"像这样:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/> 

我也遇到过在使用<uses-permission-sdk23>元素时权限对话框没有出现或应用程序崩溃的情况,但是原因似乎是当前6.0设备上的系统错误:

https://code.google.com/p/android/issues/detail?id=189841

崩溃exception:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to get length of null array 

我做了所有在上面的答案说,但仍然对话没有显示,然后我把targetSdkVersion中的targetSdkVersion更改为23 ,并出现。 希望这有助于某人

权限按类别组织,因此非关键的权限被授予,而不显示对话框。

我发现这与互联网许可困难的方式,如果你有这个问题,然后改变到一个关键的权限,如read_contacts将允许您testing您的stream量,并揭示问题是权限是非关键或其他。

这里列出了 正常的保护权限

要添加到@ shanraisshan的答案, REQUEST_CODE实际上必须大于0,而不是非负。

在我们的代码中,这是一个简单的拼写错误。

我们有:

 <uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" /> 

它应该是:

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

在search一段时间后,它显示出来需要将compileSdkVersion的值设置为“android-MNC”,或者从现在开始设置为23.这需要Gradle构build系统,这似乎需要Android Studio。 至less我找不到关于如何将其设置在gradle文件之外的单个手册。

 @Override public final void validateRequestPermissionsRequestCode(int requestCode) { // We use 16 bits of the request code to encode the fragment id when // requesting permissions from a fragment. Hence, requestPermissions() // should validate the code against that but we cannot override it as we // can not then call super and also the ActivityCompat would call back to // this override. To handle this we use dependency inversion where we are // the validator of request codes when requesting permissions in // ActivityCompat. if (!mRequestedPermissionsFromFragment && requestCode != -1 && (requestCode & 0xffff0000) != 0) { throw new IllegalArgumentException("Can only use lower 16 bits for requestCode"); } } 

有同样的问题。 后来我意识到,我们必须声明清单中的每一个权限(即使其中一个是另一个的子类)。 在我的情况下,我宣布

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

在我的清单,并试图访问用户的粗略位置。

 ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) 

通过在清单中添加粗略权限来修复问题。

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

在清单中,我改变了

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="22" /> 

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

也许这有帮助。

在清单文件中添加权限也是如此。

将你的targetSdkVersion设置为22

有相同的(我猜)问题和解决scheme正在删除

 import <app package>.Manifest; 

自动导入到文件顶部的Android Studio,并replace它

 import android.Manifest; 

并开始工作

在我的情况下,解决scheme是string本身

android.permission.READ_CONTACTS

我做了Manifest.permission.READ_CONTACTS导致沉默错误(注意显示在屏幕上)。

确保这是正确的

如果你们中的任何人有一个应用程序改变/修改WRITE_SETTINGS并面临这个问题。 查看CommonsWare对WRITE_SETTINGS模糊的回答

我正在面对这个问题2个星期,后来意识到这个问题是由于requestPermissions不能请求WRITE_SETTINGS权限的事实。 希望这有助于:D

在我的情况下,我已经在我的清单文件中请求了“ACCESS_COARSE_LOCATION”,然后在代码中请求“ACCESS_FINE_LOCATION”权限,这就是权限对话框没有打开的原因。

我正在做两个调用requestPermissions(),一个接着一个。 Logcat中出现此错误消息(请注意“请求”上的拼写错误):

 Can reqeust only one set of permissions at a time 

requestPermissions()实际上被devise为一次接受多个请求; 这就是String数组的作用。

将最终的常量值更改为1。

 private static final int REQUEST_PERMISSION_WRITE = 1; ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);