付近の Wi-Fi デバイスにアクセスする権限をリクエストする

Android 13(API レベル 33)以降をターゲットとし、Wi-Fi 接続を管理するアプリは、NEARBY_WIFI_DEVICES 実行時の権限をリクエストする必要があります。この権限により、アプリが付近の Wi-Fi デバイスにアクセスすることを簡単に正当化できます。以前のバージョンの Android では、そのようなアプリは代わりに ACCESS_FINE_LOCATION 権限を宣言する必要がありました。

権限は「付近のデバイス」グループに含まれる

NEARBY_WIFI_DEVICES 権限は、付近のデバイス権限グループに含まれます。このグループは Android 12(API レベル 31)で追加されており、Bluetooth と超広帯域無線に関連する権限も含まれています。この権限グループに対して権限の組み合わせをリクエストすると、実行時のダイアログが 1 つ表示され、付近のデバイスに対するアプリのアクセスを承認するようユーザーに求められます。システム設定で、ユーザーは付近のデバイスの権限をグループとして有効または無効にする必要があります。たとえば、特定のアプリに対して、Wi-Fi アクセスを無効にすることはできませんが、Bluetooth アクセスを有効にしておくことはできません。

アプリが物理的な位置情報を取得しないことを強く表明する

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 13 以降をターゲットとしている場合でも、一部の 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 権限の宣言が必要です。

Wi-Fi アクセスのワークフロー

図 1 は、Android 13 以上を搭載したデバイスでの、Android 13 以上をターゲットとするアプリの Wi-Fi アクセス ワークフローを示しています。なお、アプリが Wi-Fi デバイス情報から物理的な位置情報を取得しないと表明する場合、ACCESS_FINE_LOCATION 権限を宣言する必要はありません。

図 1: Android 13(API レベル 33)以降をターゲットとするアプリが Wi-Fi 情報にアクセスできるかどうかを判断するためのフローチャート

図 2 は、12L 以前を搭載したデバイスでの Wi-Fi アクセス ワークフローを示しています。ACCESS_FINE_LOCATION 権限への依存に注意してください。

図 2. 12L(API レベル 32)以下をターゲットとするアプリが Wi-Fi 情報にアクセスできるかどうかを判断するためのフローチャート