原文链接: https://my.oschina.net/u/1177694/blog/3074297

随着Android版本越来越高,Android官方对用户数据保护力度也越来越大。Android提供FileProvider类来供应用之间共享数据。

如:

        ...

FileProvider所支持的几种path类型

从Android官方文档上可以看出FileProvider提供以下几种path类型:

该方式提供在应用的内部存储区的文件/子目录的文件。它对应Context.getFilesDir返回的路径:eg:”/data/data/com.jph.simple/files”。

该方式提供在应用的内部存储区的缓存子目录的文件。它对应getCacheDir返回的路径:eg:“/data/data/com.jph.simple/cache”;

该方式提供在外部存储区域根目录下的文件。它对应Environment.getExternalStorageDirectory返回的路径:eg:”/storage/emulated/0”;

该方式提供在应用的外部存储区根目录的下的文件。它对应Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)返回的路径。eg:”/storage/emulated/0/Android/data/com.jph.simple/files”。

该方式提供在应用的外部缓存区根目录的文件。它对应Context.getExternalCacheDir()返回的路径。eg:”/storage/emulated/0/Android/data/com.jph.simple/cache”。

以上便是Android官方文档上介绍的FileProvider所有支持的所以path类型,这些类型在Android手机内部存储区文件共享是可以行的通的,但对于外置SD卡是不行的,如果你想通过FileProvider.getUriForFile()获取一个外置SD卡的Uri则会报出如下异常:

FileProvider获取对外置SD卡的支持

从Android官方文档中没有找到FileProvider对外置SD卡的支持的任何说明,下面我们就从FileProvider的源码中找找是否有突破口,在FileProvider的源码源码中发现下面一段代码:

 private static PathStrategy parsePathStrategy(Context context, String authority)        ...        int type;        while ((type = in.next()) != END_DOCUMENT) {            if (type == START_TAG) {                final String tag = in.getName();                final String name = in.getAttributeValue(null, ATTR_NAME);                String path = in.getAttributeValue(null, ATTR_PATH);                File target = null;                if (TAG_ROOT_PATH.equals(tag)) {                    target = buildPath(DEVICE_ROOT, path);                } else if (TAG_FILES_PATH.equals(tag)) {                    target = buildPath(context.getFilesDir(), path);                } else if (TAG_CACHE_PATH.equals(tag)) {                    target = buildPath(context.getCacheDir(), path);                } else if (TAG_EXTERNAL.equals(tag)) {                    target = buildPath(Environment.getExternalStorageDirectory(), path);                }                if (target != null) {                    strat.addRoot(name, target);                }            }        }        return strat;    }

从上述代码中可以看出FileProvider支持的path类型中有个TAG_ROOT_PATH,它对应的值为root-pathroot-path在Android官方文档中是没有提及的,但我们不妨试一下,将FileProvider的path设置成root-path,看能否支持外置SD卡:

<?xml version="1.0" encoding="utf-8"?>                

然后我们能将在FileProvider类中设置断点,查看root-path 究竟代表什么:

从上图可以看出root-path代表/也就是Android设备的根目录,该目录下包含着手机内部存储器,外置SD卡等所有文件的目录。

然后我们允许程序,发现将path设置为root-path解决了FileProvider无法使用外置SD卡的问题。

最后

既然来了,留下个喜欢再走吧,鼓励我继续创作(^_^)∠※

如果喜欢我的文章,那就关注我的博客@ devio.org吧,让我们一起做朋友~~

戳这里,加关注哦:

微博:第一时间获取推送 
个人博客:干货文章都在这里哦
GitHub:我的开源项目

转载于:https://my.oschina.net/u/1177694/blog/3074297

更多相关文章

  1. MAC OS 下使用Android(安卓)Studio获取SHA1证书
  2. Android--把文件发送给另一个设备
  3. 详解Android系统中的root权限获得原理
  4. android apk 为程序增加代码混淆
  5. Android(安卓)基于Http协议的文件上传
  6. Android(安卓)获取Root权限 详细图解
  7. 在Ubuntu上下载、编译和安装Android最新源代码(转载)
  8. android资源文件详解
  9. Android(安卓)NDK 环境配置

随机推荐

  1. net framework重要吗
  2. c语言while循环例子
  3. c语言中除号用什么表示
  4. net framework 4.0安装未成功原因是hresu
  5. C 语言中 strlen 是什么意思?
  6. c语言如何定义字符串数组
  7. c语言统计字符串中各个字符的个数
  8. c语言实现向有序数组中插入一个数并保持
  9. c++中main函数的返回值类型是什么
  10. c++是什么意思