Android 11作用域存储权限

我正试图更好地理解一旦安卓11版本发布,我能做些什么

我的应用程序使用Environment.getExternalStorageDirectory()提供的图像文件路径创建相册,但使用Android 11,我将无法直接访问文件

根据Android开发者的文档,他们最近引入了MANAGE\u EXTERNAL\u STORAGE权限,但我不知道添加此权限后是否能够通过环境继续访问文件

有人有主意吗

谢谢

2021年1月更新

我在安卓11虚拟设备上试用了我的应用程序,即使没有请求MANAGE\u EXTERNAL\u STORAGE权限,它似乎也能正常工作

阅读Android开发者的文档,似乎使用文件API访问照片和媒体位置的应用程序可以继续工作,但我不确定

有谁能更好地理解Android文档吗

Android 11

如果您的目标是Android 11(targetSdkVersion 30),则需要在AndroidManifest.xml中具有以下权限才能修改和访问文档

<使用权限android:name="android.permission.READ“外部存储”/&燃气轮机;
<使用权限android:name="android.permission.WRITE“外部存储”;
android:maxSdkVersion="28“/&燃气轮机;
<使用权限android:name="android.permission.MANAGE“外部存储”/&燃气轮机;

对于Android 10,在AndroidManifest.xml标记中放置以下行

android:requestLegacyExternalStorage="“真的”;

下面的方法检查是否允许或拒绝该权限

私有布尔检查权限(){
如果(SDK_INT>=Build.VERSION_code.R){
返回Environment.isExternalStorageManager();
}否则{
int result=ContextCompat.checkSelfPermission(PermissionActivity.this,读取外部存储);
int result1=ContextCompat.checkSelfPermission(PermissionActivity.this,WRITE\u EXTERNAL\u STORAGE);
返回结果==PackageManager.PERMISSION\u provided&result1==PackageManager.PERMISSION\u provided;
}
}

以下方法可用于在android 11或更低版本中请求权限

private void requestPermission(){
如果(SDK_INT>=Build.VERSION_code.R){
试一试{
意向意向=新意向(设置、操作、管理、应用、所有文件、访问、权限);
intent.addCategory(“android.intent.category.DEFAULT”);
setData(Uri.parse(String.format("包:%s",getApplicationContext().getPackageName()));
startActivityForResult(意向书,2296);
}捕获(例外e){
意图=新意图();
intent.setAction(Settings.ACTION\u MANAGE\u ALL\u FILES\u ACCESS\u PERMISSION);
startActivityForResult(意向书,2296);
}
}否则{
//低于android 11
ActivityCompat.requestPermissions(PermissionActivity.this,新字符串[]{WRITE\u EXTERNAL\u STORAGE},PERMISSION\u REQUEST\u CODE);
}
}

处理Android 11或更高版本的权限回调

@覆盖
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
如果(请求代码==2296){
如果(SDK_INT>=Build.VERSION_code.R){
if(Environment.isExternalStorageManager()){
//允许权限成功时执行操作
}否则{
Toast.makeText(这是“允许存储访问权限!”,Toast.LENGTH.SHORT).show();
}
}
}
}

处理Android 11以下操作系统版本的权限回调

@覆盖
public void onRequestPermissionsResult(int-requestCode、字符串[]权限、int[]grantResults){
开关(请求代码){
案例权限\请求\代码:
如果(grantResults.length>0){
布尔值READ_EXTERNAL_STORAGE=grantResults[0]==PackageManager.PERMISSION_promission;
boolean WRITE_EXTERNAL_STORAGE=grantResults[1]==PackageManager.PERMISSION_promission;
if(读取外部存储器和写入外部存储器){
//允许权限成功时执行操作
}否则{
Toast.makeText(这是“允许存储访问权限!”,Toast.LENGTH.SHORT).show();
}
}
打破
}
}

发表评论