我目前正在尝试将我的应用程序调整为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
。我不确定这可能是相关的。
有没有人知道它为什么没有显示?
我遇到了同样的问题,但后来我意识到我忘了将权限添加到清单文件中。添加uses-permission标记后,系统显示对话框。也许帮助某人。
在我们的代码中,这是一个简单的拼写错误。
我们有:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
它应该是:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
我做了以上答案中所说的所有事情,但仍然没有显示对话框然后我在gradle中将targetSdkVersion
更改为23
并且它出现了。希望这有助于某人
权限按类别进行组织,因此在不显示对话框的情况下授予非关键权限。
我发现这是通过互联网许可的困难方式,如果您遇到此问题,那么更改为关键权限(例如read_contacts)将允许您测试您的流程并显示问题是否是非关键的权限或其他内容。
在清单中,我改变了
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="22" />
至
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
也许这有帮助。
如果你们中的任何人有一个应用程序改变/修改WRITE_SETTINGS
并面临这个问题。看看CommonsWare's Answer to WRITE_SETTINGS Ambiguity
我面对这个问题已经有两个星期后来才意识到这个问题是因为requestPermissions
无法申请WRITE_SETTINGS
许可。希望这会有所帮助:D
就我而言,我请求的权限(WRITE_SETTINGS)更加特殊,需要启动“设置活动”。因此,对话框没有显示出来。
我必须使用以下代码获得其权限:
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然后Build - > Rebuild Project。我想Android Studio没有了解我在清单中所做的更改。
我有一个类似的问题,由清单中的权限常量的错误情况引起,我在小写中使用read_contacts
:
<uses-permission android:name="android.permission.read_contacts" />
将read_contacts
更改为大写后,它开始按预期工作
<uses-permission android:name="android.permission.READ_CONTACTS" />
搜索一段时间之后,似乎需要将值compileSdkVersion设置为“android-MNC”或从今天起设置为23.这需要Gradle构建系统,然后似乎需要Android Studio。至少我找不到一本关于如何在gradle文件外设置它的手册。
@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");
}
}
我花了一整天时间才找出导致问题的原因。 original answer帮助了我。
我修改了像这样添加tools:remove="android:maxSdkVersion"
:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
有同样的问题。后来我意识到我们必须在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"/>
同时在清单文件中添加权限。
将targetSdkVersion设置为22。
有相同的(我猜)问题,解决方案正在删除
import <app package>.Manifest;
由Android Studio在文件顶部自动导入并替换为
import android.Manifest;
并开始工作
在我的情况下,解决方案是字符串本身
android.permission.READ_CONTACTS
我做了Manifest.permission.READ_CONTACTS导致了沉默错误(在屏幕上显示Noting)。
确保这是正确的
在我的情况下,我在清单文件中请求了“ACCESS_COARSE_LOCATION”,然后在代码中请求“ACCESS_FINE_LOCATION”权限,这就是权限对话框未打开的原因。
我正在两次调用requestPermissions(),一个接一个。 Logcat中出现此错误消息(请注意“请求”上的拼写错误):
Can reqeust only one set of permissions at a time
requestPermissions()实际上是为了一次获取多个请求而设计的;这就是String数组的用途。
将最终常量值更改为1。
private static final int REQUEST_PERMISSION_WRITE = 1;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);
我遇到了同样的问题,因为我使用负值作为REQUEST_CODE。
requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)
使用正值后,系统显示对话框。希望它可以帮助某人。
基于Hilal的评论(非常感谢!):在我的情况下,我的应用程序确实使用了tabhost,并且从tabhost中的Activity请求了权限。启动一个请求权限的单独活动后,它正在运行。
我刚遇到同样的问题。我的问题是我在清单中的错误位置写了许可。确保使用权限不在应用程序中:
<?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">
加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在AndroidManifest.xml中
注意:您想要获得的权限。例如:android.permission.ACCESS_FINE_LOCATION等。
我还遇到了这样一种情况:使用<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
我有同样的问题,并在添加如下的shouldShowRequestPermissionRationale后解决了问题:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
要添加到@ shanraisshan的答案,REQUEST_CODE
实际上必须大于0,而不仅仅是非负数。