【发布时间】:2021-10-24 16:47:22
【问题描述】:
我的用户可以通过ACTION_OPEN_DOCUMENT选择文件
val launcher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.OpenDocument(),
onResult = onResult
)
之后我使用takePersistableUriPermission
contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
这很好用!现在选择器 UI 不是我所说的最佳用户界面,所以我还想通过与我的应用共享文件来允许反转控制流。
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
在我的Activity 中的onCreate 或onNewIntent 中,我还想获得持久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)
// ...
}
然而,这会导致 SecurityException:
java.lang.SecurityException:没有为 UID 10146 和 Uri content://com.google.android.apps.photos.contentprovider/-1/1/content://media/external/images/ 找到持久的权限授予媒体/61/REQUIRE_ORIGINAL/NONE/image/jpeg/702648108
有没有办法做到这一点?
【问题讨论】:
-
为什么要获得持久许可?我认为它一开始就没有提供给您的应用程序。您是否检查了收到的意图中的标志?
-
contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);这不是这样做的方法。请看例子。如果该标志存在,请首先查看提供的标志。 -
我必须长期访问该文件才能在我的应用程序中显示它。如果可以避免的话,我不想将其复制到我的应用程序内部存储中。 `我认为它不是一开始就提供给你的`,是的,这就是问题所在。我可以要求 a) 在收到 URI 之后或 b) 在收到 URI 之前吗?
-
不,你不能这样要求。
-
哇,真不幸..
标签: android android-contentprovider android-jetpack-compose android-context