android.permission.WRITE_SETTINGS 是否仅授予系统应用程序?

Vit*_*lds 5 android android-permissions android-settings

我们目前正在开发一个应用程序,我们想更改一些系统设置,当然需要用户许可。android 文档说要做到这一点,你必须添加以下权限:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
Run Code Online (Sandbox Code Playgroud)

此外,必须明确要求用户启用此权限。摘自https://developer.android.com/reference/android/Manifest.permission#WRITE_SETTINGS说:

注意:如果应用以 API 级别 23 或更高级别为目标,应用用户必须通过权限管理屏幕向应用明确授予此权限。该应用程序通过发送带有 action 的意图来请求用户的批准Settings.ACTION_MANAGE_WRITE_SETTINGS。应用程序可以通过调用 来检查它是否具有此授权 Settings.System.canWrite()

到此为止,已经很清楚了。但是,当将权限添加到AndroidManifest.xml文件时,Android Studio 会抱怨“权限仅授予系统应用程序”。现在,这令人困惑,因为我还没有找到任何说明它确实只授予系统应用程序的文档。

所以,我想问一下是否有人遇到过这个问题,是否有某种文档详细解释了这一点?或者我只是错过了什么?

小智 5

您需要专门从用户那里获取用户权限,我的意思是您必须将用户带到一个屏幕,用户可以在其中向您的应用程序授予 WRITE_SETTINGS 权限。

因此,当您想要更改系统设置时,您必须检查用户是否已授予权限,如下所示:

private boolean checkSystemWritePermission() {
    boolean retVal = true;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        retVal = Settings.System.canWrite(this);
        Log.d("TAG", "Can Write Settings: " + retVal);
        if(retVal){
            ///Permission granted by the user
        }else{
            //permission not granted navigate to permission screen
            openAndroidPermissionsMenu();
        }
    }
    return retVal;
}

private void openAndroidPermissionsMenu() {
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
    intent.setData(Uri.parse("package:" + this.getPackageName()));
    startActivity(intent);
 }
Run Code Online (Sandbox Code Playgroud)


Vit*_*lds 4

正如Brian提供的stackoverflow问题中的用户passsy所说,有一个of ,这使得自 API 级别 23 以来该权限无法在用户应用程序中使用。 请参阅https://developer.android.com/guide/topics/manifest/permission -element#plevel用于权限保护级别的描述。android.permission.WRITE_SETTINGSandroid:protectionLevel"signature"