バックグラウンドからのフォアグラウンド サービスの開始に関する制限

Android 12(API レベル 31)以降をターゲットとするアプリは、少数の特殊なケースを除き、アプリがバックグラウンドで動作しているときにフォアグラウンド サービスを開始できません。アプリがバックグラウンドで動作しているときにフォアグラウンド サービスを起動しようとすると、そのフォアグラウンド サービスが例外ケースのいずれかに該当しない限り、システムは ForegroundServiceStartNotAllowedException をスローします。

また、使用中の権限(ボディセンサー、カメラ、マイク、位置情報の権限など)が必要なフォアグラウンド サービスをアプリが起動する場合、アプリがバックグラウンド起動制限の例外のいずれかに該当する場合でも、アプリがバックグラウンドにある間はサービスを作成できません。その理由については、使用中の権限が必要なフォアグラウンド サービスの起動に関する制限のセクションで説明します。

バックグラウンドでの起動の制限の適用除外

以下の状況では、アプリがバックグラウンドで動作しているときでも、フォアグラウンド サービスを起動できます。

使用中の権限が必要なフォアグラウンド サービスの起動に関する制限

Android 14(API レベル 34)以降では、使用中の権限が必要なフォアグラウンド サービスを開始する場合に注意すべき特別な状況があります。

アプリが Android 14 以降をターゲットとしている場合、オペレーティング システムはフォアグラウンド サービスを作成するときに、アプリにそのサービス タイプに適したすべての権限があることを確認します。たとえば、microphone タイプのフォアグラウンド サービスを作成すると、オペレーティング システムは、アプリに現在 RECORD_AUDIO 権限が付与されていることを確認します。この権限がない場合、システムは SecurityException をスローします。

使用中の権限の場合、問題が発生する可能性があります。アプリに「使用中」権限が付与されている場合、その権限はフォアグラウンドで実行されている間のみ有効です。つまり、アプリがバックグラウンドにあり、カメラ、位置情報、マイクタイプのフォアグラウンド サービスを作成しようとすると、アプリに必要な権限が現在付与されていないことがシステムで検出され、SecurityException がスローされます。

同様に、アプリがバックグラウンドにあり、BODY_SENSORS 権限が必要なヘルスサービスを作成した場合、アプリには現在その権限がないため、システムは例外をスローします。(これは、ACTIVITY_RECOGNITION など、異なる権限が必要なヘルスサービスには適用されません)。PermissionChecker.checkSelfPermission() を呼び出しても、この問題は回避されません。アプリに使用中の権限があり、checkSelfPermission() を呼び出してその権限があるかどうかを確認すると、アプリがバックグラウンドにある場合でも、メソッドは PERMISSION_GRANTED を返します。メソッドが PERMISSION_GRANTED を返すと、「アプリはアプリの使用中にこの権限を持ちます」と表示されます。

そのため、フォアグラウンド サービスで使用中の権限が必要な場合は、サービスが定義された例外のいずれかに該当しない限り、アプリにアクティビティが表示されている間に Context.startForegroundService() または Context.bindService() を呼び出す必要があります。

使用中の権限の制限の免除

アプリが バックグラウンドで実行されているときにフォアグラウンド サービスが開始された場合でも、アプリがフォアグラウンドで実行されている間(「使用中」)に、位置情報、カメラ、マイクの情報にアクセスできる場合があります。

同様の状況で、サービスが locationフォアグラウンド サービスのタイプを宣言し、ACCESS_BACKGROUND_LOCATION 権限を持つアプリによってサービスが開始された場合、このサービスは、アプリがバックグラウンドで実行されている場合でも、常に位置情報にアクセスできます。

これらの状況は次のとおりです。

  • システム コンポーネントがサービスを開始します。
  • サービスは、アプリ ウィジェットを操作することで開始されます。
  • 通知を操作することでサービスが開始される。
  • 表示されている別のアプリから送信された PendingIntent としてサービスが開始される。
  • デバイス所有者モードで実行されている Device Policy Controller であるアプリによってサービスが開始される。
  • VoiceInteractionService を提供するアプリによってサービスが開始される。
  • START_ACTIVITIES_FROM_BACKGROUND 特権を持つアプリによってサービスが開始される。

アプリで影響を受けるサービスを特定する

アプリをテストするとき、フォアグラウンド サービスを開始します。開始されたサービスが、位置情報、マイク、カメラに対するアクセスを制限されている場合は、次のメッセージが Logcat に表示されます。

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME