Я пытаюсь удалить фотографию в фоновом режиме. Это легко сделать до Android API v29:
context.getContentResolver().delete(ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image_id), null, null);
, но с Android API v29 это вызовет RecoverableSecurityException
. Это связано с требованиями к ограниченному хранилищу Android Q. Эта документация объясняет, как обращаться с 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, строгие правила были введены, когда деятельность может быть запущена.
Это привело бы меня к решению:
- Is есть ли способ запустить действие в фоновой задаче, не открывая приложение?
- Есть ли способ вызвать
startIntentSenderForResult
из моей фоновой задачи?
Спасибо!