我们目前正在开发一个应用程序,我们想要改变一些系统设置,当然有用户的许可。android文档指出,要做到这一点,必须添加以下权限:
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
另外,还必须显式地要求用户启用此权限。https://developer.android.com/reference/android/Manifest.permission#WRITE_SETTINGS的一段节选说:
备注:如果应用程序的目标是API 23或更高级别,则应用程序用户必须通过权限管理屏幕显式授予应用程序该权限。该应用程序通过发送带有动作
Settings.ACTION_MANAGE_WRITE_SETTINGS
的意图来请求用户的批准。该应用程序可以通过调用Settings.System.canWrite()
来检查它是否具有此授权。
到目前为止,这是相当清楚的。然而,当权限被添加到AndroidManifest.xml文件中时,Android抱怨说“权限只授予系统应用程序”。现在,这是令人困惑的,因为我还没有发现任何文档说明它确实只被授予了系统应用程序。
那么,我想问一下,是否有人遇到过这个问题,以及是否有某种文档详细解释了这一点?还是我只是遗漏了什么?
发布于 2020-07-31 13:32:30
正如用户passsy在Brian提供的堆栈溢出question中所述,android.permission.WRITE_SETTINGS
具有android:protectionLevel
of "signature"
,这使得自API 23以来用户应用程序中的权限不可用。
有关权限保护级别的说明,请参见https://developer.android.com/guide/topics/manifest/permission-element#plevel。
发布于 2020-07-31 15:22:23
您需要从用户那里获得用户权限,我的意思是,您必须将用户带到屏幕上,用户可以在屏幕上授予您的应用程序获得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);
}
https://stackoverflow.com/questions/63192108
复制相似问题