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个回答

124

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


13
浪费了将近两个小时才发现(在清单文件中是"coarse_location",但代码中应该是"fine_location")... - Alexandru Circus
同样的问题...谢谢! - Silas
3
太棒了!这就是快速开发时容易出现的问题!你会忽略背后的基础细节。谢谢! - Guillem Roca
2
但是它没有被修复,因为我还使用了tabhost,当您想显示权限对话框时,这也可能是问题,在这篇帖子中找到 - Hilal
请确保大小写相同。在安装时,Android会愉快地进行大小写转换以检查权限,但在将请求的权限与您的清单进行比较时,它不会这样做。 - AI0867
显示剩余3条评论

32

原始答案 对我很有帮助。

我通过像这样添加 tools:remove="android:maxSdkVersion" 来解决问题:

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

这解决了我的权限被拒绝的运行时问题。 - Joules

14

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

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

使用正数后,系统显示了对话框。希望它能帮助某些人。


这就是解决方案。非常奇怪,负数会导致Android以如此微妙和令人恼火的方式失败。 - aroth
谢谢!这正是我的情况,因为我不想参加回调。 - jevora
你救了我的命。 - YON

10
根据Hilal的评论(非常感谢!): 在我的情况下,我的应用确实使用了tabhost,并且权限是从tabhost内部的一个Activity中请求的。在启动一个单独的Activity来请求权限后,它就可以正常工作了。

9

添加

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

在AndroidManifest.xml文件中

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


这是我的问题。不要被官方文档所告诉的设置maxSdk值所迷惑。:( - althaus

9
我遇到了相同的问题。 我的问题是我在清单文件中将权限写错了位置。 请确保使用权限位于application之外:
    <?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">

2

在我的情况下,我所请求的权限(WRITE_SETTINGS)更为特殊,需要启动设置活动。因此,对话框没有显示出来。

我必须使用以下代码获取其权限:

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);

WRITE_SETTINGS 被视为一种 _特殊权限_,需要特殊处理:https://developer.android.com/guide/topics/permissions/overview#special_permissions - ccpizza

2

我遇到了同样的问题,后来通过添加shouldShowRequestPermissionRationale就解决了:

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
        Manifest.permission.READ_CONTACTS)) {

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

}

2
这不会改变任何事情。 - Chad Bingham

2

我曾经遇到一种情况,当使用<uses-permission-sdk23>元素时,权限对话框不会出现或应用程序崩溃,然而这个问题似乎是当前6.0设备上的系统漏洞引起的:

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

崩溃异常:

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

2
我曾遇到类似的问题,是因为在清单文件中权限常量大小写错误。我使用了小写的read_contacts。"最初的回答"
<uses-permission android:name="android.permission.read_contacts" />

read_contacts更改为大写后,它按预期工作。

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

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