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

0
@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");
        }
    }

0

经过一段时间的搜索,似乎需要将compileSdkVersion的值设置为"android-MNC"或者今天的版本23。这需要Gradle构建系统,而Gradle构建系统似乎需要Android Studio。 至少我没有找到任何关于如何在gradle文件之外设置它的手册。


我也遇到了同样的问题,但还没有解决。阅读你的回答并没有真正帮助我解决它。你能否再解释一下?我的compileSdkVersion仍然是23,但我仍然遇到这个错误。 - SudoPlz
我也是。你的回答毫无价值,因为在23以下没有运行时权限。 - Evgeniy Mishustin
为什么这没什么价值?我只是说,如果使用Eclipse,似乎无法实现这一点。 - Jens

0
我按照上面回答中的所有方法都尝试了,但仍然无法显示对话框。后来,我在 gradle 中将 targetSdkVersion 更改为 23,然后它就出现了。希望这可以帮到别人。

0
在我的情况下,解决方案就是字符串本身。

android.permission.READ_CONTACTS

我执行了 Manifest.permission.READ_CONTACTS,导致出现静默错误(屏幕上没有任何显示)。

请确保这是正确的。


Manifest.permission.READ_CONTACTS = "android.permission.READ_CONTACTS" 清单文件.权限.读取联系人 = "android.permission.READ_CONTACTS" - M. Usman Khan

0

将您的targetSdkVersion设置为22


0
我正在通过代码请求权限,但是错过了在清单中添加<uses-permission ..>标记!

0

我的Android目标SDK版本是28。

我没有看到任何弹出窗口向用户请求权限,这些权限在android Manifest.xml中列出。 在安装期间,使用USB安装.apk和从Google Play商店安装应用程序时都是如此。 因此,我在我的活动中添加了以下代码,它将在运行时请求用户权限

ActivityCompat.requestPermissions(MyActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1);


0

我遇到了相同的问题,解决方法是删除

import <app package>.Manifest;

这是由Android Studio自动导入的文件头部内容,请将其替换为

import android.Manifest; 

并开始工作


-1
将最终常量值更改为1。
private static final int REQUEST_PERMISSION_WRITE = 1;

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);

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