Android M权限对话框未显示

问题描述 投票:60回答:27

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

我究竟做错了什么?基于一些教程,我发现我没有遗漏任何东西。我只有用于测试的模拟器,没有物理设备。这是关于设置的屏幕:Image

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

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

android permissions android-6.0-marshmallow
27个回答
103
投票

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


2
投票

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

我们有:

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

它应该是:

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

1
投票

我做了以上答案中所说的所有事情,但仍然没有显示对话框然后我在gradle中将targetSdkVersion更改为23并且它出现了。希望这有助于某人


1
投票

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

我发现这是通过互联网许可的困难方式,如果您遇到此问题,那么更改为关键权限(例如read_contacts)将允许您测试您的流程并显示问题是否是非关键的权限或其他内容。

Normal protection权限列出here


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's Answer to WRITE_SETTINGS Ambiguity

我面对这个问题已经有两个星期后来才意识到这个问题是因为requestPermissions无法申请WRITE_SETTINGS许可。希望这会有所帮助:D


1
投票

就我而言,我请求的权限(WRITE_SETTINGS)更加特殊,需要启动“设置活动”。因此,对话框没有显示出来。

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

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

1
投票

在请求危险许可时未获得权限对话框的另一个原因...

我不得不做Build - > Clean Project然后Build - > Rebuild Project。我想Android Studio没有了解我在清单中所做的更改。


1
投票

我有一个类似的问题,由清单中的权限常量的错误情况引起,我在小写中使用read_contacts

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

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

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

0
投票

搜索一段时间之后,似乎需要将值compileSdkVersion设置为“android-MNC”或从今天起设置为23.这需要Gradle构建系统,然后似乎需要Android Studio。至少我找不到一本关于如何在gradle文件外设置它的手册。


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

24
投票

我花了一整天时间才找出导致问题的原因。 original answer帮助了我。

我修改了像这样添加tools:remove="android:maxSdkVersion"

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

0
投票

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

<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
投票

同时在清单文件中添加权限。


0
投票

将targetSdkVersion设置为22。


0
投票

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

import <app package>.Manifest;

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

import android.Manifest; 

并开始工作


0
投票

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

android.permission.READ_CONTACTS

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

确保这是正确的


0
投票

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


0
投票

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

Can reqeust only one set of permissions at a time

requestPermissions()实际上是为了一次获取多个请求而设计的;这就是String数组的用途。


-1
投票

将最终常量值更改为1。

private static final int REQUEST_PERMISSION_WRITE = 1;

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

13
投票

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

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

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


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等。


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);

}

2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.