76

我目前正在尝试使我的应用程序适应 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

29 回答 29

118

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

于 2015-11-29T09:25:14.323 回答
30

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

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
于 2017-09-18T05:29:00.203 回答
14

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

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

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

于 2015-12-23T10:16:41.073 回答
10

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

于 2017-02-13T17:16:16.253 回答
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">
于 2016-03-30T14:08:31.187 回答
9

添加

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

在 AndroidManifest.xml 中

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

于 2016-02-03T06:21:14.447 回答
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
于 2015-10-14T16:00:59.800 回答
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);
于 2018-01-26T07:06:58.173 回答
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);

}
于 2016-02-26T09:14:58.923 回答
2

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

我必须做Build -> Clean Project然后Build -> Rebuild Project。我猜 Android Studio 没有注意到我在清单中所做的更改。

于 2018-09-22T19:24:29.287 回答
2

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

于 2016-12-07T13:22:43.677 回答
2

由于清单中权限常量的错误大小写,我遇到了类似的问题,我使用read_contacts的是小写:

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

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

<uses-permission android:name="android.permission.READ_CONTACTS" />
于 2019-03-30T11:04:34.883 回答
2

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

Can reqeust only one set of permissions at a time

requestPermissions() 实际上旨在一次接受多个请求;这就是 String 数组的用途。

于 2017-09-06T10:11:10.550 回答
2

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

我们有:

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

它应该是:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
于 2017-04-07T02:27:06.730 回答
1

在清单文件中添加权限。

于 2016-10-13T07:25:06.047 回答
1

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

于 2017-08-28T08:04:27.193 回答
1

在清单中,我改变了

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

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

也许这有帮助。

于 2016-08-25T19:17:21.487 回答
1

如果你们中的任何人有一个更改/修改WRITE_SETTINGS并面临这个问题的应用程序。查看CommonsWare 对 WRITE_SETTINGS 歧义的回答

我面临这个问题 2 周,后来意识到这个问题是由于请求许可requestPermissions不起作用。WRITE_SETTINGS希望这会有所帮助:D

于 2017-07-19T04:56:47.773 回答
1

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

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

此处列出了正常保护权限

于 2016-03-05T23:40:31.577 回答
0

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

import <app package>.Manifest;

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

import android.Manifest; 

并开始工作

于 2017-01-17T08:41:16.553 回答
0

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

于 2016-02-15T12:54:14.290 回答
0

targetSdkVersion设置为22

于 2016-12-19T22:02:59.843 回答
0

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

于 2020-06-26T10:07:21.867 回答
0

我的 Android targetSDK 版本是 28。

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

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

于 2020-01-29T00:29:13.500 回答
0

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

于 2015-08-18T13:34:25.077 回答
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");
        }
    }
于 2016-04-30T14:00:30.490 回答
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"/>
于 2016-08-18T04:58:36.597 回答
0

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

android.permission.READ_CONTACTS

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

确保这是正确的

于 2017-01-18T20:10:50.943 回答
-1

将最终常量值更改为 1。

private static final int REQUEST_PERMISSION_WRITE = 1;

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);
于 2017-09-08T18:34:18.523 回答