随着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则会报出如下异常:

Caused by- java.lang.IllegalArgumentException- Failed to find configured root that contains
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-path,root-path在Android官方文档中是没有提及的,但我们不妨试一下,将FileProvider的path设置成root-path,看能否支持外置SD卡:

更多相关文章

  1. android探索之UID u0_axxx的由来
  2. Android(安卓)内容提供器---创建内容提供器(元素)
  3. 在Android的c/c++代码中使用LOG
  4. 谈谈Android的so
  5. Android开发指南-框架主题-内容提供器
  6. 关于android 4.4 以上写入外部存储卡
  7. android应用开发入门
  8. Android(安卓)Studio中获取sha1证书指纹数据的方法
  9. Android开发之数据存储之二:SQLite数据库存储方式【免费提供源码

随机推荐

  1. Android中如何获取Bitmap(总结)
  2. Android实验一(在Android(安卓)Studio中创
  3. 下拉刷新相关
  4. Android(安卓)修改Camera拍照的默认保存
  5. 阿里云面试(android)
  6. Android程序中任意位置获取Context
  7. Android(安卓)获取未读未接来电和未读短
  8. android 任务和返回堆栈(Tasks and Back S
  9. 基于安卓5.0 material design仿ios界面简
  10. Android(安卓)Studio个性化主题,打造一个