Android读写SD卡
0. 参考
解决各版本安卓读写SD卡的问题-java.io.IOException: Operation not permitted问题(兼容到android13)
1. 安卓6.0之前
不需要动态申请权限,直接在manifest中申请。
AndroidManifest.xml中声明:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.xt.client">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
2. 安卓6.0,SDK=23
需要动态申请权限,读和写的权限是分开的,如果申请了写的权限,那么读的权限不需要额外申请。
使用方法:
- 使用前进行权限检查,如果给予权限则直接使用;
- 如果没有权限,则动态申请权限。
申请权限代码:
private int requestPermissionCode = 10000;
private String[] requestPermission = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
};
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
if (PermissionChecker.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PermissionChecker.PERMISSION_GRANTED) {
requestPermissions(requestPermission, requestPermissionCode);
}
}
3. 安卓10,SDK=29
安卓10开始,安卓加强了限制,如果需要读写SD卡,需要额外的进行申请requestLegacyExternalStorage声明。
使用:
- targetSdkVersion<29的应用程序默认带有requestLegacyExternalStorage=true属性,不需要额外处理。
- targetSdkVersion>=29,需要在manifest的application中进行申请使用,代码如下
<application
android:name=".application.DemoApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"//这一行
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
tools:ignore="GoogleAppIndexingWarning">
>
4. 安卓11,SDK=30
安卓11继续加强对SD卡的读写管理,引入了MANAGE_EXTERNAL_STORAGE权限,而之前的WRITE_EXTERNAL_STORAGE已经失效,并且MANAGE_EXTERNAL_STORAGE权限只能跳转到设置页面申请。
使用:
- 检查是否有MANAGE_EXTERNAL_STORAGE权限,如果没有,则跳转到设置页面申请。
- 如果有则直接使用。
private int requestPermissionCode = 10000;
private String[] requestPermission = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
};
/**
* 获取写文件权限
*/
public void requestPermission() {
if (Build.VERSION.SDK_INT >= 30) {
if (!Environment.isExternalStorageManager()) {
Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
startActivity(intent);
return;
}
} else {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
if (PermissionChecker.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PermissionChecker.PERMISSION_GRANTED) {
requestPermissions(requestPermission, requestPermissionCode);
}
}
}
}
AndroidManifest.xml添加:
<!--存储权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
5. 安卓13,SDK=33
取消了WRITE_EXTERNAL_STORAGE权限,只需要申请MANAGE_EXTERNAL_STORAGE权限就行。