上一篇
安卓外部存储示例
- 行业动态
- 2025-04-21
- 4
Android外部存储权限配置
在AndroidManifest.xml中声明存储权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_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); } // 处理权限回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限已获取 } else { // 权限被拒绝 } } }
文件读写操作示例
写入外部存储
// 创建文件输出流 File file = new File(Environment.getExternalStorageDirectory(), "example.txt"); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write("Hello Android".getBytes()); } catch (IOException e) { e.printStackTrace(); }
读取外部存储
// 读取文件内容 File file = new File(Environment.getExternalStorageDirectory(), "example.txt"); try (FileInputStream fis = new FileInputStream(file)) { int size = fis.available(); byte[] buffer = new byte[size]; fis.read(buffer); String content = new String(buffer); } catch (IOException e) { e.printStackTrace(); }
Android 10+ 存储适配
功能 | Android 9及以下 | Android 10+ |
---|---|---|
文件访问方式 | 直接文件系统路径 | Scoped Storage(沙盒存储) |
媒体文件访问 | MediaScanner连接 | MediaStore API |
权限模型 | 全局授权 | 分区存储 + 运行时权限 |
使用MediaStore API示例
// 保存图片到公共目录 ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, "test.jpg"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); try (OutputStream os = getContentResolver().openOutputStream(uri)) { // 写入图片数据 }
常见问题与解决方案
问题描述 | 解决方案 |
---|---|
文件路径找不到 | 使用Context.getExternalFilesDir() 获取应用专属目录,或通过MediaStore API操作 |
权限申请被拒绝 | 添加<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> 并引导用户手动授权 |
Android 11+无法创建文件夹 | 改用getExternalFilesDir() 或使用Storage Access Framework |
相关问题与解答
Q1:Android 11+如何访问下载目录?
A1:Android 11+不再允许直接访问公共目录(如Download),需使用:
- 应用专属外部存储目录:
getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
- Storage Access Framework:通过
Intent.ACTION_OPEN_DOCUMENT_TREE
获取持久化访问权限 - MediaStore API:仅适用于媒体类型文件
Q2:如何判断设备是否挂载了外部存储?
A2:使用以下代码检测:
boolean isAvailable = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); if (!isAvailable) { // 提示用户插入SD卡或禁用相关功能 }