Android 11读写SD卡的实现

1. 整体流程

下面是读写SD卡的整体流程:

步骤 操作
1 检查权限
2 请求权限
3 处理权限回调
4 检查SD卡是否可用
5 创建文件
6 写入数据
7 读取数据

2. 操作步骤详解

2.1 检查权限

在AndroidManifest.xml文件中添加以下权限:

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

2.2 请求权限

在Activity中添加以下代码来请求读写SD卡的权限:

private static final int PERMISSION_REQUEST_CODE = 100;

...

// 检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    // 请求权限
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
}

2.3 处理权限回调

在Activity中重写onRequestPermissionsResult方法,处理权限请求的回调:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE: {
            // 检查授权结果
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限已授予,执行后续操作
                // TODO: 处理读写SD卡的逻辑
            } else {
                // 权限被拒绝,给出提示或其他处理
            }
            break;
        }
    }
}

2.4 检查SD卡是否可用

在需要读写SD卡的地方,添加以下代码来检查SD卡是否可用:

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    // SD卡可用
    // TODO: 处理读写SD卡的逻辑
} else {
    // SD卡不可用
}

2.5 创建文件

使用File类来创建文件对象,可以在SD卡的根目录下创建一个名为"test.txt"的文件:

String filename = "test.txt";
File file = new File(Environment.getExternalStorageDirectory(), filename);

2.6 写入数据

使用FileOutputStream类来写入数据到文件中,通过调用write方法写入数据:

String data = "Hello, SD card!";
FileOutputStream fos = new FileOutputStream(file);
fos.write(data.getBytes());
fos.close();

2.7 读取数据

使用FileInputStream类来读取文件数据,通过调用read方法读取数据:

FileInputStream fis = new FileInputStream(file);
int length = fis.available();
byte[] buffer = new byte[length];
fis.read(buffer);
String data = new String(buffer, "UTF-8");
fis.close();

类图

下面是涉及到的类的类图:

classDiagram
    class Activity{
        +onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
    }
    class ContextCompat{
        +checkSelfPermission(Context context, String permission)
    }
    class ActivityCompat{
        +requestPermissions(Activity activity, String[] permissions, int requestCode)
    }
    class Environment{
        +getExternalStorageState()
        +getExternalStorageDirectory()
    }
    class File{
        +File(String path)
        +File(String parent, String child)
    }
    class FileOutputStream{
        +FileOutputStream(File file)
        +write(byte[] b)
        +close()
    }
    class FileInputStream{
        +FileInputStream(File file)
        +read(byte[] b)
        +close()
    }
    class PackageManager{
        +PERMISSION_GRANTED
    }
    Interface Manifest.permission
    Activity <|-- AppCompatActivity
    ContextCompat <-- Activity
    ActivityCompat <-- Activity
    Environment <-- Activity
    File <-- Activity
    FileOutputStream <-- Activity
    FileInputStream <-- Activity
    PackageManager <-- Activity
    Manifest.permission <-- Activity

关系图

下面是涉及到的类之间的关系图:

erDiagram
    ACTIVITY }|--|| APP_COMPAT_ACTIVITY : extends
    ACTIVITY }|--|| PERMISSIONS_CALLBACK : implements
    ACTIVITY }|--|| ENVIRONMENT
    ACTIVITY }|--|| FILE
    ACTIVITY }|--|| FILE_OUTPUT_STREAM
    ACTIVITY }|--|| FILE_INPUT_STREAM
    APP_COMPAT_ACTIVITY }|--|| CONTEXT_COMPAT
    APP_COMPAT_ACTIVITY }|--|| ACTIVITY_COMPAT