1

我正在尝试删除后台任务中的照片。这在 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从我的后台任务中调用?

谢谢!

4

0 回答 0