Android M权限对话框未显示


74

我目前正在尝试使我的应用程序适应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 has exited。我不确定是否可能相关。

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


4
您正在使用哪个版本的M Developer Preview?在v1中,WRITE_EXTERNAL_STORAGE不是dangerous,不需要手动请求。在v2中发生了变化,在v2中它的工作方式与其他dangerous权限类似CAMERA。请注意,这RECEIVE_BOOT_COMPLETED不是dangerous许可;您不必在运行时请求它。
CommonsWare 2015年

我有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” />这是来自project.properties文件:target = android-MNC targetSdkVersion = MNC compileSdkVersion = android-MNC我是否缺少对他人显而易见的任何东西?
詹斯(Jens)

2
<uses-permission>清单中是否包含元素?新的运行时权限模型不会消除对<uses-permission>元素的需求。它只是增加了在运行时为选择权限组请求权限的其他要求。
CommonsWare 2015年

是的,我的清单仍然包含所有旧的使用权限要素。
詹斯

好吧,我的这个示例应用程序似乎可以在MNC v2上正常工作。将您拥有的与我拥有的进行比较和对比。
CommonsWare 2015年

Answers:


113

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


13
pfff.wasted将近2个小时,直到这篇文章(清单中的代码是fine_location中的清单中的coarse_location)....
Alexandru Circus

同样在这里...谢谢!
Silas

3
太棒了!快速开发就是问题所在!您会错过基本知识。谢谢!
Guillem Roca

有趣,我要么=))
希拉勒

2
但这并没有解决,因为我也使用了tabhost,当您想显示permissin对话框时,
Hilal

29

我花了整整一天的时间才找出造成问题的原因。在原来的答案帮助了我。

我通过添加tools:remove="android:maxSdkVersion"如下内容进行修复:

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

这解决了运行时拒绝权限的问题。
焦耳

14

我遇到了同样的问题,因为我将负值用作REQUEST_CODE。

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

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


这就是解决方案。绝对奇怪的是,负数会导致Android如此微妙而令人发指的失败。
aroth's

谢谢!,这是我的情况,因为我不想参加回电
jevora

您救了我的命
YON

10

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


9

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

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

9

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

在AndroidManifest.xml中

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


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

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

我有同样的问题,添加了shouldShowRequestPermissionRationale之后,问题就解决了:

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

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

}

1
这不会改变任何东西
Chad Bingham

2

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


2

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

我们有:

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

它应该是:

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

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被视为特殊许可,并且需要特殊处理:developer.android.com/guide/topics/permissions/…–
ccpizza

2

请求危险权限时,没有显示权限对话框的另一个原因...

我必须先执行Build-> Clean Project,然后执行Build-> Rebuild Project。我想Android Studio不会接受我在清单中所做的更改。


我浪费了半天时间才弄清楚我的代码出了什么问题。非常感谢:)
隐藏

2

我有一个类似的问题,是由于清单中的权限常量大小写错误,我使用的read_contacts是小写字母:

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

更改read_contacts为大写字母后,它按预期开始工作

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

1

我按照上面的答案做了所有的事情,但是仍然没有显示对话框,然后我更改targetSdkVersion23gradle并出现了。希望这可以帮助某人


1

权限按类别进行组织,因此在不显示对话框的情况下授予了非关键权限。

我发现很难使用Internet权限,如果您遇到此问题,则更改为read_contacts之类的关键权限将使您能够测试流程,并揭示问题是非关键权限还是其他问题。

此处列出常规保护权限


1

在清单中,我改变了

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

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

也许有帮助。



1

如果你们中任何人的应用程序都已更改/修改WRITE_SETTINGS并且正面临此问题。查看CommonsWare对WRITE_SETTINGS歧义的答案

我面对此问题已有两个星期,后来意识到该问题是由于requestPermissions无法申请WRITE_SETTINGS许可而导致的。希望这会有所帮助:D



1

我在对requestPermissions()进行了两次调用,一次是一次调用。此错误消息出现在Logcat中(请注意“ request”上的拼写错误):

Can reqeust only one set of permissions at a time

requestPermissions()实际上设计为一次处理多个请求。这就是String数组的用途。


0

搜索了一会儿之后,需要将compileSdkVersion值设置为“ android-MNC”,或者从今天开始将其设置为23。这需要Gradle构建系统,然后似乎需要Android Studio。至少我找不到有关如何在gradle文件中进行设置的手册。


我有相同的问题,但尚未设法解决。阅读您的答案并不能真正解决问题吗?您能再说明一点吗?我的compileSdkVersion过去是,现在仍然是23,但仍然出现此错误。
SudoPlz 2015年

我也是。您的答案毫无价值,因为低于23的用户没有运行时权限。
Evgeniy Mishustin

为什么它一文不值?我只是说,如果使用Eclipse似乎无法实现这一目标。
詹斯

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

有同样的问题。后来我意识到我们必须在清单中声明每个许可(即使一个许可是另一个许可的子类)。就我而言

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


0

有相同的(我猜)问题,解决方案正在删除

import <app package>.Manifest;

由Android Studio自动导入文件顶部,并替换为

import android.Manifest; 

并开始工作


0

就我而言,解决方案是字符串本身

android.permission.READ_CONTACTS

我做了Manifest.permission.READ_CONTACTS,这导致静音错误(注意在屏幕上显示)。

确保这是正确的


Manifest.permission.READ_CONTACTS =“ android.permission.READ_CONTACTS”
M. Usman Khan,

0

我的Android targetSDK版本是28。

我没有看到显示给用户请求权限的弹出窗口,这些弹出窗口在android Manifest.xml中列为。在这两种安装过程中,请使用USB安装.apk并从Google Play商店安装应用。所以我在活动中添加了以下代码,它将在运行时询问用户权限

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


0

我正在通过代码请求许可,但是错过了<uses-permission ..>在清单中添加标签!


-1

将最终常数更改为1。

private static final int REQUEST_PERMISSION_WRITE = 1;

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.