我正在尝试删除后台任务中的照片。这在 Android API v29 之前很容易做到:
context.getContentResolver().delete(ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image_id), null, null);
但从 Android API v29 开始,这将抛出一个RecoverableSecurityException
. 这是由于 Android Q 的 Scoped Storage 要求。本文档说明了如何处理RecoverableSecurityException
. 这是我对它的改编:
try {
context.getContentResolver().delete(ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image_id), null, null);
} catch (SecurityException securityException) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
RecoverableSecurityException recoverableSecurityException;
if (securityException instanceof RecoverableSecurityException) {
recoverableSecurityException = (RecoverableSecurityException)securityException;
} else {
throw new RuntimeException(securityException.getMessage(), securityException);
}
IntentSender intentSender = recoverableSecurityException.getUserAction().getActionIntent().getIntentSender();
startIntentSenderForResult(intentSender, image-request-code, null, 0, 0, 0, null);
} else {
throw new RuntimeException(securityException.getMessage(), securityException);
}
}
本文档中的上述代码自行调用startIntentSenderForResult
,没有任何活动。我没有运气让这个工作。请记住,这是在后台任务中,所以我没有对活动的引用。我能够在此后台任务中创建一个新活动,启动该活动,然后调用startIntentSenderForResult
,但这里的问题是该活动仅在应用程序打开时启动,这不符合我的要求。从 Android API v29 开始,活动的启动时间有了严格的规定。
这些将引导我找到解决方案:
- 有没有办法在不打开应用程序的情况下在后台任务中启动活动?
- 有没有办法
startIntentSenderForResult
从我的后台任务中调用?
谢谢!