Android 6 Marshmallow:某些特定权限的请求立即被拒绝,没有显示 ui

Android 6 Marshmallow: requests for some specific permissions are instantly denied with no ui shown

使用官方 AVD 版本。 3

调用这个:

ActivityCompat.requestPermissions(activity, new String[]{"android.permission.USE_CREDENTIALS"}, REQUEST_PERMISSION_CREDENTIALS);

立即触发:

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)

结果代码是PackageManager.PERMISSION_DENIED

有人有解决办法吗?

更新: 已知受影响:

Manifest.permission.CHANGE_NETWORK_STATE
Manifest.permission.WRITE_SETTINGS (solved, see Sam's answer)
android.permission.USE_CREDENTIALS (solved, read Update 2)
READ_SMS

更新 2: 查看优秀的接受答案。本质上,USE_CREDENTIALS 现在是一个安全权限。打败我为什么sdk不只是return PERMISSION_GRANTED...

参考这些页面:permissions by protection level and protection level definitions

Manifest.permission.CHANGE_NETWORK_STATE

Manifest.permission.WRITE_SETTINGS

这些属于“signature|appop|pre23|preinstalled”保护级别,这意味着只有相同签名的应用程序(基本上系统签名)、应用程序运营商、目标低于 API 级别 23 和预安装的应用程序应用程序可以有这些。

android.permission.USE_CREDENTIALS

只有 API 22 级及以下才需要。参见 this

您还应该查看 Behavior Changes

关于WRITE_SETTINGS,CommonsGuy 在这里提供了解决方法:

看来你已经解决了。我有同样的症状,但原因更愚蠢。

我的 uses-permission 节点在我的清单中的应用程序节点内。这似乎适用于 22 或更少,但移动到 23 似乎无法识别它,因此自动拒绝许可。

希望这可以帮助其他坚持这个的人。

首先检查 Marshmellow 版本,然后在更改 activity 名称后将其粘贴到您的代码中

if (!android.provider.Settings.System.canWrite(RingdroidEditActivity.this)) {
                    Intent intentt = new     Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
                intentt.setData(Uri.parse("package:" + RingdroidEditActivity.this.getPackageName()));
                intentt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intentt);
            }

这会将您带到应用的权限页面并请求用户授予权限

WRITE_SETTINGS marshmellow 更改后 这会起作用 要查看示例,请检查此应用程序