我目前正在尝试将我的应用程序调整为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
。我不确定这可能是相关的。
有没有人知道它为什么没有显示?
答案 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)将允许您测试您的流量并显示问题是否是非关键的权限或某事其他。
答案 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);