バックグラウンド タスクで写真を削除しようとしています。これは、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
バックグラウンド タスクから呼び出す方法はありますか?
ありがとう!