Android 6.0 权限拒绝:需要权限 android.permission.WRITE_SETTINGS。

21

如您可以从我的清单文件下方看到,我已添加了权限,请问我漏掉了什么?

<uses-permission-sdk-m android:name="android.permission.WRITE_SETTINGS" />

https://developer.android.com/preview/features/runtime-permissions.html - Budius
我已经阅读了它。requestPermissions()方法为什么不起作用? - Dobin
也许你应该检查一下这个链接:http://stackoverflow.com/help/on-topic 和 http://stackoverflow.com/help/dont-ask - Budius
7个回答

59
在API 23或更高版本中,用户必须手动授权此权限,您可以通过调用“Settings.System.canWrite”进行检查。以下是此实现:
           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (Settings.System.canWrite(context)) {
                    // Do stuff here
                }
                else {
                    Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
                    intent.setData(Uri.parse("package:" + getActivity().getPackageName()));
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
            }

3
如何处理else条件中的活动结果?我怎么知道我的应用程序是否被授予权限? - Mohammed AlBanna
3
@Mohammad,你可以在 onResume() 中再次检查。 - xorgate
1
如果亮度不在手动模式下,这个操作就无法生效。要将亮度设置为手动模式,请执行以下操作: Settings.System.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); https://dev59.com/_Gsz5IYBdhLWcg3w0bKl#36001592 - Ying
我尝试过动态更改铃声,但没有成功。 请检查我的新答案,看看是否适用于您。 - Mihir Patel

4

3
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.System.canWrite(getApplicationContext())) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, 200);
        }
    }

这个功能非常好用。


0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.System.canWrite(getApplicationContext())) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, 200);
            }
        }

0

这是一个特殊情况:权限级别为“signature”,

如果应用程序的目标API级别为23或更高,则用户必须通过权限管理屏幕显式地授予应用程序此权限。

应用程序通过发送带有操作ACTION_MANAGE_WRITE_SETTINGS的意图来请求用户的批准。

该应用程序可以通过调用Settings.System.canWrite()检查是否具有此授权。


0
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            boolean settingsCanWrite = Settings.System.canWrite(this);

            if(!settingsCanWrite) {
                Toast.makeText(this, "Require Permission to Handle Screen Brightness", Toast.LENGTH_LONG).show();
                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                startActivity(intent);
            }
        }

-1

这取决于API级别和Android构建版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接