Android之外部存储设备监听

区分外置U盘及TF卡

最近有个项目有内置SD卡同时又保留了USB及sd卡口,由于要计算外置存储设备的空间,尝试了几个方法均不理想最终使用如下方法 可以成功的区分外置设备是U盘还是SD卡。

主要通过如下方法区分U盘及TF卡

1 @SuppressLint("PrivateApi") 2 private String getStoragePath(Context context, boolean isUsb){ 3 4 5 String path=""; 6 StorageManager mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); 7 Class<?> volumeInfoClazz; 8 Class<?> diskInfoClaszz; 9 try { 10 11 12 volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo"); 13 diskInfoClaszz = Class.forName("android.os.storage.DiskInfo"); 14 Method StorageManager_getVolumes=Class.forName("android.os.storage.StorageManager").getMethod("getVolumes"); 15 Method VolumeInfo_GetDisk = volumeInfoClazz.getMethod("getDisk"); 16 Method VolumeInfo_GetPath = volumeInfoClazz.getMethod("getPath"); 17 Method DiskInfo_IsUsb = diskInfoClaszz.getMethod("isUsb"); 18 Method DiskInfo_IsSd = diskInfoClaszz.getMethod("isSd"); 19 List<Object> List_VolumeInfo = (List<Object>) StorageManager_getVolumes.invoke(mStorageManager); 20 assert List_VolumeInfo != null; 21 for(int i=0; i<List_VolumeInfo.size(); i++){ 22 23 24 Object volumeInfo = List_VolumeInfo.get(i); 25 Object diskInfo = VolumeInfo_GetDisk.invoke(volumeInfo); 26 if(diskInfo==null)continue; 27 boolean sd= (boolean) DiskInfo_IsSd.invoke(diskInfo); 28 boolean usb= (boolean) DiskInfo_IsUsb.invoke(diskInfo); 29 File file= (File) VolumeInfo_GetPath.invoke(volumeInfo); 30 if(isUsb == usb){ 31 32 //usb 33 assert file != null; 34 path=file.getAbsolutePath(); 35 }else if(!isUsb == sd){ 36 37 //sd 38 assert file != null; 39 path=file.getAbsolutePath(); 40 } 41 } 42 } catch (Exception e) { 43 44 45 YYLog.print(TAG, "[——————— ——————— Exception:"+e.getMessage()+"]"); 46 e.printStackTrace(); 47 } 48 return path; 49 }
点赞
收藏

评论区

加载中...

相关推荐

Android Fastboot 与 Recovery 和刷机 千山万水迷了鹿

1\.首先来看下Android系统的分区:Android系统的分区.jpgAndroid分区解释.png安卓系统一般把rom芯片分成7个区,如果再加上内置sd卡这个分区,就是8个:hboot分区负责启动。radio分区负责驱动。recovery分区负责

Android 解决NestedScrollView 嵌套 RecyclerView出现的卡顿,上拉刷新无效

解决卡顿的方法最简单的就是设置RecyclerView的android:nestedScrollingEnabled"false",放弃自己的滑动,交给外部的NestedScrollView处理,就没有出现卡顿的现象了至于RecyclerView的上拉刷新,可以监听NestedScrollView的滑动监听,具体代码如下:mNestedSc

Android入门:使用Android自带媒体库读取MP3文件

今天研究了下如何在Android读取SD卡中的媒体文件(MP3),开始的思路是遍历SD卡所有目录,相信这也是所有开发者第一会想到的思路,无法就是遍历所有文件,将所有后缀名为.mp3读取出来;但是最后发现,如果你对Android稍有了解,你会发现,其实媒体扫描这个工作,Android设置已经替我们干了,Android系统会在SD卡有更新的时候自动将SD卡文件分

ANDROID解析JSON数据

这一个环节可以说是卡的比较久的了。对于用惯了php那样的json解析方式的我,头一次使用JAVA的json解析方法,感到非常的头疼。首先,服务端返回的数据格式如下:    {        "title":"\u8bdd\u8d39\u514d\u8d39\u62bd",        "aname":"\u8

Deepin系统安装

前一阵,我想把deepin15.10系统装在我的U盘上,首先你的用2个U盘,一个是安装盘,一个U盘是当你想安装到的硬盘,如果一个U盘的话写入时没用的,他也不能自己把自己分区,执行安装了。硬盘模式,我用的是MBR,貌似GPT也可以,还更好用!我还没来得及实践。安装成功了也没什么问题,HDMI显示器我的不显示,解决方法是$xrandrli

Linux SD卡建立两个分区

本文主要介绍Linux环境下SD卡建立两个分区的操作流程:操作环境:LinuxUbuntu2016.4操作目的:将SD卡分为两个分区:第一分区格式为FAT32,大小500M。第二个分区为ext4,占剩下的所有空间,用来装Ubuntu的文件系统具体操作如下;一.使用lsblk或者fd

Android之外部存储设备监听 - HelloWorld