Android M权限对话框不显示
我目前正在尝试使我的应用程序适应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()了。
我究竟做错了什么? 基于一些教程,我发现我不会错过任何东西。 我只有模拟器进行testing,没有物理设备。 这是来自设置的关于屏幕: 图像
这可能是值得一提的别的:如果我尝试从主屏幕打开已安装的应用程序的概述,我只得到launcher3 has exited
。 我不确定这可能是相关的。
有没有人知道为什么它没有显示?
我遇到了同样的问题,但后来我意识到我忘记了将清单文件添加到清单文件中。 添加uses-permission标签后,系统显示对话框。 也许帮助某人。
我遇到同样的问题,因为我正在使用负值作为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等
我只是有同样的问题。 我的问题是我在清单中的错误位置写了许可。 确保使用权限不在应用程序中:
<?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">
我有同样的问题,并添加像这样的shouldShowRequestPermissionRationale问题解决:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { } else { ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); }
基于Hilal的评论(非常感谢!):在我的情况下,我的应用程序确实使用tabhost,并且从tabhost中的Activity请求权限。 开始一个单独的活动,请求它正在工作的权限。
我花了整整一天的时间来找出是什么原因造成了这个问题。 原来的答案帮助我在这里: https : //stackoverflow.com/a/40775623/3040498
我通过添加tools:remove="android:maxSdkVersion"
修复tools:remove="android:maxSdkVersion"
像这样:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
我也遇到过在使用<uses-permission-sdk23>
元素时权限对话框没有出现或应用程序崩溃的情况,但是原因似乎是当前6.0设备上的系统错误:
https://code.google.com/p/android/issues/detail?id=189841
崩溃exception:
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
我做了所有在上面的答案说,但仍然对话没有显示,然后我把targetSdkVersion
中的targetSdkVersion更改为23
,并出现。 希望这有助于某人
权限按类别组织,因此非关键的权限被授予,而不显示对话框。
我发现这与互联网许可困难的方式,如果你有这个问题,然后改变到一个关键的权限,如read_contacts将允许您testing您的stream量,并揭示问题是权限是非关键或其他。
这里列出了 正常的保护权限
要添加到@ shanraisshan的答案, REQUEST_CODE
实际上必须大于0,而不是非负。
在我们的代码中,这是一个简单的拼写错误。
我们有:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
它应该是:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
在search一段时间后,它显示出来需要将compileSdkVersion的值设置为“android-MNC”,或者从现在开始设置为23.这需要Gradle构build系统,这似乎需要Android Studio。 至less我找不到关于如何将其设置在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"); } }
有同样的问题。 后来我意识到,我们必须声明清单中的每一个权限(即使其中一个是另一个的子类)。 在我的情况下,我宣布
<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" />
也许这有帮助。
在清单文件中添加权限也是如此。
将你的targetSdkVersion设置为22 。
有相同的(我猜)问题和解决scheme正在删除
import <app package>.Manifest;
自动导入到文件顶部的Android Studio,并replace它
import android.Manifest;
并开始工作
在我的情况下,解决scheme是string本身
android.permission.READ_CONTACTS
我做了Manifest.permission.READ_CONTACTS导致沉默错误(注意显示在屏幕上)。
确保这是正确的
如果你们中的任何人有一个应用程序改变/修改WRITE_SETTINGS
并面临这个问题。 查看CommonsWare对WRITE_SETTINGS模糊的回答
我正在面对这个问题2个星期,后来意识到这个问题是由于requestPermissions
不能请求WRITE_SETTINGS
权限的事实。 希望这有助于:D
在我的情况下,我已经在我的清单文件中请求了“ACCESS_COARSE_LOCATION”,然后在代码中请求“ACCESS_FINE_LOCATION”权限,这就是权限对话框没有打开的原因。
我正在做两个调用requestPermissions(),一个接着一个。 Logcat中出现此错误消息(请注意“请求”上的拼写错误):
Can reqeust only one set of permissions at a time
requestPermissions()实际上被devise为一次接受多个请求; 这就是String数组的作用。
将最终的常量值更改为1。
private static final int REQUEST_PERMISSION_WRITE = 1; ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);