概述
原本的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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复