未显示 Android M 权限对话框

我目前正在尝试使我的应用程序适应 Android M 的新权限模型。

我正在收集所有我需要的权限,然后运行

Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);

拥有我需要的权限,如 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

但是权限对话框从未显示,更不用说调用 onRequestPermisonsResult ()了。

我做错了什么? 根据一些教程,我发现我没有遗漏任何东西。 我只有用于测试的模拟器,没有物理设备: 形象

还有一点值得一提: 如果我试图从主屏幕打开已安装应用程序的概览,我只能看到 launcher3 has exited。我不确定这是否有关联。

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

59096 次浏览

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

我也遇到过这样的情况,当使用 <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

我也遇到过同样的问题,但是后来我意识到我忘记向清单文件添加权限了。在添加了使用权限标记之后,系统显示了对话框。也许能帮到别人。

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

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

使用正值后,系统显示对话框。 希望能帮到别人。

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

在 AndroidManifest.xml 中

注意: 您希望获得的权限。例如: android.Permission. ACCESS _ FINE _ LOCATION 等。

我做了所有的事情在上面的答案说,但仍然对话框没有显示,然后我改变了 targetSdkVersion23在年级和它出现。希望这对谁有帮助

我也有同样的问题,在添加了 should ShowRequestPermisonRationale 之后,问题得到了解决,如下所示:

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


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


}

权限被组织成类别,所以非关键的权限被授予,而不显示对话框。

我发现互联网许可很难做到这一点,如果你有这个问题,那么改变到一个关键的许可,如 read _ contact 将允许你测试你的流程,并揭示问题是否是非关键的许可或其他东西。

这里列出了普通保护权限

我也有同样的问题。 我的问题是我把许可写错了地方。 确保使用权限在申请范围之外:

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

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

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

在货单上,我变了

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

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

也许这会有帮助。

在清单文件中添加权限。

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

TargetSdkVersion设置为 22

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

import <app package>.Manifest;

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

import android.Manifest;

然后开始工作

在我的例子中,解决方案是字符串本身

Permission. READ _ CONTACTS

我做了 Manifest.permission. READ _ CONTACTS,它导致了静默错误(注意屏幕上显示的内容)。

确保这是正确的

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

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

我们有:

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

它应该是:

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

如果你们中的任何人有一个改变/修改 WRITE_SETTINGS的应用程序,并且正面临这个问题,请查看 CommonsWare 对 WRITE _ SETTings 歧义的回答

我面对这个问题2个星期,后来意识到这个问题是由于事实上,requestPermissions不工作,请求 WRITE_SETTINGS许可。 希望这个对你有帮助: D

在我的例子中,我在清单文件中请求“ ACCESS _ COARSE _ LOCATION”,然后在代码中请求“ ACCESS _ FINE _ LOCATION”权限,这就是为什么权限对话框没有打开的原因。

我打了两个请求 Permission ()的电话,一个接一个。此错误消息出现在 Logcat (请注意“ request”的拼写错误) :

Can reqeust only one set of permissions at a time

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

将最终常量值更改为1。

private static final int REQUEST_PERMISSION_WRITE = 1;


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

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

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

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

在我的例子中,我请求的权限(WRITE _ SETTING)更加特殊,需要设置活动来启动。所以对话框没有出现。

我必须使用以下代码获得它的许可:

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

在请求危险的许可时没有显示许可对话框的另一个原因是..。

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

我有一个类似的问题,由于清单中的许可常数大小写错误,我使用的是小写的 read_contacts:

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

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

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

我的 Android targetSDK 版本是28。

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

请求权限(MyActivity.this, New String []{ Manifest.permission. READ _ PHONE _ STATE } ,1) ;

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