【发布时间】:2021-03-25 16:01:18
【问题描述】:
我需要创建一个只有我的应用程序才能访问的私有文件,所以我按照approach 使用 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 导出的 ProcessRecord{601211e 3719:com.test.reciverapp/u0a144} (pid=3719, uid=10144) 打开提供程序 androidx.core.content.FileProvider 10143
任何帮助或想法? 我的最佳方案是仅在我的应用程序之间创建共享目录,任何应用程序都可以创建文件,而其他应用程序可以完全控制这些文件。或者第二种情况,一个应用程序创建一个文件,而另一个应用程序可以读取它。
【问题讨论】:
-
您可以使用 AIDL、广播、共享 Intent 并将 packageName 设置为您的应用程序 packageName。同样对于权限拒绝,您必须添加 GRANT_PERMISSION 标志
-
When I receive the intent using BroadcastReciever like this我想知道你是如何为此发送广播的。 -
@blackapps 我更新了问题,请看一下
-
@Amin 我已经授予权限,我更新了问题,请看一下。实际上,当我将其用作共享意图时,同样的意图也有效
-
不要使用 FileProvider,因为它会给你这个 SecurityException。编写你自己的 ContentProvider 然后你就可以做你想做的事了。然后,您可以共享目录的 uri,并使用 .query() 为该目录提供文件列表。
标签: android