Android M 权限对话框未显示
Posted
技术标签:
【中文标题】Android M 权限对话框未显示【英文标题】:Android M permission dialog not showing 【发布时间】:2015-10-30 22:39:23 【问题描述】:我目前正在尝试使我的应用程序适应 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
。我不确定这是否相关。
有人知道为什么它没有显示吗?
【问题讨论】:
您使用的是哪个版本的 M 开发者预览版?在 v1 中,WRITE_EXTERNAL_STORAGE
不是 dangerous
,不需要手动请求。这在 v2 中发生了变化,它与其他 dangerous
权限(如 CAMERA
)一样工作。注意RECEIVE_BOOT_COMPLETED
不是dangerous
权限;您不必在运行时请求它。
我有 v2。为了测试,我添加了现在请求的录制音频:08-07 13:49:31.647: I/Permissions(1540): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE; android.permission.RECORD_AUDIO 这是来自我的清单:<uses-permission>
元素吗?新的运行时权限模型并没有消除对 <uses-permission>
元素的需求。它只是增加了在运行时为选定权限组请求权限的额外要求。
是的,我的清单仍然包含所有旧的使用许可元素。
好吧,this sample app of mine 似乎在 MNC v2 上运行良好。比较和对比你所拥有的和我所拥有的。
【参考方案1】:
我遇到了同样的问题,但后来我意识到我忘记将权限添加到清单文件。添加uses-permission标签后,系统显示对话框。也许可以帮助某人。
【讨论】:
pfff.wasted 将近 2 小时,直到这篇文章(在清单中是代码fine_location 中的粗略位置)...... 这里也一样...谢谢! 太棒了!这就是快速发展时的问题!你错过了背后的基本东西。谢谢! 有趣,我也是=)) 但它没有修复,因为我也使用了 tabhost,当你想显示许可对话框时,这可能也是问题,found this post【参考方案2】:我花了一整天的时间才找出导致问题的原因。 original answer 帮助了我。
我通过像这样添加tools:remove="android:maxSdkVersion"
来修复:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
【讨论】:
这解决了我在运行时拒绝权限的问题。【参考方案3】:我遇到了同样的问题,因为我使用负值作为 REQUEST_CODE。
requestPermissions(new String[]android.Manifest.permission.CAMERA, -1)
使用正值后,系统显示对话框。 希望它可以帮助某人。
【讨论】:
这就是解决方案。绝对奇怪的是,负数会导致 Android 以如此微妙和令人愤怒的方式失败。 谢谢!这是我的情况,因为我不想参加回调 你救了我的命【参考方案4】:根据 Hilal 的评论(非常感谢!): 在我的情况下,我的应用程序确实在使用 tabhost,并且权限是从 tabhost 内的 Activity 请求的。在启动一个单独的活动来请求它正在工作的权限之后。
【讨论】:
【参考方案5】:我也遇到了同样的问题。 我的问题是我在清单中的错误位置写了许可。 确保使用权限在应用程序之外:
<?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">
【讨论】:
【参考方案6】:添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在 AndroidManifest.xml 中
注意:您想要获得的权限。例如:android.permission.ACCESS_FINE_LOCATION 等。
【讨论】:
这是我的问题。不要被官方文档告诉您设置 maxSdk 值所迷惑。 :(【参考方案7】:我也遇到过使用<uses-permission-sdk23>
元素时权限对话框不出现或应用程序崩溃的情况,但原因似乎是当前 6.0 设备上的系统错误:
https://code.google.com/p/android/issues/detail?id=189841
崩溃异常:
java.lang.RuntimeException: Unable to start activity ComponentInfocom.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity: java.lang.NullPointerException: Attempt to get length of null array
【讨论】:
【参考方案8】:我有同样的问题,添加 shouldShowRequestPermissionRationale 后问题解决了,如下所示:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS))
else
ActivityCompat.requestPermissions(thisActivity,
new String[]Manifest.permission.READ_CONTACTS,
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
【讨论】:
这不会改变任何事情【参考方案9】:要添加到@shanraisshan 的答案,REQUEST_CODE
实际上必须大于 0,而不仅仅是非负数。
【讨论】:
【参考方案10】:在我们的代码中,这是一个简单的拼写错误。
我们有:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
应该是:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
【讨论】:
【参考方案11】:我正在对 requestPermissions() 进行两次调用,一个接一个。这个错误信息出现在 Logcat 中(注意“request”的拼写错误):
Can reqeust only one set of permissions at a time
requestPermissions() 实际上是为了一次接受多个请求而设计的;这就是 String 数组的用途。
【讨论】:
【参考方案12】:就我而言,我请求的权限 (WRITE_SETTINGS) 更为特殊,需要设置活动才能启动。所以对话框没有出现。
我必须使用以下代码获得它的许可:
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
【讨论】:
WRITE_SETTINGS
被视为特殊权限,需要特殊处理:developer.android.com/guide/topics/permissions/…【参考方案13】:
请求危险权限时未显示权限对话框的另一个原因...
我必须执行 Build -> Clean Project,然后 Build -> Rebuild Project。我猜 Android Studio 没有注意到我在清单中所做的更改。
【讨论】:
我浪费了半天时间来弄清楚我的代码出了什么问题。非常感谢:)【参考方案14】:由于清单中权限常量的大小写错误,我遇到了类似的问题,我使用的是小写的read_contacts
:
<uses-permission android:name="android.permission.read_contacts" />
将read_contacts
更改为大写后,它开始按预期工作
<uses-permission android:name="android.permission.READ_CONTACTS" />
【讨论】:
【参考方案15】:权限被组织成类别,因此在不显示对话框的情况下授予非关键权限。
我发现这对于 Internet 权限来说很困难,如果您遇到此问题,那么更改为关键权限(例如 read_contacts)将允许您测试您的流程并揭示问题是权限是非关键还是其他问题别的。
Normal protection 权限列出here
【讨论】:
【参考方案16】:在清单中,我改变了
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="22" />
到
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
也许有帮助。
【讨论】:
【参考方案17】:也在清单文件中添加权限。
【讨论】:
【参考方案18】:如果你们中的任何人有一个更改/修改WRITE_SETTINGS
的应用程序并面临这个问题。查看CommonsWare's Answer to WRITE_SETTINGS Ambiguity
我遇到这个问题 2 周,后来意识到这个问题是由于 requestPermissions
不适用于请求 WRITE_SETTINGS
权限。
希望这会有所帮助:D
【讨论】:
【参考方案19】:在我的例子中,我在清单文件中请求了“ACCESS_COARSE_LOCATION”,然后在代码中请求“ACCESS_FINE_LOCATION”权限,这就是权限对话框没有打开的原因。
【讨论】:
【参考方案20】:搜索了一段时间后,似乎需要将值 compileSdkVersion 设置为“android-MNC”或从今天开始设置为 23。这需要 Gradle 构建系统,然后似乎需要 Android Studio。 至少我找不到一本关于如何在 gradle 文件之外设置它的手册。
【讨论】:
我有同样的问题,但还没有设法解决它。阅读您的答案并不能真正帮助我解决问题吗?你能再澄清一点吗?我的 compileSdkVersion 过去和现在都是 23,我仍然收到此错误。 我也是。你的回答一文不值,因为低于 23 没有运行时权限。 为什么一文不值?我只是说如果使用 Eclipse 似乎无法实现这一点。【参考方案21】:我做了上面答案中所说的所有事情,但仍然没有显示对话框,然后我在 gradle 中将 targetSdkVersion
更改为 23
并出现了。希望这可以帮助某人
【讨论】:
【参考方案22】:@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");
【讨论】:
【参考方案23】:有同样的问题。后来我意识到我们必须在清单中声明每一个权限(即使一个是另一个的子类)。 就我而言,我声明了
<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"/>
【讨论】:
【参考方案24】:将您的 targetSdkVersion 设置为 22。
【讨论】:
【参考方案25】:有同样的(我猜)问题,解决方案正在删除
import <app package>.Manifest;
由 Android Studio 在文件顶部自动导入并用
替换import android.Manifest;
开始工作
【讨论】:
【参考方案26】:在我的情况下,解决方案是字符串本身
android.permission.READ_CONTACTS
我做了 Manifest.permission.READ_CONTACTS 导致静音错误(注意屏幕上的显示)。
确保这是正确的
【讨论】:
Manifest.permission.READ_CONTACTS = "android.permission.READ_CONTACTS"【参考方案27】:我的 Android targetSDK 版本是 28。
我没有看到任何向用户显示请求权限的弹出窗口,这些窗口在 android Manifest.xml 中列为 . 在安装过程中,使用 USB 安装 .apk 并从 google play 商店安装应用程序。 所以我在我的活动中添加了下面的代码,它会在运行时询问用户权限
ActivityCompat.requestPermissions(MyActivity.this, 新字符串[]Manifest.permission.READ_PHONE_STATE, 1);
【讨论】:
【参考方案28】:我正在通过代码请求权限,但错过了在清单中添加 <uses-permission ..>
标记!
【讨论】:
【参考方案29】:将最终的常量值更改为 1。
private static final int REQUEST_PERMISSION_WRITE = 1;
ActivityCompat.requestPermissions(this,new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE,REQUEST_PERMISSION_WRITE);
【讨论】:
以上是关于Android M 权限对话框未显示的主要内容,如果未能解决你的问题,请参考以下文章
尝试获取 READ_PHONE_STATE 权限时未显示 Android 权限对话框