使用MediaStore API查询USB OTG文件失败,是否支持该操作?
问题描述
以下代码可正常打印external_primary及SD卡中的文件名:
val projection = arrayOf( MediaStore.Files.FileColumns.DISPLAY_NAME ) val selection = MediaStore.Files.FileColumns.RELATIVE_PATH + " = '/'" val mediaStoreVolumes = MediaStore.getExternalVolumeNames(requireActivity()) mediaStoreVolumes.forEach { volume -> val uri = MediaStore.Files.getContentUri(volume) val cursor = cr.query(uri, projection, selection, null, null) if (cursor != null) { while (cursor.moveToNext()) { Log.e("Volume: "+volume, "File: "+ cursor.getString(0)) } cursor.close() } }
但查询USB OTG时触发如下异常:
E FATAL EXCEPTION: main Process: com.starsolutions.starfilemanager, PID: 10093 java.lang.IllegalArgumentException: Volume a80d-7c6d not found
其中卷名a80d-7c6d是由MediaStore.getExternalVolumeNames()方法返回的,请问是否可以使用MediaStore API列出USB OTG驱动器中的文件?
解答
MediaStore API不支持直接访问USB OTG存储设备。
虽然MediaStore.getExternalVolumeNames()会返回USB OTG的卷标识,但这仅表示系统已识别到该存储设备,并不意味着MediaStore具备对其进行文件查询的权限或支持能力。MediaStore的核心作用是管理设备内部存储、内置SD卡中的媒体文件,USB OTG这类可移动外部存储不在其设计的支持范围内。
如果需要访问USB OTG中的文件,建议使用存储访问框架(SAF):通过Intent.ACTION_OPEN_DOCUMENT_TREE唤起系统选择器,让用户手动选择USB OTG的存储目录,之后借助DocumentFile类来遍历、操作其中的文件。
内容的提问来源于stack exchange,提问作者Muhammed naseef Koppilakkal
相关产品推荐
相关产品推荐

