android - 如何在不使用共享意图的情况下在应用程序之间共享私有文件?
问题描述
我需要创建一个只有我的应用程序才能访问的私有文件,所以我按照这种方法使用 android FileProvider 来共享文件 Uri.
问题是我不需要使用共享意图共享它,我需要接收 Uri 的应用程序在需要使用任何连接方式(如 Socket 或 BroadcastReceiver)时请求它。
我在使用广播接收器发送意图时遇到问题文件创建者应用程序:
val contentUri: Uri = getUriForFile(this, AUTHORITY, myFile)
grantUriPermission(RECIEVER_APP_PACKAGE_NAME, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION and Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
val intent = Intent()
intent.apply {
component = ComponentName(RECIEVER_APP_PACKAGE_NAME,"$RECIEVER_APP_PACKAGE_NAME.MyReciever")
data = contentUri
clipData = ClipData.newRawUri("", contentUri)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
}
sendBroadcast(intent)
在接收器应用中触发 onReceive 时
override fun onReceive(context: Context?, intent: Intent?) {
Log.i(TAG, "onReceive: ${intent!!.data}")
val parcelFileDescriptor = context!!.contentResolver.openFileDescriptor(intent.data!!,"r")
}
我明白了
java.lang.SecurityException: Permission Denial: 从未从 UID 10143 导出的 ProcessRecord{601211e 3719:com.test.reciverapp/u0a144} (pid=3719, uid=10144) 打开提供程序 androidx.core.content.FileProvider
任何帮助或想法?我的最佳方案是仅在我的应用程序之间创建共享目录,任何应用程序都可以创建文件,而其他应用程序可以完全控制这些文件。或者一个应用程序创建文件而另一个应用程序可以读取它的第二种情况。
解决方案
我想您已经找到了解决方案,但是由于现在部署了 Android S,由于 ScopedStorage 限制,许多其他应用程序之间共享文件可能存在问题。
作为开发者指南,如果意图用于启动 Activity/Service,将正确授予权限。此时,Android Framework 可能会从您发送的 Intent 中提取权限,并将其授予目标 Activity/Service。
但是,在 BroadcastReceiver 的情况下,intent 不用于启动 Activity/Service。它仅用于携带 Uri。
为了解决这个问题,我们需要手动授予目标应用程序的权限。您可以简单地使用以下代码:
yourContext.grantUriPermission("targetPackageName", uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
那么权限问题就解决了。
推荐阅读
- android - 材质按钮的禁用颜色状态
- asp.net - 我如何知道触发了哪些按钮以在 Gridview 中执行特定任务
- numpy - 边缘检测始终具有高特征值
- java - 如何在 Android Studio 中检查我的 WHERE 查询是否正确
- python - 由于没有 Access-Control-Allow-Origin 标头但标头存在而被 CORS 阻止的 HTTP 请求
- oracle - 我的光标 SQL 查询有什么问题
- linux - 使用 cython 将多个 python 模块构建到一个程序中
- android - 如何让 ImageView 决定自定义 Drawable 的大小?
- javascript - 我无法从 html 表中获取数据
- android - 如何在Android中添加时间