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卡是否卸载,已经验证20个机型左右

这个问题苦恼了好久。我这里有大约20台不同厂商的机器,包括平板和手机。 最后,我这个方案,是从网上的方法总结得出的。目前我这里的这20台机器已经测试通过。如果各位同仁发现不支持的机型,麻烦把机型说一...

获取手机SD卡路径之爬坑解决方案

android 系统是开源的,于是各种产商各种瞎改android系统 ,导致不同版本的手机的SD卡的路径千奇百怪。三星,HTC…等比较特殊。有时候让我们Android程序员感到很迷茫,不得不怀疑自己的...

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

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

android得到外置sd卡路径和判断外置sd卡是否卸载

From:http://blog.csdn.net/com314159/article/details/22859059

Android 总结外置 内置SD卡路径问题

我们先来看下android5.1 init.rc中 mkdir /mnt/shell/emulated 0700 shell shell mkdir /storage/emulate...

Android获取不同手机 自身存储和外置SD卡存储路径的解决方案

最近在给一个应用里面做一个内置的文件管理器,期间遇到一个问题,就是选择不同手机的sd卡存储和手机本身存储。可以在两者之间来回切换,经过一系列测试发现,现在的很多手机厂家定制的手机内存和sd卡内存的路径...

android 获得手机外插SD卡 存储路径和存储空间

获取存储路径: /** * * * Description: 获取手机外插SD 存储路径 * * @date 2017-4-18 * ...

Android 内部存储(外置SD卡)和扩展存储卡(TF卡)路径的获取

废话少说,上代码! 1,获取内置存储和外置SD卡的方法类 /** * 获取外置SD卡路径 * * 返回的数据:paths.get(0)肯定是外置SD卡的位置,因为它是...

android 获取外置SD卡的路径(非挫版)

android  未提供获取外置SD储存卡的相应函数或方法,但我们可以自己写一个。当前只能用Environment.getExternalStorageDirectory()获取内置的SD卡路径,因为...
  • bbmiku
  • bbmiku
  • 2012-09-03 14:31
  • 18573

AR Camera开发记录(三) -- 替换人脸贴图

上一篇文章介绍了动态修改3D人脸模型的顶点要注意的问题。 结合人脸检测技术,根据人脸关键点实时修改顶点坐标,就能让3D人脸模型跟随自己的面部变化了。 这时候如果想让3D人脸模型换一张脸呢? 其中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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