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高版本的Uri及其使用注意问题 -> 正文阅读

[移动开发]Android高版本的Uri及其使用注意问题

一、前言

Uri又被成为统一资源定位符。顾名思义,是用来定位资源的。在Android中主要是用来定位本地资源的。在Android10.0以前由于可以直接使用File进行文件读写,所以Uri的使用范围没那么广。只有使用存放在rawasset或者其它资源文件时候,以及使用ContentProvider这些方式的时候才进行使用Uri。相对于整个项目来说,频率较低。但是

由于Android10.0开始强制逐步强制使用SAF的方式进行文档读写。因此Uri开始很频繁的被开发者进行使用。本篇文章对一些不同场景下Uri的生成和使用进行一个整理和总结。

二、Document

Android中的文档体系中,Android把所有文档都用一个id进行标识。所以理论上知道id可以获取对应的位置,可以通过以下代码进行获取

ContentUris.withAppendedId(uri,id) 

下面是一个MediaStore示例:

  val mediaInfoList = arrayListOf<MediaInfo>()
        val uri = MediaStore.Files.getContentUri("external")
        val selection =
            "(" + MediaStore.Files.FileColumns.DATA + " LIKE '%ym_empty%'" + ")"
        val cursor: Cursor? = contentResolver.query(uri, null, selection, null, null)
        try {
            cursor!!.moveToFirst()
            while (!cursor.isAfterLast) {
                val id = cursor.getLong(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID))
                val contentUri = ContentUris.withAppendedId(
                    uri,
                    id
                ) 
                cursor.moveToNext()
            }
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            cursor?.close()
        }

这个链接的样子如下:

content://media/external/images/media/272

可以将该Uri转换为DocumentFile.

  val documentFile =
                    DocumentFile.fromSingleUri(RockeyApp.getInstance()!!, contentUri)

还有一种将File转换为DocumentFile的方式,如下:

比如文档的路径为/storage/emulated/0/Download/1-1604402012.png

val documentFile = DocumentFile.fromFile(file)

通过以上方式转换完的路径为
file:///storage/emulated/0/Download/1-1604402012.png

可以看到这个路径和之前的路径是不太一样的,但是依然可以正常使用。

另外通过这种方式转换的Uri可以再次转换为File,其余方式则不可以

val documentFile = DocumentFile.fromFile(file)
val newFile = documentFile.uri.toFile()

需要注意的是,在Android中有些文件其实不存在了,但是File.exists()依然会判断存在,这里使用DocumentFile.exists()函数才会返回正确结果

使用SAF获取的路径如下:

content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fmedia%2Fcom.whatsapp

可以看到这种路径和上面的也不太一样。

三、文件删除

上面已经知道可以通过File、id、SAF等方式转换成为DocumentFile。但是在执行删除操作时候却并不能都按照DocumentFile进行文件删除。还是需要使用各自的方式进行删除。只有使用SAF方式获取的文件可以使用DocumentFile进行删除。

1、File

val file = File(path)
file.delete()

2、MediaStore

val file = File(path)
val filePath = file.path
                    val res: Int = contentResolver.delete(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        MediaStore.Images.Media.DATA + "= \"" + filePath + "\"",
                        null
                    )

3、DocumentFile

val dirDocument =
   DocumentFile.fromSingleUri(RockeyApp.getInstance()!!, Uri.parse(fileStr))
   val isDel = dirDocument?.delete()

四、参考链接

  1. Uri

  2. Android中的Uri详解_JMW1407的博客-CSDN博客_android uri

  3. Is it possible to get a regular File from DocumentFile?

  4. DocumentFile ?|? Android Developers

  5. DocumentsContract ?|? Android Developers

  6. Storage Access Framework_光英的记忆博客-CSDN博客

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:35:55  更:2021-12-24 18:36:28 
 
开发: 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/24 11:05:47-

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