我是靠谱客的博主 包容夏天,最近开发中收集的这篇文章主要介绍生成content://类型的Uri,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原本的file://类型的Uri有时可能会出现某些问题,比如做分享功能的时候,file://类型的Uri会导致分享失败

content://类型的Uri生成步骤

1.在Manifest文件中声明Provider,因为FileProvider是ContentProvider特殊的子类

         <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.jhyh.fileprovider"
            android:exported="false" 
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

属性android:exported="false"   FileProvider不需要公开
属性android:grantUriPermissions="true"   允许您授予对文件的临时访问权限
属性android:resource="@xml/file_paths"  指定xml文件,定义Uri的文件路径

2.在res/xml目录下新建一个.xml文件

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

<external-path />表示内部存储的根目录,相当于代码中的Environment.getExternalStorageDirectory()

name属性表示content://中替换的自定义名

path表示<external-path />目录下的位置,相当于Environment.getExternalStorageDirectory()/jhyh/sender

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

等同于Context.getFilesDir()/path

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

等同于Context.getCacheDir()/path

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

等同于Context.getExternalFilesDir(null)/path

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

等同于Context.getExternalCacheDir()/path

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

等同于Context.getExternalMediaDirs()/path

3.创建问件的content://类型的Uri

        var file = File(fileName)
        Log.i(TAG, "onActivityResult: 拍照的图片路径是: ${file.toString()}")
        val uriForFile = getUriForFile(this, "com.jhyh.fileprovider", file)

getUriForFile()的第二个属性就是我们在Manifest中生命的Provider中的android:authorities值,下面是得到的Uri

content://com.jhyh.fileprovider/external/VID_20190704_162744.mp4

4.在获得到Uri后,我们还需要给使用此uri的其他应用授权,因为我们有时也无法确定包名,所以检索包名,能授权的都给一遍

        var takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        var resInfoList: List<ResolveInfo> =         
        packageManager.queryIntentActivities(takePictureIntent, 
            PackageManager.MATCH_DEFAULT_ONLY)
        for (resolveInfo in resInfoList) {
            val packageName = resolveInfo.activityInfo.packageName
            grantUriPermission(packageName, uriForFile, 
                 Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
            grantUriPermission(packageName, uriForFile, 
                 Intent.FLAG_GRANT_READ_URI_PERMISSION)
        }

5.至此,我们就可以使用我们的content://类型的Uri了.

 

<over>

 

最后

以上就是包容夏天为你收集整理的生成content://类型的Uri的全部内容,希望文章能够帮你解决生成content://类型的Uri所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部