You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11+如何通过MediaStore获取Micro SD卡媒体内容?

解决Android 11下MediaStore无法读取SD卡媒体内容的问题

1. 确认权限配置

Android 11访问MediaStore媒体文件需要READ_EXTERNAL_STORAGE权限,确保:

  • 在AndroidManifest.xml中声明权限:
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  • 针对Android 6.0+(API 23)完成动态权限申请,该权限属于危险权限,必须获得用户授权后才能访问媒体内容。

2. 获取目标SD卡的存储卷名称

Android 11中每个外部存储设备(包括SD卡)对应唯一卷名称,需先获取该名称才能构造精准查询URI:

// 获取所有已挂载的外部存储卷名称
Set<String> volumeNames = MediaStore.getExternalVolumeNames(context.getContentResolver());
// 遍历找到对应SD卡的卷名(对应路径/mnt/media_rw/D26C-1EEF的卷名通常为D26C-1EEF)
String targetVolumeName = null;
for (String name : volumeNames) {
    Log.d("SD_CARD", "Volume name: " + name);
    if ("D26C-1EEF".equals(name)) {
        targetVolumeName = name;
        break;
    }
}

3. 构造SD卡专属查询URI并执行查询

用目标卷名构造URI,直接查询该SD卡下的媒体内容:

if (targetVolumeName != null && contentResolver != null) {
    String sortOrder = MediaStore.Images.Media.DISPLAY_NAME + " ASC";
    // 构造对应SD卡的URI
    Uri sdCardUri = MediaStore.Images.Media.getContentUri(targetVolumeName);
    Cursor cursor = contentResolver.query(sdCardUri, null, null, null, sortOrder);
    
    if (cursor != null) {
        Log.d("AMPS_LOGS", "SD卡媒体文件数量:" + cursor.getCount());
        // 处理cursor数据,注意构造imageUri时要使用当前sdCardUri而非EXTERNAL_CONTENT_URI
        while (cursor.moveToNext()) {
            long imageId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
            Uri imageUri = ContentUris.withAppendedId(sdCardUri, imageId);
            String imageName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));
            String volumeName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.VOLUME_NAME));
            // 其他字段处理逻辑...
        }
        cursor.close();
    }
}

4. 确保SD卡媒体文件已被系统索引

若SD卡刚插入或新复制了媒体文件,系统可能未完成媒体扫描,导致MediaStore无相关数据,可触发扫描:

// 扫描SD卡根目录下的媒体文件(可按需修改路径)
MediaScannerConnection.scanFile(context, 
    new String[]{"/mnt/media_rw/D26C-1EEF/"}, 
    null, 
    (path, uri) -> Log.d("SCAN", "扫描完成:" + path));

关键注意点

  • 避免使用MediaStore.EXTERNAL_CONTENT_URI,它默认指向内部存储的外部卷(VOLUME_EXTERNAL_PRIMARY),不包含SD卡内容。
  • 构造媒体文件Uri时,必须使用对应SD卡的sdCardUri,否则会指向错误存储位置。
  • 确认SD卡处于正常挂载状态,未被加密或损坏,否则系统无法索引其内容。

内容的提问来源于stack exchange,提问作者windows 11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:05:34