对于 Marshmallow 或更高版本的权限在安装时未授予,必须在运行时需要时请求(如果之前未授予。)
为此,您需要运行ActivityCompat.requestPermissions() 以在您的活动中弹出系统权限对话框,此时用户正在执行需要额外系统权限的操作。
WRITE_EXTERNAL_STORAGE 权限的一个例子是:
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
WRITE_EXTERNAL_STORAGE_REQUEST_CODE
);
注意:WRITE_EXTERNAL_STORAGE_REQUEST_CODE 是一个任意整数常量,您应该在别处定义。
您请求的权限也应在您的AndroidManifest.xml 中声明。在本例中,声明为:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
为了处理系统权限对话框响应,您还需要在 Activity 中实现 onRequestPermissionsResult()。对于此示例,代码类似于
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
if (grantResults.length == 0 || grantResults[0] == PackageManager.PERMISSION_DENIED) {
return; //permission not granted, could also optionally log an error
}
if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
//Do whatever you needed the write permissions for
}
}
如果您通过Espresso、UIAutomator 和/或其他一些 UI 测试框架自动化您的应用程序,您将需要在测试期间预期并单击系统对话框,这可以通过以下测试代码完成:
private void allowPermissionsIfNeeded() {
if (Build.VERSION.SDK_INT >= 23) {
UiObject allowPermissions = mDevice.findObject(new UiSelector().text("Allow"));
if (allowPermissions.exists()) {
try {
allowPermissions.click();
} catch (UiObjectNotFoundException e) {
Timber.e(e, "There is no permissions dialog to interact with ");
}
}
}
}
有关测试系统 UI 权限的更全面说明,请参阅here。