Android M权限对话框未显示

80

我目前正在尝试将我的应用程序适应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()。

我做错了什么?根据我找到的一些教程,我没有漏掉任何东西。我只有模拟器进行测试,没有物理设备。这是来自设置的关于屏幕:图像

也许值得提到的是:如果我尝试从主屏幕打开已安装应用程序的概述,我只会得到launcher3已退出。我不确定这是否可能相关。

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


4
你正在使用的M开发者预览版本是哪个?在v1中,WRITE_EXTERNAL_STORAGE不是dangerous权限,不需要手动请求。但这在v2中发生了改变,现在它像其他dangerous权限(如CAMERA)一样工作。请注意,RECEIVE_BOOT_COMPLETED不是dangerous权限,你不需要在运行时请求它。 - CommonsWare
我有v2。为了测试,我添加了录音记录,现在请求如下: 08-07 13:49:31.647: I/Permissions(1540): 请求权限:android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE; android.permission.RECORD_AUDIO这是我的清单文件: <uses-sdk android:minSdkVersion="MNC" android:targetSdkVersion="MNC" />这是项目属性文件中的内容:target=android-MNC targetSdkVersion=MNC compileSdkVersion=android-MNC我是否漏掉了其他人可能会注意到的东西? - Jens
2
你的清单文件中是否有 <uses-permission> 元素?新的运行时权限模型并没有消除 <uses-permission> 元素的必要性,它只是为了在运行时请求某些权限组的权限而增加了额外的要求。 - CommonsWare
是的,我的清单文件仍然包含所有旧的 uses-permission 元素。 - Jens
我的这个样例应用看起来可以很好地在 MNC v2 上运行。拿你的代码和我的做个对比吧。 - CommonsWare
显示剩余3条评论
29个回答

2

我曾经连续两次调用requestPermissions()函数,紧接着就在Logcat中看到了这个错误信息(请注意“request”一词的拼写错误):

Can reqeust only one set of permissions at a time

requestPermissions()实际上是设计为一次性接收多个请求的;这就是字符串数组的作用。


2

请求危险权限时未显示权限对话框的另一个原因是...

我需要执行Build -> Clean Project,然后再执行Build -> Rebuild Project。我想Android Studio没有注意到我在清单文件中所做的更改。


我浪费了半天时间来找出我的代码有什么问题。非常感谢 :) - hidd

2
补充@shanraisshan的回答,REQUEST_CODE实际上必须大于0,而不仅仅是非负数。

2
在我们的代码中,只是一个简单的拼写错误。
我们原本有这样一段代码:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" /> 

应该是:

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

1
在清单文件中,我修改了以下内容:
 <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="22" />

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

也许这会有所帮助。

1
在清单文件中添加权限。保留HTML格式,不做解释。

1
如果你们中有人有一个可以更改/修改WRITE_SETTINGS的应用程序,并且面临这个问题。请查看CommonsWare's Answer to WRITE_SETTINGS Ambiguity
我遇到了这个问题两周,后来意识到这个问题是由于requestPermissions无法请求WRITE_SETTINGS权限造成的。 希望这可以帮助你:D

1

权限被组织成类别,因此非关键权限将在不显示对话框的情况下授予。

我以互联网权限为例,发现这是一种困难的方式。如果您遇到此问题,则更改为关键权限(例如read_contacts)将允许您测试流程并揭示权限是否为非关键或其他问题。

普通保护 权限列表 在这里


1

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


0

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

<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"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接