• Android开发获取多个存储空间的路径(内置SD卡以及外置SD卡)


    Android开发中经常会遇到多存储空间的问题,包括内置存储路径以及外置SD卡,而且有的时候会有多张外置SD卡,此时就需要获取不同的SD卡路径,然后根据需要来写入或者读出文件。

    此处给出常用的SD卡工具类,用于获取内外部存储路径。

    /**
     * Created by Travis1022 on 2017/8/8.
     */
    
    public class SdCardUtil {
        /**
         * 获取内置SD卡路径
         *
         * @return
         */
        public static String getInnerSDCardPath() {
            return Environment.getExternalStorageDirectory().getPath();
        }
    
        /**
         * 获取存储路径
         * @return 所有可用于存储的不同的卡的位置,用一个List来保存
         */
        public static List<String> getExtSDCardPathList() {
            List<String> paths = new ArrayList<String>();
            String extFileStatus = Environment.getExternalStorageState();
            File extFile = Environment.getExternalStorageDirectory();
            //首先判断一下外置SD卡的状态,处于挂载状态才能获取的到
            if (extFileStatus.equals(Environment.MEDIA_MOUNTED) && extFile.exists() && extFile.isDirectory() && extFile.canWrite()) {
                //外置SD卡的路径
                paths.add(extFile.getAbsolutePath());
            }
            try {
                Runtime runtime = Runtime.getRuntime();
                Process process = runtime.exec("mount");
                InputStream is = process.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line = null;
                int mountPathIndex = 1;
                while ((line = br.readLine()) != null) {
                    // format of sdcard file system: vfat/fuse
                    if ((!line.contains("fat") && !line.contains("fuse") && !line
                            .contains("storage"))
                            || line.contains("secure")
                            || line.contains("asec")
                            || line.contains("firmware")
                            || line.contains("shell")
                            || line.contains("obb")
                            || line.contains("legacy") || line.contains("data")) {
                        continue;
                    }
                    String[] parts = line.split(" ");
                    int length = parts.length;
                    if (mountPathIndex >= length) {
                        continue;
                    }
                    String mountPath = parts[mountPathIndex];
                    if (!mountPath.contains("/") || mountPath.contains("data")
                            || mountPath.contains("Data")) {
                        continue;
                    }
                    File mountRoot = new File(mountPath);
                    if (!mountRoot.exists() || !mountRoot.isDirectory()
                            || !mountRoot.canWrite()) {
                        continue;
                    }
                    boolean equalsToPrimarySD = mountPath.equals(extFile
                            .getAbsolutePath());
                    if (equalsToPrimarySD) {
                        continue;
                    }
                    //扩展存储卡即TF卡或者SD卡路径
                    paths.add(mountPath);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return paths;
        }
    
    }
    getInnerSDCardPath()即为直接获取内部存储空间的路径,而对应的getExtSDCardPathList()用于获取所有的存储路径,也包含内部存储路径。

    效果如下:

                                

       对应的日志如下:

                                 E/Logger: [ (SdCardUtil.java:98)#main ] 路径:/storage/emulated/0
                                 E/Logger: [ (SdCardUtil.java:98)#main ] 路径:/storage/uicc0
                                 E/Logger: [ (SdCardUtil.java:98)#main ] 路径:/storage/sdcard1

    
    
  • 相关阅读:
    SQL WHERE 子句:语法及案例剖析
    SQL SELECT DISTINCT 语句:语法及案例剖析
    SQL SELECT 语句:语法与案例剖析
    SQL 语法:一些最重要的 SQL 命令简介
    SQL 简介:什么是SQL,SQL能做什么
    mybatis 注解开发
    mybatis 缓存
    mybatis 延迟加载策略
    mybatis的多表查询
    mybatis 的动态 SQL 语句
  • 原文地址:https://www.cnblogs.com/xuanwei-qingfeng/p/7308159.html
Copyright © 2020-2023  润新知