Android FileProvider应用之间共享数据

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

像我们的应用安装更新,利用相机拍照然后进行图片处理,或者把文件分享给其他应用,可能都会用到这些知识点

类似于这样

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_storage_root" path="."/>
    <files-path path="." name="files" />
    <cache-path path="." name="cache"  />
</paths>

FileProvider所支持的几种path类型

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

<files-path path="." name="camera_photos" />

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

<cache-path name="name" path="path" />

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

<external-path name="name" path="path" />

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

<external-files-path name="name" path="path" />

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

<external-cache-path name="name" path="path" />

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

使用方式就是这样

  1. 在AndroidManifest的application下面注册
  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="me.richard.note.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
  </provider>
  1. 编写path文件
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_storage_root" path="."/>
    <files-path path="." name="files" />
    <cache-path path="." name="cache"  />
</paths>
  1. 调用方式(此处以安装更新为例)
private void installApk() {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID + ".provider", new File(savePath));
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
            PalmApp.getContext().startActivity(intent);
        }else {
            intent.setDataAndType(Uri.fromFile(new File(savePath)), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
    }

savaPath为apk存放的路径,此处放到了应用下files文件夹,也就是

savaPath = getContext().getFilesDir().getAbsolutePath() +"/update.apk"

注意

  1. android:authorities的配置一定要和FileProvider.getUriForFile()方法的第二个参数一致
  2. BuildConfig.APPLICATION_ID不要导错了包,用当前应用下面的BuildConfig
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 178,872评论 25 709
  • 文章内容转载自Android 7.0 行为变更 通过FileProvider在应用间共享文件吧 - CSDN博客 ...
    暴躁的西瓜阅读 2,429评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,533评论 19 139
  • 第一章:悲.喜 “你可以走,小宇必须给我留下” “不要,我和小宇不能分开,小宇必须要我带走” ……… “晴啊,别担...
    朴千晗阅读 608评论 0 0
  • 多日的雾霾终于过去,今天的天空分外的清澈和祥静,金色的阳光重新挥洒着每一粒的光芒飘荡在冬日的大地上,润泽着大地上...
    平凡的绿箩阅读 376评论 2 1

友情链接更多精彩内容