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

Android 13中sdcard/DCIM/Camera读取为空的技术求助

Android 13升级后无法读取DCIM/Camera目录文件的问题

我开发的一款应用原本可从DCIM/Camera读取照片并以符号形式展示,但将平板从Android 12升级到Android 13后该功能失效。日志显示访问路径正确,但调用listFiles()时返回目录为空,而通过电脑和文件管理器可看到5张照片。我已在Manifest中添加READ_EXTERNAL_STORAGE和READ_MEDIA_IMAGES权限,请问是什么发生了变化?

相关代码

public int readPhotoFolder(String dirFolder){
    int limit;
    Log.i(TAG,"dirFolder= "+ dirFolder);
    File fdcim = new File(dirFolder + "DCIM");
    File fcamera = new File(dirFolder + "DCIM/Camera/");
    Log.i(TAG,"fdcim= "+fdcim);
    if(!fdcim.isDirectory()){
        return 0;
    }
    if(fdcim.isDirectory()) {
        Log.i(TAG,"fcamera= "+fcamera);
        if(!fcamera.isDirectory()){
            return 0;
        }
    }
    //String cameraPath = dirFolder.toString()+"DCIM/Camera";
    File f = new File(String.valueOf(fcamera));
    Log.i(TAG,"f= "+f);
    File file[] = f.listFiles();
    limit = file.length;
    Log.i(TAG,"limit= "+limit);
    for (int i=0; i < limit; i++)
    {
        photoNames.add(dirFolder+"DCIM/Camera/"+file[i].getName());
    }
    return (limit);
}

问题原因与解决方法

Android 13对媒体文件访问权限做了更严格的分区限制,即使申请了READ_MEDIA_IMAGES,直接通过File API访问DCIM/Camera这类特定媒体目录的方式已不再被允许,系统会限制应用获取目录内的文件列表。

解决方法如下:

  • 改用MediaStore API查询图片文件,这是Android 13推荐的媒体文件访问方式,能正确获取DCIM/Camera下的照片。示例逻辑:
    String[] projection = {MediaStore.Images.Media.DATA};
    String selection = MediaStore.Images.Media.RELATIVE_PATH + " LIKE ?";
    String[] selectionArgs = {"%DCIM/Camera%"};
    Cursor cursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            projection,
            selection,
            selectionArgs,
            null
    );
    if (cursor != null) {
        while (cursor.moveToNext()) {
            String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
            photoNames.add(path);
        }
        cursor.close();
    }
    
  • 注意:READ_EXTERNAL_STORAGE在Android 13中已被READ_MEDIA_IMAGES替代,需确保在运行时动态申请READ_MEDIA_IMAGES权限(仅在Manifest中声明不够)。

另外,你的代码存在冗余逻辑(比如重复创建File实例),可适当简化,但核心问题是API适配不符合Android 13的权限规则。

内容的提问来源于stack exchange,提问作者Keith Cox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:02:38