gddhy

_(:з」∠)_ 加载中...
  • 主页
  • 归档
  • 工具
  • 关于
所有文章 友链

gddhy

_(:з」∠)_ 加载中...

  • 主页
  • 归档
  • 工具
  • 关于

安卓储存空间权限适配(支持安卓11)

2020-12-04
字数统计:497字 阅读时长≈2分

在安卓系统上,访问用户储存空间的文件需要申请存储空间权限

此权限在安卓9及之前版本为 android.permission.WRITE_EXTERNAL_STORAGE 和 android.permission.READ_EXTERNAL_STORAGE ,申请写权限时会自动赋予读权限。
安卓6之前只需要在AndroidManifest.xml中申请即可使用,安卓6起需要适配运行时权限,在程序运行时动态申请权限。
安卓9时启用分区储存,targetApi到Q时再AndroidManifest.xml的application中添加 android:requestLegacyExternalStorage="true" 即可屏蔽分区储存,使用上面的方法申请访问储存空间。
在安卓11上,取消储存空间权限(targetApi 不到R不启用,对于到R的强制启用)想要直接访问文件需要申请特殊权限-所有文件管理权限 android.permission.MANAGE_EXTERNAL_STORAGE ,使用 Environment.isExternalStorageManager() 检查用户是否授予权限,在安卓11上 /sdcard/Android/data/包名 目录属于应用私有目录,其他应用无法访问

简单的申请权限例程
AndroidManifest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<manifest
...>

<application
android:requestLegacyExternalStorage="true"
...>
...
</application>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

</manifest>

Activity中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
if(hasPermission()){
//想要执行的操作
} else {
requestPermission();
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(Environment.isExternalStorageManager()){
//想要执行的操作
} else {
Toast.makeText(this, "缺少必要权限",Toast.LENGTH_LONG).show();
}
}


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
//想要执行的操作
} else {
Toast.makeText(this, "缺少必要权限",Toast.LENGTH_LONG).show();
}
}

private boolean hasPermission(){
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
else
return Environment.isExternalStorageManager();
}

private void requestPermission(){
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 10000);
else {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 10000);
Toast.makeText(this, "请授予必要权限",Toast.LENGTH_LONG).show();
}
}
赏

谢谢你请我吃糖果

微信
  • Android

扫一扫,分享到微信

微信分享二维码
百度输入法小工具
博客绑定域名
目录,不存在的…
留言已关闭
:gddhy
© gddhy
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链

tag:

  • Android
  • 软件分享
  • game
  • Hexo
  • JavaScript
  • 旧机博物馆
  • MIUI
  • Java
  • git
  • Termux
  • mtk
  • 原神
  • Win
  • Html
  • 安卓学习笔记

    缺失模块

  • Luminous' Home
  • 影子博客
  • 四次元领域
  • 初之音
  • Mr.Pumpkin
  • ZhaoQuinn 's Blog