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