Android读写SD卡

文章详细介绍了从Android6.0到Android13各个版本中,针对SD卡读写权限的不同处理方式,包括动态申请权限、请求LegacyExternalStorage以及处理MANAGE_EXTERNAL_STORAGE权限等。
摘要由CSDN通过智能技术生成

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

需要动态申请权限,读和写的权限是分开的,如果申请了写的权限,那么读的权限不需要额外申请。
使用方法:

  1. 使用前进行权限检查,如果给予权限则直接使用;
  2. 如果没有权限,则动态申请权限。
    申请权限代码:

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声明。
使用:

  1. targetSdkVersion<29的应用程序默认带有requestLegacyExternalStorage=true属性,不需要额外处理。
  2. 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权限只能跳转到设置页面申请。
使用:

  1. 检查是否有MANAGE_EXTERNAL_STORAGE权限,如果没有,则跳转到设置页面申请。
  2. 如果有则直接使用。
	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权限就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值