Android之外部存储设备监听

Stella981
• 阅读 853

区分外置U盘及TF卡

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

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

    @SuppressLint("PrivateApi")
    private String getStoragePath(Context context, boolean isUsb){
   
   
        String path="";
        StorageManager mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
        Class<?> volumeInfoClazz;
        Class<?> diskInfoClaszz;
        try {
   
   
            volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo");
            diskInfoClaszz = Class.forName("android.os.storage.DiskInfo");
            Method StorageManager_getVolumes=Class.forName("android.os.storage.StorageManager").getMethod("getVolumes");
            Method VolumeInfo_GetDisk = volumeInfoClazz.getMethod("getDisk");
            Method VolumeInfo_GetPath = volumeInfoClazz.getMethod("getPath");
            Method DiskInfo_IsUsb = diskInfoClaszz.getMethod("isUsb");
            Method DiskInfo_IsSd = diskInfoClaszz.getMethod("isSd");
            List<Object> List_VolumeInfo = (List<Object>) StorageManager_getVolumes.invoke(mStorageManager);
            assert List_VolumeInfo != null;
            for(int i=0; i<List_VolumeInfo.size(); i++){
   
   
                Object volumeInfo = List_VolumeInfo.get(i);
                Object diskInfo = VolumeInfo_GetDisk.invoke(volumeInfo);
                if(diskInfo==null)continue;
                boolean sd= (boolean) DiskInfo_IsSd.invoke(diskInfo);
                boolean usb= (boolean) DiskInfo_IsUsb.invoke(diskInfo);
                File file= (File) VolumeInfo_GetPath.invoke(volumeInfo);
                if(isUsb == usb){
   
   //usb
                    assert file != null;
                    path=file.getAbsolutePath();
                }else if(!isUsb == sd){
   
   //sd
                    assert file != null;
                    path=file.getAbsolutePath();
                }
            }
        } catch (Exception e) {
   
   
            YYLog.print(TAG, "[——————— ——————— Exception:"+e.getMessage()+"]");
            e.printStackTrace();
        }
        return path;
    }
点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Android Fastboot 与 Recovery 和刷机 千山万水迷了鹿
1\.首先来看下Android系统的分区:Android系统的分区.jpgAndroid分区解释.png安卓系统一般把rom芯片分成7个区,如果再加上内置sd卡这个分区,就是8个:hboot分区负责启动。radio分区负责驱动。recovery分区负责
Stella981 Stella981
3年前
Android 解决NestedScrollView 嵌套 RecyclerView出现的卡顿,上拉刷新无效
解决卡顿的方法最简单的就是设置RecyclerView的android:nestedScrollingEnabled"false",放弃自己的滑动,交给外部的NestedScrollView处理,就没有出现卡顿的现象了至于RecyclerView的上拉刷新,可以监听NestedScrollView的滑动监听,具体代码如下:mNestedSc
Stella981 Stella981
3年前
Android入门:使用Android自带媒体库读取MP3文件
今天研究了下如何在Android读取SD卡中的媒体文件(MP3),开始的思路是遍历SD卡所有目录,相信这也是所有开发者第一会想到的思路,无法就是遍历所有文件,将所有后缀名为.mp3读取出来;但是最后发现,如果你对Android稍有了解,你会发现,其实媒体扫描这个工作,Android设置已经替我们干了,Android系统会在SD卡有更新的时候自动将SD卡文件分
Wesley13 Wesley13
3年前
ANDROID解析JSON数据
这一个环节可以说是卡的比较久的了。对于用惯了php那样的json解析方式的我,头一次使用JAVA的json解析方法,感到非常的头疼。首先,服务端返回的数据格式如下:    {        "title":"\u8bdd\u8d39\u514d\u8d39\u62bd",        "aname":"\u8
Stella981 Stella981
3年前
Deepin系统安装
前一阵,我想把deepin15.10系统装在我的U盘上,首先你的用2个U盘,一个是安装盘,一个U盘是当你想安装到的硬盘,如果一个U盘的话写入时没用的,他也不能自己把自己分区,执行安装了。硬盘模式,我用的是MBR,貌似GPT也可以,还更好用!我还没来得及实践。安装成功了也没什么问题,HDMI显示器我的不显示,解决方法是$xrandrli
Stella981 Stella981
3年前
Linux SD卡建立两个分区
本文主要介绍Linux环境下SD卡建立两个分区的操作流程:操作环境:LinuxUbuntu2016.4操作目的:将SD卡分为两个分区:第一分区格式为FAT32,大小500M。第二个分区为ext4,占剩下的所有空间,用来装Ubuntu的文件系统具体操作如下;一.使用lsblk或者fd
Stella981 Stella981
3年前
Android加载SD卡目录,文件夹遍历,图片设置,设置文件对应打开方式等
此案例主要说的是Android使用GridView加载SD卡下所有目录,文件夹多层遍历,文件图标修改,设置文件对应打开方式等功能。如图:    !(https://static.oschina.net/uploads/space/2017/0103/150534_HRds_2945455.gif)publicclassGr
公孙晃 公孙晃
1年前
苹果机系列数据恢复工具:Disk Drill for Mac中文版 支持M1
DiskDrill是一款数据恢复工具,可以帮助用户轻松恢复误删的文件/软件数据。它支持多种数据恢复算法,可以读取NTFS,FAT32,EXT,HFS和其他文件系统。DiskDrill可以恢复在系统硬盘和外部设备、SD卡和U盘、其他笔记本电脑和计算机上误删
绣鸾 绣鸾
1年前
Aiseesoft Data Recovery for mac数据恢复软件
是一款专业的数据恢复软件,可帮助Mac用户从各种数据丢失情况中恢复文件。它支持从各种设备和存储介质中恢复数据,包括硬盘、闪存驱动器、SD卡等。AIseesoftMacDataRecovery具有直观的用户界面,并提供了多种扫描模式(快速扫描、深度扫描),以