安卓文件权限总结

对于 Android 用户来说,这是一项非常优秀的改进。自从 Android M(6) 以来,我已经遇到许多不给读写外存权限就无法使用的 App 了。结果是打开文件管理就能看到一堆乱七八糟的文件和文件夹,这对习惯自己整理存储空间的人来说太痛苦了。

但读写外存的权限并非必要的。通过Context.getExternalFilesDir可以获取到属于 App 自身的文件路径,通常是~/Android/data/<package-name>/**/。在该目录中读写文件均不需要申请权限,当 App 被卸载时,该文件夹及内容也会全部删除。

Android Q (10) 中删除了READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE两项危险权限,限制 App 只能使用自己的应用空间存放文件。

当 App 需要保存一些不能随卸载删除的文件时,需要根据存放位置动态申请新增的权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEOREAD_MEDIA_AUDIO(分别对应系统的媒体文件夹)。 比较特殊的是 Downloads 文件夹:写入和读取自身写入的数据不需要申请权限,但想获取其他 App 存进去的文件时,必须使用系统的文件选择器,由用户选择。

1.Android SDK低于23(Android6.0)直接在 AndroidManifest.xml中申请即可

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

2.Android SDK大于23(Android6.0)、小于30(Android11)在 AndroidManifest.xml中申请,并且代码中也需要动态申请

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

private void requestPermission(){

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.WRITE_EXTERNAL_STORAGE)

!= PERMISSION_GRANTED

|| ContextCompat.checkSelfPermission(this,

Manifest.permission.READ_EXTERNAL_STORAGE)

!= PERMISSION_GRANTED){//判断是否已经赋予权限

ActivityCompat.requestPermissions(this,

new String[]{

Manifest.permission.WRITE_EXTERNAL_STORAGE,

Manifest.permission.READ_EXTERNAL_STORAGE}, 1);

}

}

@Override

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (requestCode == 1) {

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.WRITE_EXTERNAL_STORAGE)

!= PERMISSION_GRANTED

|| ContextCompat.checkSelfPermission(this,

Manifest.permission.READ_EXTERNAL_STORAGE

!= PERMISSION_GRANTED){

Toast.makeText(this, "请开启存储权限", Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(this, "存储权限开启成功", Toast.LENGTH_SHORT).show();

}

}

}

3.Android SDK大于等于30(Android11)在 AndroidManifest.xml中申请,并且代码中也需要动态申请

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<!-- Android11新增 -->

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

<application

android:name=".application.MainApplication"

android:allowBackup="true"

android:icon="@mipmap/biao"

android:label="@string/app_name"

android:persistent="true"

android:requestLegacyExternalStorage="true"

android:sharedUserId="android.uid.system"

android:supportsRtl="true"

android:theme="@style/AppTheme"

android:preserveLegacyExternalStorage="true"

android:usesCleartextTraffic="true">

</application>

<!-- android10.0根目录创建文件夹android:requestLegacyExternalStorage="true" -->

<!-- android11 根目录创建文件夹android:preserveLegacyExternalStorage="true"

在Android11的机器上覆盖安装时,才能访问旧版存储位置,卸载重装会失效-->

private void requestPermission(){

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//30

// 先判断有没有权限

if (!Environment.isExternalStorageManager()) {

//跳转到设置界面引导用户打开

Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);

intent.setData(Uri.parse("package:" + getPackageName()));

startActivityForResult(intent, 3);

}

}

}

@SuppressLint("NewApi")

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode==3){

if (Environment.isExternalStorageManager()){

//自己的操作

} else {

showToast("存储权限获取失败");

}

}

}

Manifest.permission.WRITE_EXTERNAL_STORAGE,

Manifest.permission.READ_EXTERNAL_STORAGE,

如果Android11及以上申请以上的读写存储权限,用户允许后,允许的只是媒体文件,并不能操作手机的文件管理(例如:创建文件到指定目录下);只有申请通过

ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION此权限才允许操作手机中的文件管理

相关推荐
yzx99101315 分钟前
构建未来:深度学习、嵌入式与安卓开发的融合创新之路
android·人工智能·深度学习
前行的小黑炭30 分钟前
Android :如何快速让布局适配手机和平板?
android·java·kotlin
Yang-Never4 小时前
Kotlin协程 -> Job.join() 完整流程图与核心源码分析
android·开发语言·kotlin·android studio
一笑的小酒馆10 小时前
Android性能优化之截屏时黑屏卡顿问题
android
懒人村杂货铺13 小时前
Android BLE 扫描完整实战
android
TeleostNaCl15 小时前
如何安装 Google 通用的驱动以便使用 ADB 和 Fastboot 调试(Bootloader)设备
android·经验分享·adb·android studio·android-studio·android runtime
fatiaozhang952716 小时前
中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
2501_9159184117 小时前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
lichong95117 小时前
【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
android·vue.js·iphone
Android出海17 小时前
Android 15重磅升级:16KB内存页机制详解与适配指南
android·人工智能·新媒体运营·产品运营·内容运营