• kotlin根据文件的filePath转化为uri


    方法实现

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

    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一致。
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    添加配置

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

    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

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

    
    <paths>
        <external-path name="external_files" path="." />
    paths>
    
    • 1
    • 2
    • 3
    • 4

    方法调用:

    在使用这个函数时,您可以传入当前的Context对象和文件的路径,然后获取文件的URI。
    请注意,由于Android 10及以上版本对文件访问权限进行了更严格的限制,因此在处理文件时需要特别注意权限问题。
    权限申请:

    
        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)
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

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

    applyPermission()
    val fileUri = getFileUri(this, filePath)
    
    • 1
    • 2

    拓展

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

  • 相关阅读:
    1.3 do...while实现1+...100 for实现1+...100
    写一个vue前端项目
    SOLIDWORKS 2024新功能之Visualize篇
    如何使用JMeter测试导入接口/导出接口
    nmap之nse脚本简单学习
    ArcGIS Pro中的回归分析浅析(上)回归的概念&探索性回归工具使用
    Java项目:基于jsp+servlet在线药店管理系统(含PPT)
    Unity 编辑器扩展 一键替换指定物体下的所有材质球
    一级造价工程师(安装)- 计量笔记 - 第六章第四节建筑智能化工程
    响应式编程-Project Reactor Mono 介绍
  • 原文地址:https://blog.csdn.net/weixin_43865875/article/details/138195868