【问题标题】:How to share private file between applications without using share intent?如何在不使用共享意图的情况下在应用程序之间共享私有文件?
【发布时间】: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


【解决方案1】:

我猜你已经找到了解决方案,但是由于现在部署了 Android S,由于 ScopedStorage 限制,许多其他应用程序之间共享文件可能存在问题。

作为开发者指南,如果 Intent 用于启动 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 的开发者指南中得到指导(developer.android.com/training/secure-file-sharing/share-file)
  • 我已经实现了选择器意图,但它不起作用。所以我发布了一个包含所有必要代码的问题。你能看看吗?也许你可以帮忙。 Here is the question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2012-08-22
  • 2012-07-25
  • 2022-08-14
相关资源
最近更新 更多