kotlin根据文件的filePath转化为uri

方法实现

使用File类来创建一个文件对象,然后通过FileProvider来获取文件的URI

kotlin 复制代码
import android.content.Context
import android.net.Uri
import androidx.core.content.FileProvider
import java.io.File

fun getFileUri(context: Context, filePath: String): Uri {
    val file = File(filePath)
    return FileProvider.getUriForFile(context, context.packageName + ".fileprovider", file)//["context.packageName + ".fileprovider"]与AndroidManifest.xml中配置的authority一致。
}

getFileUri函数接受一个Context对象和文件的路径filePath作为参数,然后使用File类创建文件对象,最后通过FileProvider.getUriForFile方法将文件转换为URI。

添加配置

1. 在AndroidManifest.xml文件中配置了FileProvider。

AndroidManifest.xml文件配置FileProvider的authority。在使用FileProvider时,需要在AndroidManifest.xml文件中正确配置FileProvider的authority,以便系统能够正确识别和处理文件URI。

xml 复制代码
<application>

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="xx.xx.xx.xx.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
</application>

android:authorities属性指定了FileProvider的authority,需要与上面FileProvider.getUriForFile方法中传递的authority一致。

2. 在res/xml目录下创建一个名为file_paths.xml的文件,用于指定FileProvider的路径配置。这个文件中定义了应用程序可以访问的文件路径。

在res/xml目录下创建一个名为file_paths.xml的文件,用于指定FileProvider的路径配置。如果没有xml目录,可以手动创建。

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="." />
</paths>

方法调用:

在使用这个函数时,您可以传入当前的Context对象和文件的路径,然后获取文件的URI。

请注意,由于Android 10及以上版本对文件访问权限进行了更严格的限制,因此在处理文件时需要特别注意权限问题。

权限申请:

kotlin 复制代码
    private fun applyPermission() {
        if (Build.VERSION.SDK_INT >= 23) {
            val allPermissions = arrayOf(
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE
            )
            var needapply = false
            for (i in allPermissions.indices) {
                val checkPermission = ContextCompat.checkSelfPermission(
                    applicationContext,
                    allPermissions[i]
                )
                if (checkPermission != PackageManager.PERMISSION_GRANTED) {
                    needapply = true
                }
            }
            if (needapply) {
                ActivityCompat.requestPermissions(this, allPermissions, 1)
            }
        }
    }

Activity中,this关键字表示当前的Activity对象,因为Activity本身就是一个Context,所以可以直接将this传递给getFileUri函数。

kotlin 复制代码
applyPermission()
val fileUri = getFileUri(this, filePath)

拓展

Q:FileProvider的authority有什么作用?

A:FileProvider的authority是用于唯一标识FileProvider、授权访问文件、权限控制以及生成安全的URI的重要参数

相关推荐
eqwaak01 天前
动态图表导出与视频生成:精通Matplotlib Animation与FFmpeg
开发语言·python·ffmpeg·音视频·matplotlib
刘新明19891 天前
Frida辅助分析OLLVM虚假控制流程(下)
java·开发语言·前端
2501_915106321 天前
苹果软件加固与 iOS App 混淆完整指南,IPA 文件加密、无源码混淆与代码保护实战
android·ios·小程序·https·uni-app·iphone·webview
第二只羽毛1 天前
重载和继承的实践
java·开发语言
2501_915921431 天前
iOS 26 崩溃日志解析,新版系统下崩溃获取与诊断策略
android·ios·小程序·uni-app·cocoa·iphone·策略模式
光军oi1 天前
全栈开发杂谈————JAVA微服务全套技术栈详解
java·开发语言·微服务
帮帮志1 天前
目录【系列文章目录】-(关于帮帮志,关于作者)
java·开发语言·python·链表·交互
qiuiuiu4131 天前
正点原子RK3568学习日记-GIT
linux·c语言·开发语言·单片机
草莓熊Lotso1 天前
《C++ STL list 完全指南:从基础操作到特性对比,解锁链表容器高效用法》
开发语言·c++·list
二王一个今1 天前
Python打包成exe(windows)或者app(mac)
开发语言·python·macos