首页 > 解决方案 > 如何在不使用共享意图的情况下在应用程序之间共享私有文件?

问题描述

我需要创建一个只有我的应用程序才能访问的私有文件,所以我按照这种方法使用 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

解决方案


我想您已经找到了解决方案,但是由于现在部署了 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);

那么权限问题就解决了。


推荐阅读