关于SD卡兼容问题

原创 2016年08月29日 20:43:14
#最新发现,国内外机型SD卡路径问题简直时可怕,各种无法兼容,目前根据网上资料

现已修改兼容一下版本:
-4.4,5.0,5.1,6.0版本,其中国内只测国5.1版本的,其他为国外机型,需要自测!

  String currentDir;
  String storagePath;
  // 6.0以上版本进行测试路径
        if (Build.VERSION.SDK_INT >Build.VERSION_CODES.LOLLIPOP_MR1) {
            if (storagePath == null) {
                //内置路径
                currentDir =Environment.getExternalStorageDirectory().getAbsolutePath();
            } else {
                //外置路径
                storagePath=getStoragePath(mActivity, true);
            }
        } else {
        //6.0一下版本
            if ( getPath().equals("/mnt/shell/emulated")) {
                //内置路径
                currentDir =Environment.getExternalStorageDirectory().getAbsolutePath();
            } else {
                storagePath=getPath();
           }
        }



##return 有外置sd卡返回/mnt/media_rw/sdcard1,无外置返回/mnt/shell/emulated!
 public  String getPath() {
        String sdcard_path = null;
        String sd_default = Environment.getExternalStorageDirectory()
                .getAbsolutePath();
        if (sd_default.endsWith("/")) {
            sd_default = sd_default.substring(0, sd_default.length() - 1);
        }
        // 得到路径
        try {
            Runtime runtime = Runtime.getRuntime();
            Process proc = runtime.exec("mount");
            InputStream is = proc.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            String line;
            BufferedReader br = new BufferedReader(isr);
            while ((line = br.readLine()) != null) {
                if (line.contains("secure"))
                    continue;
                if (line.contains("asec"))
                    continue;
                if (line.contains("fat") && line.contains("/mnt/")) {
                    String columns[] = line.split(" ");
                    if (columns != null && columns.length > 1) {
                        if (sd_default.trim().equals(columns[1].trim())) {
                            continue;
                        }
                        sdcard_path = columns[1];
                    }
                } else if (line.contains("fuse") && line.contains("/mnt/")) {
                    String columns[] = line.split(" ");
                    if (columns != null && columns.length > 1) {
                        if (sd_default.trim().equals(columns[1].trim())) {
                            continue;
                        }
                        sdcard_path = columns[1];
                    }
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return sdcard_path;
    }


public  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;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

关于SD卡兼容问题

# 最近发现,国内外机型SD卡路径问题简直时可怕,各种无法兼容,目前根据网上资料现已修改兼容一下-4.4,5.0,5.1,6.0版本,其中国内只测国5.1版本的,其他为国外机型,需要自测! Stri...

关于IE8兼容问题

IE8 Beta2 的BUG实在太多了,界面比IE7更加丑陋和臃肿。这都是表面上的东西,而内在呢?我们总是为MS修复网页,而不是MS为网页修复IE微软的开发团队是不是想太多了?IE8不是为了解决问题而...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

web前端兼容问题

浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。碰到频率:100%解决方案:CSS里 *{...

transform兼容ie8

其他浏览器正常写法: transform:rotate(-30deg);  -ms-transform:rotate(-30deg);  -o-tranform:rotate(-30deg)...

window.event 兼容 问题

window.event问题 问题说明:window.event 只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用。 解决方法:在事件发生的函...

定义文档兼容性

.NET Framework 3.0 更新日期: 2009 年 2 月 文档兼容性可定义 Internet Explorer 呈现网页的方式。 本文将介绍文档兼容性、如...

轻松搞定各版本IE兼容问题,IE6,IE7,IE8,IE9,IE10,IE11

在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案,Google也给出了解决方案,百度也应用了这种方案去解决IE的兼容问题。解决这种兼容问题只需要一行代码就可以了,先来看下百度...

让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法

之前给政府部门做项目,没先到他们还在用ie8,没办法,找了很多方法,发现这篇博客不错 博客来自:http://blog.csdn.net/chenhongwu666/article/details/4...

IE兼容模式及客户端兼容模式、服务器端兼容模式设置

IE兼容模式:  为了帮助确保网页在将来的 Internet Explorer 版本中具有一致的外观,Internet Explorer 8 引入了文档兼容性。文件兼容性用于定义IE如何渲染网页...

清除浮动的几种方法

本文主要内容 本文主要介绍css浮动带来的影响以及清除浮动的几种方法 做横向布局时我们一般会写如下的代码进行布局 ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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