【发布时间】:2014-05-24 06:52:52
【问题描述】:
我搜索并阅读了 android 开发人员文件,但没有找到任何令人满意的内容提供商授予 uri 权限的答案。谁能解释得更详细更简单。我的问题是: 授予 uri 用于什么用途? 授予uri权限真假有什么区别 什么时候应该使用true?什么时候假? 并感谢任何更多细节。
【问题讨论】:
标签: android permissions uri provider grant
我搜索并阅读了 android 开发人员文件,但没有找到任何令人满意的内容提供商授予 uri 权限的答案。谁能解释得更详细更简单。我的问题是: 授予 uri 用于什么用途? 授予uri权限真假有什么区别 什么时候应该使用true?什么时候假? 并感谢任何更多细节。
【问题讨论】:
标签: android permissions uri provider grant
授权 uri 用于什么用途?
“授予Uri 权限”功能允许您拥有第三方通常无法访问的ContentProvider,但有选择地允许在短时间内访问各个第三方应用程序的各个Uri 值(例如,足以查看提供商提供的 PDF)。
grant uri权限真假有什么区别
android:grantUriPermissions="true" 表示您的 Java 代码可以将 FLAG_GRANT_READ_URI_PERMISSION 和 FLAG_GRANT_WRITE_URI_PERMISSION 用于由该 ContentProvider 服务的任何 Uri。
android:grantUriPermissions="false" 表示只有子<grant-uri-permission> 元素指定的Uri 值可以与FLAG_GRANT_READ_URI_PERMISSION 和FLAG_GRANT_WRITE_URI_PERMISSION 一起使用。
【讨论】:
android:grantUriPermissions 设置为 false,Android 系统将检查清单是否有带有特定路径名的 <grant-uri-permission> 标记,应该允许使用 URI 权限,例如 <grant-uri-permission android:pathPattern="/notes/" /> <!-- for granting URI-based permissions to specific sub-branches of the provider -->
假设您需要邮寄一些位于应用程序缓存目录中的文件。
没有其他应用可以访问该文件,除非您指定其他应用可以访问您应用的内容。为此,您创建内容提供程序,并说所有 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" 表示只有 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)
【讨论】: