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

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

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

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

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

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

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

アプリが Android 14 以上をターゲットとする場合、オペレーティング システムはフォアグラウンド サービスを作成するときに、アプリがそのサービスタイプに適した権限をすべて持っていることを確認します。たとえば、マイク タイプのフォアグラウンド サービスを作成する場合、オペレーティング システムは、アプリが現在 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