我查阅了Android开发者文档,但未找到关于内容提供者授予URI权限的满意答案。有人能更详细更简单地解释吗?我的问题是: 授权URI用于什么? 授权URI权限为true和false之间的区别是什么? 我们应该何时使用true?何时使用false? 如果有更多细节则更好。
我查阅了Android开发者文档,但未找到关于内容提供者授予URI权限的满意答案。有人能更详细更简单地解释吗?我的问题是: 授权URI用于什么? 授权URI权限为true和false之间的区别是什么? 我们应该何时使用true?何时使用false? 如果有更多细节则更好。
授权Uri的作用是什么?
"授予Uri
权限"功能允许您拥有一个通常无法被第三方访问的ContentProvider
,但可以选择性地允许短时间内(例如足以查看服务提供者提供的PDF文件)个别第三方应用程序访问单个Uri
值。
grant uri permission true和false之间有什么区别?
android:grantUriPermissions="true"
表示您的Java代码可以使用ContentProvider
提供的任何Uri
具有FLAG_GRANT_READ_URI_PERMISSION
和FLAG_GRANT_WRITE_URI_PERMISSION
权限。
android:grantUriPermissions="false"
表示只有由子级<grant-uri-permission>
元素指定的Uri
值可以与FLAG_GRANT_READ_URI_PERMISSION
和FLAG_GRANT_WRITE_URI_PERMISSION
一起使用。
假设你需要发送存储在应用程序缓存目录中的一些文件。
除非你指定其他应用程序可以访问你的应用程序内容,否则其他应用程序无法访问该文件。为此,你需要创建内容提供程序,并将所有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 一起使用。
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)
android:grantUriPermissions
设置为 false,则 Android 系统将检查清单中是否有<grant-uri-permission>
标记,其中包含应允许使用 URI 权限的特定路径名,例如<grant-uri-permission android:pathPattern="/notes/" /> <!-- 用于向提供程序的特定子分支授予基于 URI 的权限 -->
。 - KingKongCoder