Environment.getExternalStorageDirectory()
获取路径,创建目标文件夹后使用
FileOutputStream
写入
在AndroidManifest.xml中声明存储权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
// 检查并申请存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); }
// 获取公共外部存储目录(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+ | Scoped Storage | 使用 MediaStore 或 Storage 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(); } }
解答:
Android 11+ 进一步限制了外部存储访问,推荐使用以下方案:
Intent.ACTION_OPEN_DOCUMENT
让用户选择保存位置 ContentResolver
操作媒体文件 AndroidManifest
中添加 android:requestLegacyExternalStorage="true"
(仅限临时兼容)解答:
boolean isSDCardWritable = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); if (!isSDCardWritable) { Toast.makeText(this, "SD卡不可用或不可写", Toast.LENGTH_SHORT).show(); }