見出し画像

【Android】Androidの位置情報に関する許可設定についてまとめてみた


はじめに


こんにちは、SHIFT DAAE(ダーエ)テクノロジーグループのイケモトです。

今回はAndroidの位置情報に関する許可設定についてまとめました。
Androidでは位置情報を取得する際に、ユーザーのプライバシー保護のために位置情報の利用許可をリクエストする必要があります。

しかし、この位置情報に関する許可は、OSのバージョンアップに伴い仕様が変更されることが多く、OSバージョンによってどのような仕様や挙動になるのかがわかりにくいという印象があったため、自分なりにまとめてみました。

前提


このブログでは実際に位置情報を取得する方法については記していません。
位置情報の取得方法に関してはこちらの公式ガイドを確認してください。

簡単なおさらい


アプリが位置情報にアクセスできるようにするためには、以下のプロセスを経る必要があります。

  1. アプリ側でアプリマニフェスト(AndroidManifest.xml)に必要な権限を追加する。

  2. アプリ側で実行時権限を利用して権限リクエストダイアログを表示する。

  3. 権限リクエストダイアログを通して、アプリが位置情報を取得できるようにユーザーに許可してもらう。

位置情報を取得する際に必要な権限


Androidアプリが位置情報を取得するために必要な権限は以下の3つになります。

この3つの権限の中からAndroidのOSバージョンに合わせて適切な権限を宣言する必要があります。
具体的な使い方に関しては、下記の表を参考にしてください。

各権限の仕様変更に関する履歴を以下の項目にまとめました。 OSバージョンごとに詳細な変更内容を知りたい場合は、以下を参考にしてください。

Android 10

  • アプリがバックグラウンドの際に位置情報を取得するために、新しくACCESS_BACKGROUND_LOCATION権限を付与する必要が生じました。

Android 11

  • targetSdkVersion30以上の場合、ACCESS_FINE_LOCATION権限とACCESS_BACKGROUND_LOCATION権限を同時にリクエストするとリクエストが無視されるようになりました。

Android 12

  • アプリがACCESS_FINE_LOCATION権限をリクエストした場合、ユーザー側は権限要求時のダイアログや、設定画面でACCESS_FINE_LOCATION権限を許可せず、ACCESS_COASER_LOCATION権限だけを許可できるようになりました。

    • この仕様変更により、アプリ側ではACCESS_FINE_LOCATION権限のみをリクエストしようとすると、そのリクエストが無視されるようになりました。

  • ACCESS_FINE_LOCATION権限から、Bluetoothに接続するための権限が失われました。

    • Android 12以降では、Bluetoothに接続するための権限としてBLUETOOTH_CONNECT権限とBLUETOOTH_SCAN権限が必要になります。ただし、注意が必要なのは、Android 11以前ではBluetoothに接続するために引き続きACCESS_FINE_LOCATION権限が必要となる点です。

Android 13

  • ACCESS_FINE_LOCATION権限から付近の Wi-Fi デバイスにアクセスする(Wi-Fi API を呼び出す)権限が失われました

    • 代わりにAndroid13以降からWi-Fi APIを呼び出すためには、新しくNEARBY_WIFI_DEVICES権限が必要になります。 ただし、注意が必要なのは、Android12以前でWi-Fi API を呼び出すには引き続きACCESS_FINE_LOCATION権限が必要になります。

位置情報を求めるための実行時権限


Android5以前

Android 5以前までは、アプリ側で必要な権限を宣言すれば、ユーザーがアプリをインストールした時点で宣言されたすべての権限が許可された状態となっていました。また、ユーザーは後から各権限に対して許可・拒否の選択をすることができませんでした。

Android6以降

Android 6以降、ユーザーはアプリをインストールした後に各権限に対して許可・拒否を選択できるようになりました。
そのため、アプリをインストールした時点ではまだユーザーから権限の許可が得られていないため、実行時に権限リクエストを行い、ユーザーに権限リクエストダイアログを表示して権限の許可を得るというプロセスが必要になりました。

位置情報を取得するための権限リクエストダイアログ


実行時権限を通して表示するダイアログに関しても、AndroidのOSバージョンによって挙動が変わります。
大きな変更点としては以下の2通りになります。

  • Android11未満では、ユーザーが一度でも位置情報へのアクセスを拒否した場合権限リクエストダイアログに「今後表示しない」や「次回から表示しない」といったオプション選択肢が追加されます。これらのオプション選択肢をユーザーが選択した場合、アプリ側で再度位置情報に関する権限をリクエストしても、権限リクエストダイアログが表示されなくなります。

  • Android12以上では、アプリ側がACCESS_FINE_LOCATION権限をリクエストした際に、ダイアログにおおよその位置情報取得(ACCESS_FINE_LOCATION権限)だけを許可するオプション選択肢が追加されます。

