内容提供者授予URI权限

16

我查阅了Android开发者文档,但未找到关于内容提供者授予URI权限的满意答案。有人能更详细更简单地解释吗?我的问题是: 授权URI用于什么? 授权URI权限为true和false之间的区别是什么? 我们应该何时使用true?何时使用false? 如果有更多细节则更好。

3个回答

13

授权Uri的作用是什么?

"授予Uri权限"功能允许您拥有一个通常无法被第三方访问的ContentProvider,但可以选择性地允许短时间内(例如足以查看服务提供者提供的PDF文件)个别第三方应用程序访问单个Uri值。

grant uri permission true和false之间有什么区别?

android:grantUriPermissions="true"表示您的Java代码可以使用ContentProvider提供的任何Uri具有FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION权限。

android:grantUriPermissions="false"表示只有由子级<grant-uri-permission>元素指定的Uri值可以与FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION一起使用。


2
我仍然停留在同一点上,不明白为什么要使用授权URI,以及我们应该何时使用。你能更详细地解释一下,并像对待初级开发者一样告诉我吗? - Android
@Android,@CommonsWare 的意思是,如果将 android:grantUriPermissions 设置为 false,则 Android 系统将检查清单中是否有 <grant-uri-permission> 标记,其中包含应允许使用 URI 权限的特定路径名,例如 <grant-uri-permission android:pathPattern="/notes/" /> <!-- 用于向提供程序的特定子分支授予基于 URI 的权限 --> - KingKongCoder

8

假设你需要发送存储在应用程序缓存目录中的一些文件。

除非你指定其他应用程序可以访问你的应用程序内容,否则其他应用程序无法访问该文件。为此,你需要创建内容提供程序,并将所有uri形式的content://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"));

正如CommonsWare所说:

android:grantUriPermissions="false" 表示只有由子元素 <grant-uri-permission> 指定的 Uri 值才能与 FLAG_GRANT_READ_URI_PERMISSION 和 FLAG_GRANT_WRITE_URI_PERMISSION 一起使用。


0
       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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接