外部存储和 USB 存储
发布时间:2025-06-24 18:32:56 作者:北方职教升学中心 阅读量:739
StorageManager.getVolumeList()
不需要任何权限。二、路径、
2. 可访问性:
storageManager.getVolumes()
可以访问所有类型的存储卷,包括内部存储、(测试USB 存储无法读取
)
3. 权限:
storageManager.getVolumes()
需要READ_EXTERNAL_STORAGE
权限才能访问外部存储和 USB 存储。可能的 state 包括:MEDIA_MOUNTED
: 存储卷已挂载MEDIA_UNMOUNTED
: 存储卷已卸载MEDIA_BAD_REMOVAL
: 存储卷被不正确移除MEDIA_NOFS
: 存储卷没有文件系统MEDIA_CHECKING
: 存储卷正在检查
mountPoint:指示存储卷的挂载路径。外部存储、
flags:
指示存储卷的标志。USB 存储等
- state:卷状态,例如挂载、
fsUuid:指示存储卷的文件系统 UUID。
volumeInfovol.getDisk() != null && vol.getDisk().isUsb()
就是OTG,volumeInfo.getDisk() != null && sv.getDisk().isSd()
就是SD卡。- 如果您只需要访问可公开访问的存储卷,或者不想使用任何权限,请使用
StorageManager.getVolumeList()
方法。 maxFileSize:指示存储卷上最大文件大小。
四、类型等。
后面使用VolumeInfo.ACTION_VOLUME_STATE_CHANGED
才可以监听到,而且可以查看设备有没有准备好,有没有mounted或者unmounted。读取文件列表和监听其插拔状态。可能的类型包括:
TYPE_INTERNAL
: 内部存储TYPE_EXTERNAL
: 外部存储TYPE_PUBLIC
: 公共存储TYPE_USB
: USB 存储TYPE_SDCARD
: SD 卡
state:
指示存储卷的状态。可移动等
StorageVolume类属性:
- volumeId:卷 ID
- fsType:卷文件系统类型
- state:卷状态,例如挂载、
以下是 VolumeInfo和 StorageVolume类的属性及其含义:
VolumeInfo类属性:
- _id:卷 ID
- type:卷类型,例如内部存储、可能的标志包括:
FLAG_READ_ONLY
: 存储卷只读FLAG_REMOVABLE
: 存储卷可移动
ownerUid:指示存储卷的所有者用户 ID。
表格总结了
storageManager.getVolumes()
和StorageManager.getVolumeList()
之间的区别:特性 storageManager.getVolumes()
StorageManager.getVolumeList()
返回值 List<VolumeInfo>
StorageVolume[]
可访问性 所有类型 可公开访问 权限 READ_EXTERNAL_STORAGE
无 版本 Android 5.0 (API 21) Android 4.0 (API 14) - 如果您需要访问所有类型的存储卷,并可以使用
READ_EXTERNAL_STORAGE
权限,请使用storageManager.getVolumes()
方法。它们之间存在一些相似之处,但也有一些关键区别。Android/obb
访问私有应用文件目录,只有使用SAF方式访问,需要用户授权目录。
4. 版本:
storageManager.getVolumes()
是 Android 5.0 (API 21) 中引入的新方法。不可访问等- mountPoint:卷挂载路径
- fsUuid:卷文件系统 UUID
- partGuid:卷分区 GUID
- flags:卷标志,例如只读、
fsType:指示存储卷的文件系统类型。
另外OTG存储,无法通过MediaStore API方式查询其媒体文件,但是可以查询内置存储和SD卡存储。
所以通过
volumeInfo
的话,一般volumeInfo.getType() == VolumeInfo.TYPE_PRIVATE
或者volumeInfo.getType() == VolumeInfo.TYPE_EMULATED
就是内部存储,我遇到有些设备这种判断还是不准确。VolumeInfo
:publicstaticfinalStringACTION_VOLUME_STATE_CHANGED="android.os.storage.action.VOLUME_STATE_CHANGED";publicstaticfinalStringEXTRA_VOLUME_ID="android.os.storage.extra.VOLUME_ID";publicstaticfinalStringEXTRA_VOLUME_STATE="android.os.storage.extra.VOLUME_STATE";
// 监听广播publicfinalBroadcastReceivermDiskReceiver =newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){if(intent.getAction().equals(VolumeInfo.ACTION_VOLUME_STATE_CHANGED)){intid =intent.getIntExtra(VolumeInfo.EXTRA_VOLUME_ID,0);intstate =intent.getIntExtra(VolumeInfo.EXTRA_VOLUME_STATE,VolumeInfo.STATE_UNMOUNTABLE);android.util.Log.e("maxx","mDiskReceiver id:"+id+" state="+state);}}};//注册监听registerReceiver(mDiskReceiver,newIntentFilter(VolumeInfo.ACTION_VOLUME_STATE_CHANGED));//取消监听unregisterReceiver(mDiskReceiver);
相关参考
[1] USB 存储媒介
[2] 使用 MediaStore 查询 USB OTG 中的文件失败