生成content://类型的Uri

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

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

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

         
            
        

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

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



    

表示内部存储的根目录,相当于代码中的Environment.getExternalStorageDirectory()

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

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

等同于Context.getFilesDir()/path

等同于Context.getCacheDir()/path

等同于Context.getExternalFilesDir(null)/path

等同于Context.getExternalCacheDir()/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 =         
        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了.

 

 

你可能感兴趣的:(实时应用)