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

来源:互联网 发布:淘宝宝贝详情文字描述 编辑:程序博客网 时间:2024/04/30 11:56

        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.


0 0
原创粉丝点击