IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android日常开发 - Android7.0获取文件Uri -> 正文阅读

[移动开发]Android日常开发 - Android7.0获取文件Uri

Android日常开发 - Android7.0获取文件Uri

本文约3千字,新手阅读需要6分钟,复习需要3分钟收藏随时查阅不再迷路

👉关于作者

已经工作三年的95后程序员,坐标上海。平时在公司写Android原生App,业务时间会抽空学习Java后端,目标是成为全栈工程师,志同道合的可以私我聊聊haha。加入CSDN快4年了,看了很多优秀作者的博客收获很多。后面的时间里,我写也会整理总结一些工作中使用到的知识分享出来。我的座右铭:人生在勤,不索何获。大家一起努力加油吧

👉正文部分

众所周知,Android7.0之前获取文件的Uri直接调用Uri.parse(path)即可,生成的Uri是file://xx/xx,也就是文件的本地真实路径。Android7.0后不再允许传递本地真实路径,因为这样不安全,并且给出解决方案,使用FileProvider选择性地将封装过的Uri分享给外部,从而提供应用的安全性

1、新建一个file_paths.xml,在/res/xml目录下

这个文件的作用是用来指定共享路径

1、文件的根标签是paths,下面介绍了所有的子标签,平常使用选择一个子标签进行配置即可!

<paths>
  <!--root-path对应根目录/,一般不需要配置-->
  <root-path name="" path=""></root-path>
  
  <!--files-path对应context.getFileDir(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content://packageName.fileprovide/my_image/filename;path表示共享的目录,如果是images/,表示共享context.getFileDir()/images/--> 
  <files-path name="" path=""></files-path>
  <!--cache-path对应context.getCacheDir(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content://packageName.fileprovide/my_image/filename;path表示共享的目录,path表示共享的目录,如果是images/,表示共享context.getCacheDir()/images/--> 
  <cache-path name="" path=""></cache-path>
  <!--external-files-path对应context.getExternalFilesDirs(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content://packageName.fileprovide/my_image/filename;path表示共享的目录,path表示共享的目录,如果是images/,表示共享context.getExternalFilesDirs()/images/--> 
  <external-files-path name="" path=""></external-files-path>
	<!--external-cache-path对应context.getExternalCacheDirs(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content://packageName.fileprovide/my_image/filename;path表示共享的目录,path表示共享的目录,如果是images/,表示共享context.getExternalCacheDirs()/images/--> 
  <external-cache-path name="" path=""></external-cache-path>
	<!--external-path对应context.getExternalStorageDirectory(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content://packageName.fileprovide/my_image/filename;path表示共享的目录,path表示共享的目录,如果是images/,表示共享context.getExternalStorageDirectory()/images/--> 
  <external-path name="" path=""></external-path>
</paths>

2、配置一个具体的file_paths.xml文件

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <!--设置Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),也就是/storage/emulated/0/Pictures/为共享路径-->
    <external-path name="my_image" path="Pictures/"/>
</paths>

2、AndroidManifest设置provider

<application>
  	<!--android:authorities写自己的包名.provider,记住它,在程序中会用到;其他的配置除了name如果用的v4包,要改成v4下的FileProvider以外,设置成以下配置即可-->
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.jw.firstapp.provider"
        android:exported="false"
        android:grantUriPermissions="true">

      	<!--设置共享路径的资源文件为上一步创建的文件-->
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"/>

    </provider>
</application>

3、获取Uri

//创建一个File
File tempFile=File.createTempFile("file_test",".jpg",Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
//转为Uri
Uri uri = FileProvider.getUriForFile(this,"com.jw.firstapp.provider",tempFile);

4、一些补充

第一步的时候我们设置了共享路径path的name,我设置的是my_image;

第二步的时候我们设置了authorities,我设置的是com.jw.firstapp.provider;

第四步设置了文件名为file_test.jpg

那么最后生成的Uri是什么样的呢?

content://com.jw.firstapp.provider/my_image/file_test.jpg

总结一下:content://AndroidManifest中设置的authorities名/共享路径path的name/文件名

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:46:02  更:2022-05-18 17:48:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 1:49:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码