Android 通过反射调用获取内置存储和外置sd卡根路径(适用于各个版本)

原创 2017年04月10日 16:49:03

        Android系统里版本众多,设备型号众多,所以文件的路径有很多种。获取内存路径的方法有很多,最常见的是EnvironmentFile 里的诸多方法,比如Environment.getDataDirectory()File.getPath()等,以及网上查的形形色色各种方法。但是在不同的Android版本和设备里,这些方法对于获取设备内部存储没什么问题,但是获取SD卡路径往往有问题。后来自己找到个方法,就是通过反射StorageManager获取内外路径,经过多个版本测试,比较好用,所以记录推荐下。

        这个方法的核心是先获取内存管理器,然后用invoke获取所有路径,再根据是否可移除(SD卡可移除,内存不行)获取到不同的路径。具体方法如下:

/**
 * 通过反射调用获取内置存储和外置sd卡根路径(通用)
 *
 * @param mContext    上下文
 * @param is_removale 是否可移除,false返回内部存储,true返回外置sd卡
 * @return
 */
private static String getStoragePath(Context mContext, boolean is_removale) {

    StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
    Class<?> storageVolumeClazz = null;
    try {
        storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
        Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
        Method getPath = storageVolumeClazz.getMethod("getPath");
        Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
        Object result = getVolumeList.invoke(mStorageManager);
        final int length = Array.getLength(result);
        for (int i = 0; i < length; i++) {
            Object storageVolumeElement = Array.get(result, i);
            String path = (String) getPath.invoke(storageVolumeElement);
            boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
            if (is_removale == removable) {
                return path;
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}

        方法很简单,我写了个demo,地址是:http://download.csdn.net/detail/bit_kaki/9809641,不需要积分,可以测试下。

        效果图大概如下:

        这是我手机的效果,型号为荣耀X6-BLN-AL10,Android版本6.0,EMUI4.1(没有SD卡)

        

        这是我的华为平板的效果,型号为HUAWEI M2 =A01W,Android5.1.1,EMUI3.1。


        这是我的三星平板,型号Galaxy Tab S2,SM-T819C,Android版本6.01.


版权声明:本文为博主原创文章,未经博主允许不得转载。

android获取内置和外置SD卡路径

SD卡
  • xtd412
  • xtd412
  • 2016年07月25日 11:43
  • 2368

android获取内置和外置SD卡路径

本文介绍了在android真机环境下如何获取内置和外置SD卡路径。
  • chadeltu
  • chadeltu
  • 2015年02月11日 17:19
  • 33418

解决内置存储不足:把数据包移动到外置sd卡

在android上,并非所有程序都能识别并且把数据包下载到外置sd卡,而内置存储小的手机该怎么办呢?解决方法是,把数据移动外置sd卡再挂载回去!本方法需要root! 代码如下:mount -o bi...
  • y716438031
  • y716438031
  • 2017年03月20日 23:11
  • 943

Android获取外置SD卡读写路径

1. 外置SD卡的一些问题1.1 关于外置SD卡上的读写路径Android 4.4及以上版本,应用的外置SD卡读写路径被限定在固定路径上(外置SD卡根路径/Android/data/包名/files)...
  • tobacco5648
  • tobacco5648
  • 2017年04月21日 14:38
  • 1664

如何正确获得Android内外SD卡路径

忘了这篇文章是在哪里看到了,当时就copy保存了下来,今天转载出来下。 外置sd卡路径,也许很多同学在平时的工作中并不会用到,因为现在很多机型都不支持外置sd卡(这也是Google目标),所以并不用考...
  • u010663758
  • u010663758
  • 2016年05月03日 22:31
  • 7451

Android中访问sdcard路径的几种方式

达人科技 2017-01-03 21:01 以前的Android(4.1之前的版本)中,SDcard路径通过“/sdcard”或者“/mnt/sdcard”来表示,而在JellyBean(安卓4...
  • u011277123
  • u011277123
  • 2017年01月05日 10:36
  • 1494

android获取内置和外置SD卡路径

本文将介绍android真机环境下如何获取内置和外置SD卡路径。 测试环境:三星Note3,其他手机待测试。。。 所需权限(AndroidManifest.xml文...
  • luckypeng
  • luckypeng
  • 2015年05月13日 08:33
  • 8184

Android SD卡简单的文件读写操作

最近有这样的需求,把mei
  • mad1989
  • mad1989
  • 2014年07月08日 18:43
  • 114909

android sdcard各种存储路径解惑

在开发app的过程中,需要保存一些数据,这时就会遇到各种存储路径,sdcard/、storage/sdcard0、mnt/sdcard等等,会让人很难以理解。这其中的很多路径都是指向同一个路径,有点指...
  • Landon_Xu
  • Landon_Xu
  • 2016年02月18日 15:00
  • 2342

Anroid获取内置外置SD卡路径以及读写测试

最近项目有一个新需求是要把应用的大文件下载到外置SD卡,自己研究了一下安卓如何获取内置和外置SD卡路径以及进行文件读写,以下是自己的总结。 在网上找的方法都感觉不太好,比较乱,所以自己就查了一下安卓的...
  • qq_27102463
  • qq_27102463
  • 2016年06月12日 15:41
  • 2359
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 通过反射调用获取内置存储和外置sd卡根路径(适用于各个版本)
举报原因:
原因补充:

(最多只允许输入30个字)