为 ACTION_SEND intent 过滤器 uri 获取持久性 URI 权限导致 SecurityException
Take Persistable URI Permission for ACTION_SEND intent filter uri results in SecurityException
我的用户可以通过 ACTION_OPEN_DOCUMENT
select 文件
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: No persistable permission grants found for UID 10146 and Uri content://com.google.android.apps.photos.contentprovider/-1/1/content://media/external/images/media/61/REQUIRE_ORIGINAL/NONE/image/jpeg/702648108
有办法实现吗?
Is there a way to achieve this?
一般不会。 takePersistableUriPermission()
用于存储访问框架 Uri
值,如您的 ACTION_OPEN_DOCUMENT
场景。它不适用于任意 Uri
值,就像您可能通过 ACTION_PICK
或 EXTRA_STREAM
接收 ACTION_SEND
或传递给 [=18= 的 Uri
],等等
对于 ACTION_SEND
、ACTION_VIEW
等,您需要假设您的应用对内容只有短暂的访问权限。如果您需要长期访问,您需要进行某种“导入”操作并制作您自己的内容副本。
我的用户可以通过 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: No persistable permission grants found for UID 10146 and Uri content://com.google.android.apps.photos.contentprovider/-1/1/content://media/external/images/media/61/REQUIRE_ORIGINAL/NONE/image/jpeg/702648108
有办法实现吗?
Is there a way to achieve this?
一般不会。 takePersistableUriPermission()
用于存储访问框架 Uri
值,如您的 ACTION_OPEN_DOCUMENT
场景。它不适用于任意 Uri
值,就像您可能通过 ACTION_PICK
或 EXTRA_STREAM
接收 ACTION_SEND
或传递给 [=18= 的 Uri
],等等
对于 ACTION_SEND
、ACTION_VIEW
等,您需要假设您的应用对内容只有短暂的访问权限。如果您需要长期访问,您需要进行某种“导入”操作并制作您自己的内容副本。