Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 内容提供商授予uri权限_Android_Permissions_Uri_Provider_Grant - Fatal编程技术网

Android 内容提供商授予uri权限

Android 内容提供商授予uri权限,android,permissions,uri,provider,grant,Android,Permissions,Uri,Provider,Grant,我搜索并阅读了android开发者的文件,但并没有找到内容提供商授予uri权限的满意答案。谁能解释得更详细、更简单些。我的问题是: 授权uri用于什么? 授予uri权限true和false之间有什么区别 我们什么时候应该使用true?什么时候错了? 欢迎提供更多细节 授权uri用于什么 “授予Uripermissions”功能允许您拥有通常第三方无法访问的ContentProvider,但有选择地允许在短时间内(例如,足够长的时间以查看提供商提供的PDF)访问单个Uri值 授予uri权限true

我搜索并阅读了android开发者的文件,但并没有找到内容提供商授予uri权限的满意答案。谁能解释得更详细、更简单些。我的问题是: 授权uri用于什么? 授予uri权限true和false之间有什么区别 我们什么时候应该使用true?什么时候错了? 欢迎提供更多细节

授权uri用于什么

“授予
Uri
permissions”功能允许您拥有通常第三方无法访问的
ContentProvider
,但有选择地允许在短时间内(例如,足够长的时间以查看提供商提供的PDF)访问单个
Uri

授予uri权限true和false之间有什么区别

android:grantUriPermissions=“true”
表示您的Java代码可以对该
内容提供者提供的任何
URI
使用
标记授予读取URI权限
标记授予写入URI权限


android:grantUriPermissions=“false”
表示只有子
元素指定的
Uri
值可以与
FLAG\u GRANT\u READ\u Uri\u PERMISSION
一起使用,而
FLAG\u GRANT\u WRITE\u Uri\u PERMISSION
表示需要发送应用程序缓存目录中的某个文件

没有其他应用程序可以访问该文件,除非您指定其他应用程序可以访问您的应用程序的内容。为此,您需要创建内容提供者,并以表单的形式创建所有uricontent://com.your.app/file 您可以“重定向”到应用程序缓存目录

一些代码:

File f = ...; // Some local file.
Uri uri = Uri.parse("content://com.your.app/" + f.getName());
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body");
intent.putExtra(Intent.EXTRA_STREAM, uri);

// You only can add flag FLAG_GRANT_READ_URI_PERMISSION if your app has 
// android:grantUriPermissions="true" in manifest or see quote below.
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(intent, "Send Email"));
正如Commonware所说:

android:grantUriPermissions=“false”表示只有Uri值 由子元素指定的可以与一起使用 标记授予读取URI权限和标记授予写入URI权限

带有适配器类且在Kotlin中:-
val-uri:uri?=FileProvider.getUriForFile(mContext,BuildConfig.APPLICATION\u ID,文件)
val sharingcontent=Intent(Intent.ACTION\u发送)
sharingcontent.type=“image/*”
共享内容putExtra(Intent.EXTRA_主题,“图像”)
sharingcontent.putExtra(Intent.EXTRA\u流,uri)
val chooser=Intent.createChooser(共享内容,“共享文件”)
val resinfo-List:List=mContext.packageManager
.QueryInputActivities(仅适用于选择器、PackageManager.MATCH_默认值)
用于(ResInfo列表中的resolveInfo){
val packageName=resolveInfo.activityInfo.packageName
mContext.grantUriPermission(
包装名称,
乌里,
Intent.FLAG\授予\写入\ URI\权限或Intent.FLAG\授予\读取\ URI\权限
)
}
mContext.startActivity(选择器)

我仍然站在同一点上,不明白为什么要使用grant uri,而我们应该使用它。你能像一个初级开发人员那样更详细地解释并告诉我吗。@Android@Commonware的意思是,如果
Android:grantUriPermissions
设置为false,Android系统将检查清单是否有
标记和特定路径名,应该允许使用URI权限,如
       with adapter class and In Kotlin :- 


        val uri: Uri? = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID, file)
        
        val sharingIntent = Intent(Intent.ACTION_SEND)
        sharingIntent.type = "image/*"
        sharingIntent.putExtra(Intent.EXTRA_SUBJECT, "Images ")
        sharingIntent.putExtra(Intent.EXTRA_STREAM, uri)
        
        val chooser = Intent.createChooser(sharingIntent, "Share File")

        val resInfoList: List<ResolveInfo> = mContext.packageManager
            .queryIntentActivities(chooser, PackageManager.MATCH_DEFAULT_ONLY)

        for (resolveInfo in resInfoList) {
            val packageName = resolveInfo.activityInfo.packageName
            mContext.grantUriPermission(
                packageName,
                uri,
                Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
            )
        }
        
        mContext.startActivity(chooser)