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

安卓外部存储示例

Android外部存储权限配置

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

安卓外部存储示例  第1张

<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),需使用:

  1. 应用专属外部存储目录:getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
  2. Storage Access Framework:通过Intent.ACTION_OPEN_DOCUMENT_TREE获取持久化访问权限
  3. MediaStore API:仅适用于媒体类型文件

Q2:如何判断设备是否挂载了外部存储?
A2:使用以下代码检测:

boolean isAvailable = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if (!isAvailable) {
    // 提示用户插入SD卡或禁用相关功能
}
0