赞
踩
在做Android多媒体开发的过程中,我们会经常与USB外部设备之间进行通讯,获取USB上的音乐视频文件,进行播放,这在互联网应用中可能会涉及少些,但是做过车载Android开发的应该都知道,基本每一款车的中控上面都有本地USB音乐这个应用,因此都会有获取USB设备上面的音乐,视频文件播放,下面就我在开发中遇到的获取到的u盘路径无法读写问题做下记录。
基本上我们开发每个功能都是要保证需要主动获取和被动接收同时使用,才能不会导致拿到的信息不是最新的或者是没有的,usb读取视频,音乐文件也是一样,也需要主动获取,或者被动通过广播监听进行接收,关于被动广播监听获取u盘路径进行播放,这里就不多介绍,网络上有很多,这里主要是讲下主动获取(因为广播监听只有注册了广播才会收到,所以在开机起来就连好USB或者在应用还没有注册广播时候USB就已经连上了,这个时候需要主动获取U盘路径再去获取U盘视频音乐文件),下面是采用反射的原理去获取U盘路径:
- public String getUsbPath() {
- try {
- StorageManager storageManager = (StorageManager) HudMessageManager.getInstance().getContext().getSystemService(Context.STORAGE_SERVICE);
- Class storeManagerClazz = Class.forName("android.os.storage.StorageManager");
- Method getVolumesMethod = storeManagerClazz.getMethod("getVolumes");
- List<?> volumeInfos = (List<?>) getVolumesMethod.invoke(storageManager);
- Class volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo");
- Field udiskPath = volumeInfoClazz.getDeclaredField("internalPath");
- Method getFsUuidMethod = volumeInfoClazz.getMethod("getFsUuid");
- if (volumeInfos != null) {
- for (Object volumeInfo : volumeInfos) {
- String uuid = (String) getFsUuidMethod.invoke(volumeInfo);
- if (uuid != null) {
- String sUdiskPath = (String) udiskPath.get(volumeInfo); // 结果是 /mnt/media_rw/28BA-794A
- if (!TextUtils.isEmpty(sUdiskPath) && sUdiskPath.startsWith("/mnt/media_rw")) {
- return sUdiskPath.replace("/mnt/media_rw", "/storage");
- }
- return sUdiskPath;
- }
- }
- }
- } catch (Exception e) {
- HudMessageUtils.sdkLog(" check udisk error = " + e.getMessage());
- }
- return usbPath;
- }

特别要注意的是通过(String) udiskPath.get(volumeInfo)获取到的路径是/mnt/media_rw/28BA-794A(28BA-794A是U盘的uuid),通过这个路径去读U盘上面的文件是没有可读写权限的,需要修改为/storage/28BA-794A。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。