当前位置:首页 > 行业动态 > 正文

安卓存储数据到sd卡制定文件夹

需申请存储权限,通过 Environment.getExternalStorageDirectory()获取路径,创建目标文件夹后使用 FileOutputStream写入

权限配置

在AndroidManifest.xml中声明存储权限:

安卓存储数据到sd卡制定文件夹

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

动态权限申请(Android 6.0+)

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

获取SD卡路径

// 获取公共外部存储目录(Android 10+需适配)
File sdcardDir = Environment.getExternalStorageDirectory();
// 拼接目标文件夹路径
File targetDir = new File(sdcardDir, "MyAppFolder");

创建文件夹

// 检查文件夹是否存在
if (!targetDir.exists()) {
    boolean success = targetDir.mkdirs(); // 创建多级目录
    if (!success) {
        Log.e("StorageError", "文件夹创建失败");
    }
}

写入文件到指定文件夹

// 创建文件对象
File file = new File(targetDir, "example.txt");
try (FileOutputStream fos = new FileOutputStream(file)) {
    String data = "这是要保存的数据";
    fos.write(data.getBytes());
} catch (IOException e) {
    e.printStackTrace();
}

Android 10+ 特殊处理

系统版本 存储策略 推荐方案
Android 10+ Scoped Storage 使用 MediaStoreStorage Access Framework
Android 9- 自由存储 直接文件路径操作

MediaStore 示例:

ContentValues values = new ContentValues();
values.put(MediaStore.Files.FileColumns.DISPLAY_NAME, "example.txt");
values.put(MediaStore.Files.FileColumns.MIME_TYPE, "text/plain");
values.put(MediaStore.Files.FileColumns.RELATIVE_PATH, "MyAppFolder"); // 相对路径
Uri uri = getContentResolver().insert(MediaStore.Files.getContentUri("external"), values);

完整代码示例

public void saveFileToSDCard() {
    // 1. 检查存储权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        return;
    }
    // 2. 获取SD卡路径
    File sdcardDir = Environment.getExternalStorageDirectory();
    File targetDir = new File(sdcardDir, "MyAppFolder");
    // 3. 创建文件夹
    if (!targetDir.exists()) {
        if (!targetDir.mkdirs()) {
            Toast.makeText(this, "文件夹创建失败", Toast.LENGTH_SHORT).show();
            return;
        }
    }
    // 4. 写入文件
    File file = new File(targetDir, "example.txt");
    try (FileOutputStream fos = new FileOutputStream(file)) {
        String data = "Hello SD Card!";
        fos.write(data.getBytes());
        Toast.makeText(this, "文件保存成功", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "文件保存失败", Toast.LENGTH_SHORT).show();
    }
}

相关问题与解答

问题1:Android 11+ 如何适配SD卡存储?

解答
Android 11+ 进一步限制了外部存储访问,推荐使用以下方案:

安卓存储数据到sd卡制定文件夹

  1. Storage Access Framework:通过 Intent.ACTION_OPEN_DOCUMENT 让用户选择保存位置
  2. MediaStore API:使用 ContentResolver 操作媒体文件
  3. 申请 ALLOW_ALL_FILES_ACCESS:在 AndroidManifest 中添加 android:requestLegacyExternalStorage="true"(仅限临时兼容)

问题2:如何判断SD卡是否挂载且可写?

解答

安卓存储数据到sd卡制定文件夹

boolean isSDCardWritable = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if (!isSDCardWritable) {
    Toast.makeText(this, "SD卡不可用或不可写", Toast.LENGTH_SHORT).show();
}