Android 13(API レベル 33)以降をターゲットとし、Wi-Fi 接続を管理するアプリは、
NEARBY_WIFI_DEVICES
実行時の権限をリクエストする必要があります。この
権限を使用すると、アプリが付近の Wi-Fi デバイスにアクセスする正当性を簡単に示すことができます。
以前のバージョンの Android では、この種のアプリは代わりに
ACCESS_FINE_LOCATION
権限を宣言する必要がありました。
権限は「付近のデバイス」グループに含まれる
NEARBY_WIFI_DEVICES 権限は、付近のデバイス権限グループに含まれます。このグループは Android 12(API レベル 31)で追加されており、
Bluetooth と超広帯域無線に関連する権限も含まれています。この権限グループから権限の組み合わせをリクエストすると、実行時のダイアログが 1 つ表示され、アプリが付近のデバイスにアクセスすることを承認するように求められます。システム設定で、ユーザーは付近のデバイス
の各権限をグループとして有効または無効にする必要があります。たとえば、特定のアプリに対して、
Bluetooth アクセスを有効にしたまま Wi-Fi アクセスを無効にすることはできません。
アプリが物理的な位置情報を取得しないことを強く表明する
Android 13 以降をターゲットとする場合は、アプリで Wi-Fi API から位置情報を取得するかどうかを検討してください。取得しない場合は、そのことを強く表明する必要があります。この表明を行うには、次のコード
スニペットに示すように、アプリのマニフェスト ファイルで usesPermissionFlags 属性を
neverForLocation に設定します。この手順は、Bluetooth デバイスの情報が位置情報に使用されないことを
表明する場合と同様です。
<manifest ...> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> <application ...> ... </application> </manifest>
以前のバージョンと一部の API では位置情報の権限が必要
アプリが Android 101 以降をターゲットとしている場合でも、一部の Wi-Fi API では ACCESS_FINE_LOCATION 権限が必要です。次の
メソッドが WifiManager クラスの例です。
また、NEARBY_WIFI_DEVICES 権限は Android 13 以降でのみ使用できるため、アプリで下位互換性を確保するには、すべての宣言でACCESS_FINE_LOCATIONのままにする必要があります。ただし、アプリが正確な位置情報に依存していない場合は、次のコード スニペットのようにして、この権限の最大 SDK バージョンを 32 に設定できます。
<manifest ...> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="32" /> <application ...> ... </application> </manifest>
権限が必要な API を確認する
Android 13 以上をターゲットとするアプリの場合、次の Wi-Fi API を呼び出すには
NEARBY_WIFI_DEVICES権限の宣言が必要です。
WifiManagerWifiAwareManagerWifiAwareSessionWifiP2pManagerWifiRttManager
Wi-Fi アクセスのワークフロー
図 1 は、Android 13 以上をターゲットとするアプリが、Android 13 以上を搭載したデバイスで Wi-Fi アクセスを行う際のワークフローを示しています。なお、アプリが Wi-Fi デバイス情報から物理的な位置情報を取得しないと表明する場合、
権限を宣言する必要はありません。ACCESS_FINE_LOCATION
図 2 は、
12L 以下を搭載しているデバイスでの Wi-Fi アクセスのワークフローを示しています。
ACCESS_FINE_LOCATION 権限への依存に注意してください。