上一篇
安卓存储本地文件
- 行业动态
- 2025-04-23
- 5
安卓存储本地文件可存内部(私有/公有)或外部存储,需申请权限,Android 10后外部存储访问受限,推荐用Storage Access Framework或MediaStore API,或通过File类操作内部存储
安卓存储本地文件的方式
安卓系统提供多种存储本地文件的途径,主要分为内部存储和外部存储两类,具体实现方式根据Android版本有所不同。
内部存储(Internal Storage)
- 特点:应用私有,无需申请权限,数据默认加密。
- 适用场景:存储敏感配置、缓存文件等。
- 路径:
/data/data/<包名>/files/
- 操作方法:
File internalFile = new File(getFilesDir(), "example.txt"); try (FileOutputStream fos = new FileOutputStream(internalFile)) { fos.write("Hello Internal".getBytes()); }
外部存储(External Storage)
- 特点:公共目录,需申请权限,Android Q(API 29)后受Scoped Storage限制。
- 路径:
- 公共目录:
/storage/emulated/0/Download/
- 应用专属目录:
/storage/emulated/0/Android/data/<包名>/
- 公共目录:
- 权限要求:
| 权限名称 | 作用 | 适用场景 |
|——————————|——————————|————————|
|READ_EXTERNAL_STORAGE
| 读取外部存储文件 | Android 10以下 |
|WRITE_EXTERNAL_STORAGE
| 写入外部存储文件 | Android 10以下 |
|MANAGE_EXTERNAL_STORAGE
| 管理所有外部存储文件(Android 11+) | 需引导用户手动开启 |
Scoped Storage(Android Q+)
- 限制:应用只能访问自身创建的文件或特定公共目录。
- 解决方案:
- 使用
MediaStore
API保存媒体文件。 - 通过
Storage Access Framework(SAF)
获取用户授权的目录。
- 使用
代码示例:存储文件到公共目录
动态申请权限(Android 10以下)
<!-AndroidManifest.xml --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
// 运行时申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
写入文件到公共下载目录
File publicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(publicDir, "example.txt"); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write("Hello Public".getBytes()); } catch (IOException e) { e.printStackTrace(); }
兼容Android Q+的存储方式
// 使用MediaStore保存图片(Android Q+) ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, "example.png"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/png"); Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); try (OutputStream os = contentResolver.openOutputStream(uri)) { // 写入图片数据到os }
常见问题与解决方案
问题 | 解决方案 |
---|---|
文件路径不存在 | 检查路径是否正确,或使用file.mkdirs() 创建多级目录。 |
权限被拒绝(Android 10+) | 使用MediaStore 或SAF 替代直接文件路径访问,并申请MANAGE_EXTERNAL_STORAGE 权限。 |
文件无法读取(Android Q+) | 通过ContentResolver 查询文件URI,或使用SAF 获取用户授权的目录。 |
相关问题与解答
问题1:如何判断文件是否存储成功?
解答:可通过File.exists()
检查文件是否存在,或捕获IOException
判断写入是否异常。
if (file.exists()) { Log.d("Storage", "File saved successfully!"); } else { Log.e("Storage", "File saving failed."); }
问题2:如何在Android 11+中请求MANAGE_EXTERNAL_STORAGE
权限?
解答:需引导用户进入系统设置页手动开启:
Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); startActivity(intent);
注意:Google Play可能拒绝频繁申请此权限的应用,需谨慎