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.


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bit_kaki/article/details/69950910

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

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

Android获取内外SD卡路径

外置sd卡路径,也许很多同学在平时的工作中并不会用到,因为现在很多机型都不支持外置sd卡(这也是Google目标),所以并不用考虑外置sd卡的路径问题。除了开发文件管理类的应用之外,其他应用使用 En...
  • u010838555
  • u010838555
  • 2016-06-29 15:38:33
  • 6408

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

以前的Android(4.1之前的版本)中,SDcard路径通过“/sdcard”或者“/mnt/sdcard”来表示,而在JellyBean(安卓4.1)系统中修改为了" /storage/sdca...
  • panhouye
  • panhouye
  • 2017-01-03 19:13:37
  • 5064

Android获取SDCard路径/Android获取存储器挂载点

  • 2016年07月30日 14:16
  • 6.72MB
  • 下载

Android 准确获取外置存储卡路径的方法

获取存储卡路径的接口大家都很熟悉,一般是通过 Environment 接口来获取: String sdcardPath = Environment.getExternalStorageDirector...
  • liuxu0703
  • liuxu0703
  • 2016-12-27 19:20:23
  • 3749

Android6.0 平台应用获取外置sd卡路径

 Android6.0 上会根据卡的种类和卡的挂载状态来动态生成挂载路径,因此不建议大家在按照以前的方法获取外置SD卡或者usbotg的路径,建议按照以下方法来获取:     ...
  • kc58236582
  • kc58236582
  • 2016-01-15 16:30:40
  • 11655

Android 获取SD卡路径和判断SD卡是否存在

android获取sd卡路径方法: 不建议直接写死android sd卡的路径。  public String getSDPath(){ File sdDir = null; bool...
  • chaoyu168
  • chaoyu168
  • 2016-01-18 14:24:02
  • 11134

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

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

android sd卡路径正确获取 双sd卡获取

/**      * 获取手机自身内存路径      *       */ public static String getPhoneCardPath(){ return Environme...
  • wulongtiantang
  • wulongtiantang
  • 2014-02-18 10:43:52
  • 17968
收藏助手
不良信息举报
您举报文章:Android 通过反射调用获取内置存储和外置sd卡根路径(适用于各个版本)
举报原因:
原因补充:

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