主动获取U盘路径的方式

     在做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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值