对 ACTION_SEND 意图过滤器 uri 结果采取持久 URI 权限,导致 SecurityException

Joh*_*neh 4 android android-context android-contentprovider android-jetpack-compose

我的用户可以通过选择文件ACTION_OPEN_DOCUMENT

val launcher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.OpenDocument(),
    onResult = onResult
)
Run Code Online (Sandbox Code Playgroud)

之后我用takePersistableUriPermission

contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
Run Code Online (Sandbox Code Playgroud)

这太棒了!现在,选择器 UI 并不是我所说的最佳界面,因此我还想允许通过与我的应用程序共享文件来反转控制流。

<intent-filter>
   <action android:name="android.intent.action.SEND" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:mimeType="image/*" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

onCreateonNewIntent在 my 中Activity,我还想获取持久 URI 权限。

override fun onNewIntent(intent: Intent?) {
    // null checks etc
    val uri = intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri ?: return
    contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然而,这会导致 SecurityException:

java.lang.SecurityException:未找到 UID 10146 和 Uri content://com.google.android.apps.photos.contentprovider/-1/1/content://media/external/images/media/61 的持久权限授予/REQUIRE_ORIGINAL/NONE/image/jpeg/702648108

有办法实现这一点吗?

Com*_*are 8

有办法实现这一点吗?

一般来说,不会。takePersistableUriPermission()适用于存储访问框架Uri值,如您的ACTION_OPEN_DOCUMENT场景中所示。它不适用于任意Uri值,就像您可能通过ACTION_PICK、 或EXTRA_STREAM在 接收ACTION_SEND、 或Uri传递给ACTION_VIEW等获得的值。

对于ACTION_SENDACTION_VIEW等,您需要假设您的应用程序只能暂时访问内容。如果您需要长期访问,您将需要进行某种“导入”操作并制作您自己的内容副本。