はじめに
Android Q (API level 29)より、新しい位置情報パーミッション ACCESS_BACKGROUND_LOCATION が追加された。 が、ドキュメントを見ても、特に フォアグラウンドサービス における、動作の振る舞いがわかりにくかったので、調べてみた。
本記事は、 Android Q beta 4 にて動作確認結果である。
パーミッションについて
- 
ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATIONパーミッション: Android Qより前からあるパーミッション。 Android Qより前では、フォアグラウンド/バックグランドの区別はとくになく、位置情報が取得可能であった。 しかし、Android Qでは、フォアグラウンド時のみ 位置情報取得が可能になる。 - 
ACCESS_BACKGROUND_LOCATIONパーミッション: Android Q (API level 29)で新たに追加されたパーミッション。 バックグランド時の位置情報取得が可能になる。 このパーミッションはACCESS_COARSE_LOCATIONorACCESS_FINE_LOCATIONと合わせて使う必要がある。 
つまり、
- 
ACCESS_COARSE_LOCATIONorACCESS_FINE_LOCATIONのみの場合は、フォアグラウンド時のみ位置情報が取得。 パーミッション要求ダイアログなどでは、Allow only while using the appと表示される。 - (
ACCESS_COARSE_LOCATIONorACCESS_FINE_LOCATION) andACCESS_BACKGROUND_LOCATIONのみの場合は、フォアグラウンド時もバックグランド時も位置情報取得が可能。 パーミッション要求ダイアログなどでは、Allow all the timeと表示される。 
さて、フォアグラウンド・サービスは、フォアグラウンド扱いなのか、バックグランド扱いなのか、バックグランドで位置情報を取得するかを調べてみる。
targetSdkVersion 28以下 (Android Qより前)でビルドしたアプリケーションをAndorid Q デバイスで動作させる場合
- 
ACCESS_BACKGROUND_LOCATIONは、request permissinに自動的に付与される。つまり、AndroidManifest.xml に、 次の指定は不要。 (SDKがACCESS_BACKGROUND_LOCATIONを知らないので、当然指定してもエラーになる) 
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
- 
ACCESS_BACKGROUND_LOCATIONの実行時パーミッションリクエストは、ACCESS_COARSE_LOCATIONパーミッションもしくは、ACCESS_FINE_LOCATIONパーミッションのリクエスト時に、自動でなされる。 ので、コードの変更も不要。 - 
結果として、パーミッションリクエストダイアログには、次の3つが表示される。
Allow all the timeAllow only while using the appDeny
 
- 上記パーミッションのうちの 
Allow all the timeが選択された場合のみ、 Foreground ServiceはActivityが バックグランド時でも位置情報取得が可能になる。 
targetSdkVersion 29 (Android Q)でビルドしたアプリケーションをAndroid Q デバイスで動作させる場合
- 
ACCESS_BACKGROUND_LOCATIONは不要。 - よって、 
ACCESS_BACKGROUND_LOCATIONのパーミッションリクエストも不要 - Foreground Serviceが、Locationデータが必要と設定するために、AndroidManifest.xml に、foregroundServiceType="location" の設定をする。
 
<service
    android:name="MyNavigationService"
    android:foregroundServiceType="location" 
    ... />
</service>
- 
ACCESS_BACKGROUND_LOCATIONパーミッションはないので、パーミッションリクエストダイアログには、次の2つが表示される。Allow only while using the appDeny
 - 
Allow only while using the appが選ばれた場合、フォアグラウンドサービスは、バックグランドでも位置情報取得が可能になる。 
ACCESS_BACKGROUND_LOCATION を設定することで、  targetSdkVersion 28以下 (Android Qより前) と同様の設定も可能。
参考
- https://developer.android.com/preview/privacy/device-location?hl=ja
 - https://developers-jp.googleblog.com/2019/04/giving-users-more-control-over-their.html
 
2020/06/12 Update
https://developer.android.com/training/location/permissions#foreground で、 フォアグラウンドサービスはForeground Location (つまりBackground Loaction ではない) ことが明記されている。 なので、調査は正しい。
Your app is running a foreground service. When a foreground service is running, the system raises user awareness by showing a persistent notification. Your app retains access when it's placed in the background, such as when the user presses the Home button on their device or turns their device's display off.