Wons' Blog

个人博客

Android程序猿


回首向来萧瑟处,也无风雨也无晴

Android获取外置SD卡读写路径

1. 外置SD卡的一些问题

1.1 关于外置SD卡上的读写路径

Android 4.4及以上版本,应用的外置SD卡读写路径被限定在固定路径上(外置SD卡根路径/Android/data/包名/files)。

Android4.4以下版本,申请了外置SD卡读写权限的应用在整个外置SD卡上都有读写权限。

1.2 关于外置SD卡路径

另外Android没有提供获取外置SD卡路径的API(getExternalStorageDirectory()获取的实际是内置SD卡路径)。

2. 获取应用在外置SD卡读写根路径

Android 4.4以下版本,获取的应该是外置SD卡的根目录(类似/storage/sdcard1)。在Android 4.4及以上版本,获取的是应用在SD卡上的限定目录(外置SD卡根路径/Android/data/包名/files/file)

代码如下:


    public static String getExternalSDPath(Context aContext) {
        String root = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            root = getExternalSDPathKITKAT(aContext);
            File f = new File(root);
            if (!f.exists()) {
                try {
                    f.mkdirs();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (!f.exists()) {
                    root = null;
                }
            }
        } else {
            root = getExternalSDCardPath(aContext);
        }
        return root;
    }


    // Android 4.4及以上版本,获取软件在外置SD卡上的保存路径
    public static String getExternalSDPathKITKAT(Context aContext) {
        String rootPath = getStoragePath(aContext, true);
        if (TextUtils.isEmpty(rootPath)) {
            return null;
        }
        File f = new File(rootPath, "Android/data/" + aContext.getPackageName() + "/files/file");
        String fpath = f.getAbsolutePath();
        return fpath;
    }

    // Android 4.4 以下版本获取外置SD卡根目录
    public static String getExternalSDCardPath(Context aContext) {
        HashSet<String> paths = getExternalMounts();
        File defaultPathFile = aContext.getExternalFilesDir(null);
        String defaultPath;
        if (defaultPathFile == null) {
            return null;
        } else {
            defaultPath = defaultPathFile.getAbsolutePath();
        }
        String prefered = null;
        for (Iterator it = paths.iterator(); it.hasNext();) {
            String path = (String) (it.next());
            if (prefered == null && !defaultPath.startsWith(path)) {
                prefered = path;
            }
        }
        return prefered;
    }
最近的文章

使用Digital Ocean搭建Shadowsocks代理服务器

由于 GFW 的限制,国内对一些海外网站的访问受到限制,使用代理是一种常见的突破方式,但是可用的免费代理很少并且服务不稳定,收费代理比较昂贵并且高峰时段偶尔带宽很低甚至不可用。如果希望有高可用并且带宽稳定的代理服务器,使用海外云主机自己搭建是一种比较好的途径。笔者使用过不同的云主机商(阿里云香港、美国节点;腾讯云香港、美国节点;Digital Ocean 美国节点)的云主机,以及不同的代理服务器( PPTP、L2TP、OpenVPN、Shadowsocks)。最终从价格、性能、带宽、稳定性...…

Shadowsocks继续阅读
更早的文章

Android防止Service被杀死

1. Service被杀死的两种场景1.2 系统回收在系统内存空间不足时可能会被系统杀死以回收内存,内存不足时Android会依据Service的优先级来清除Service。1.2 用户清除用户可以在”最近打开”(多任务窗口、任务管理窗口)中清除最近打开的任务,当用户清除了Service所在的任务时,Service可能被杀死(不同ROM有不同表现,在小米、魅族等第三方产商定制ROM上一般会被立即杀死,在Android N上没有被立即杀死)。2. 解决方案对于第一种场景(系统回收),如果不用...…

Android继续阅读