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

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

        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.


没有更多推荐了,返回首页