以下の表は、ダイアログの挙動に変更があったOSバージョンにおいてダイアログがどのように表示されるかをまとめたものになります。

Android11以降の 「今回のみ」オプションを選択した場合の仕様

Android11以降、ユーザーに表示される権限リクエストダイアログの中に「今回のみ」というオプションが新たに表示されるようになりました。
このオプションが選択されると、アプリは以下の状態では位置情報へのアクセスが許可されています。

  1. アプリのアクティビティが表示されている間は、位置情報へのアクセスが許可されています。

  2. アプリがバックグラウンドに移行した際は、短期間(約30秒ほど)の間は引き続き位置情報へのアクセスが許可されています。

  3. アクティビティが表示されている間にフォアグラウンド サービスを起動した場合、そのフォアグラウンドサービスが停止するまでは引き続き位置情報へのアクセスが許可されています。

  4. アプリが終了してから、短期間(約30秒ほど)の間は位置情報へのアクセスが許可されています。

1から3に関しては公式のガイドに記載されている内容ですが、4のアプリ終了時に関しては自身で確認した内容になります。 確認方法としては

  • 「今回のみ」のオプションを選択したのちにアプリを強制終了させ、一定時間後に再度アプリを立ち上げてから位置情報へのアクセス権限を要求する。

という流れを通して確認しました。
その結果、約30秒ほどは再度権限を要求しても権限リクエストダイアログが表示されなかったため、アプリ終了後も短時間は位置情報へのアクセスが許可されたままになっているようです。

ACCESS_BACKGROUND_LOCATION権限を利用した「常に許可」オプションに関する

Android10以降、アプリがバックグラウンドでも位置情報を取得するためにはACCESS_BACKGROUND_LOCATION権限をユーザー側に要求し、ユーザー側で「常に許可」オプションを選択してもらう必要があります。
しかし、Android10とAndroid11以降で「常に許可」オプションを表示させる方法が変わっています。

  • Android10 : ACCESS_FINE_LOCATION権限とACCESS_BACKGROUND_LOCATION権限を同時にリクエストする。

  • Android11:ACCESS_FINE_LOCATION権限が許可された後に、ACCESS_BACKGROUND_LOCATION権限を要求する。

Android 10

Android10からはACCESS_FINE_LOCATION権限に加えて、ACCESS_BACKGROUND_LOCATION 権限も同時にリクエストすることで権限リクエストダイアログに「常に許可」オプションを表示させることができます。

Android 11以降

Android11では、ACCESS_FINE_LOCATION権限に加えて、ACCESS_BACKGROUND_LOCATION権限も同時にリクエストするリクエストが無視されるようになりました。代わりに、ACCESS_FINE_LOCATION権限が許可された後にACCESS_BACKGROUND_LOCATION権限を要求すると、アプリの設定画面に「常に許可」オプションを表示できるようになります。(ACCESS_BACKGROUND_LOCATION権限を要求した際に、設定画面に直接飛ばされるようになっています。)

おわりに


今回は、Androidの位置情報に関する許可設定について簡単にまとめました。
Androidは、OSのバージョンアップによって年々セキュリティやプライバシー等の強化を行っており、位置情報へのアクセスに関してもその影響を受けやすい部分にあります。
取り扱いが難しい一方で、位置情報というデータを有効活用できればアプリをより良いものにできるため、位置情報を取得しているアプリも多いです。 そのようなアプリに業務で携わった時のためにも、位置情報の権限に関してはプライバシーポリシーも含めてしっかりと確認するようにしましょう。

参考サイト


Android Developer : SENSORS AND LOCATION
https://developer.android.com/develop/sensors-and-location/location?hl=en

Android Developer : All Android Release
https://developer.android.com/about/versions?hl=ja

Android Developer : Request runtime permissions
https://developer.android.google.cn/training/permissions/requesting#workflow_for_requesting_permissions

Android Developer : Tristate location permissions
https://source.android.google.cn/docs/core/permissions/tristate-perms?hl=en

\もっと身近にもっとリアルに!DAAE公式X/​


執筆者プロフィール:Ikemoto Fumito
Unity・C#でのゲーム開発やKotlin・JavaでのAndroidアプリ実装を主に行ってました。 最近はまたAndroidに帰ってきました。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/

PHOTO:UnsplashEdho Pratama