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
相关产品推荐
相关产品推荐

