- 整体框架
Vold是Volume Daemon的缩写,它是Android平台中外部存储系统的管控中心,是管理和控制Android平台外部存储设备的后台进程。其功能主要包括:SD卡的插拔事件检测、SD卡挂载、卸载、格式化等。Android存储管理的状态控制主要是在StorageManagerService类中,在8.0之前是MountService类。
- 背景
修改Android8.0 Car版本系统音乐应用,使其能够识别U盘上的音乐。目前只能识别内部存储及SD卡上的音乐。
三、一些弯路
- 与USB HOST无关
前期在网上找的USB HOST相关的资料,首先修改frameworks/native/data/etc/目录的tablet_core_hardware.xml和handheld_core_hardware.xml两个文件,在文件末尾添加<feature name="android.hardware.usb.host" />这句话。但经过验证无效,无法识别USB设备。
四、梳理分析
梳理一下目前的现象:串口中可以打印出usb相关的log,但是android系统识别不了USB设备,接收不到MEDIA_MOUNTED、MEDIA_UNMOUNTED等媒体插拔的广播,StorageManagerService也接收不到VOLUME_STATE_CHANGED等受系统保护的广播。经过一些分析,应该首先验证板子是否支持USB设备。所以想到查看板子参数是否支持。打开设置应用,在Storage栏位,可以看到插入的U盘设备,但是双击U盘设备,发现不支持此存储设备,提示“format as portable storage”,看来需要格式化U盘。按照向导操作之后,在设置中可以识别U盘中的文件了。真是喜出望外。
在此思考一下为什么要格式化U盘呢?格式化前,U盘好像是FAT格式的,格式化后是FAT32格式的,应该是和文件系统有关。在网上看的一些资料说Ntfs适合于磁盘,exfat适用于闪存盘 ,Android适用fat32格式的U盘,对此说法不做保证。
同时,讲一下Android M新功能Adoptable Storage Devices(适配的存储设备)。Adoptable Storage Devices使系统获得了更大的存储容量,并且使用户可以自由移动应用和隐私数据到外部存储设备,不在需要第三方工具。用户使用Android设备时,可以主动的选择把外部存储设备格式化为常规移动存储或者系统内部存储。在格式化时系统给了两种选择:(1)Use as portable storage(for moving photos and other media between divices),仅仅作为外部存储设备;(2)Use as internal storage(for storing anything on this device only,including apps and photos),包裹一个加密层后,能够作为内部存储空间存储应用和隐私数据,经过加密后,该存储设备就不能再被别的设备使用。
五、权限问题
在设置中识别USB设备后高兴的太早。兴冲冲打开系统音乐,发现识别出了U盘,兴奋的点击播放,结果-------------------依然无法播放^_^,提示“localmediaplayer seem to be working right now.”。查看日志,缺少WRITE_EXTERNAL_STORAGE权限。在localmediaplayer系统音乐后台服务的清单文件中添加 WRITE_MEDIA_STORAGE权限后,可以正常的播放U盘上的音乐了。
六、总结
最后,总结一下读取U盘上文件的方案。系统是Android 8.0 Car版本,硬件是renesas开发板。1.在设置中格式化U盘;2.在程序中添加WRITE_EXTERNAL_STORAGE权限。