Android M权限对话框未显示

时间:2015-08-07 13:06:03

标签: android permissions android-6.0-marshmallow

我目前正在尝试将我的应用程序调整为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。我不确定这可能是相关的。

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

29 个答案:

答案 0 :(得分:102)

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

答案 1 :(得分:23)

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

我通过这样添加tools:remove="android:maxSdkVersion"来修复:

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

答案 2 :(得分:13)

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

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

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

答案 3 :(得分:10)

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

答案 4 :(得分: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">

答案 5 :(得分:9)

添加

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
AndroidManifest.xml中的

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

答案 6 :(得分: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);

}

答案 7 :(得分:2)

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

我们有:

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

应该是:

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

答案 8 :(得分:2)

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

答案 9 :(得分: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

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

我发现这很难获得互联网许可,如果您遇到此问题,那么更改为关键权限(例如read_contacts)将允许您测试您的流量并显示问题是否是非关键的权限或某事其他。

Normal protection权限列在here

答案 12 :(得分:1)

如果你们中的任何人有一个应用程序更改/修改WRITE_SETTINGS并且正面临这个问题。查看CommonsWare's Answer to WRITE_SETTINGS Ambiguity

我在这个问题上遇到了两个星期后来发现这个问题是由于requestPermissions无法申请WRITE_SETTINGS权限。 希望这会有所帮助:D

答案 13 :(得分:1)

在清单中,我改变了

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

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

也许这有帮助。

答案 14 :(得分: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);

答案 15 :(得分:0)

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

Can reqeust only one set of permissions at a time

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

还有另一个原因导致在请求危险的权限时无法显示权限对话框...

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

答案 18 :(得分:0)

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

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

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

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

答案 19 :(得分:0)

我的Android targetSDK版本是28。

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

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

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

android.permission.READ_CONTACTS

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

确保这是正确的

答案 23 :(得分:0)

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

import <app package>.Manifest;

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

import android.Manifest; 

开始工作

答案 24 :(得分:0)

targetSdkVersion 设置为 22

答案 25 :(得分:0)

也可以在清单文件中添加权限。

答案 26 :(得分: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"/>

答案 27 :(得分:0)

http://www.myowncloudserver.com/remote.php/webdav/{MY_FOLDER}

答案 28 :(得分:-1)

将最终常量值更改为1。

private static final int REQUEST_PERMISSION_WRITE = 1;

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