要求存取鄰近 Wi-Fi 裝置的權限

如果應用程式指定 Android 13 (API 級別 33) 以上版本並管理 Wi-Fi 連線,應要求 NEARBY_WIFI_DEVICES 執行階段權限。這項權限可讓您更輕鬆地證明應用程式能存取鄰近 Wi-Fi 裝置的必要性;在舊版 Android 中,這些應用程式必須改為宣告 ACCESS_FINE_LOCATION 權限。

權限是鄰近裝置群組的一部分

NEARBY_WIFI_DEVICES 權限是「鄰近裝置」權限群組的一部分。在 Android 12 (API 級別 31) 中新增的群組也包含與藍牙和超寬頻相關的權限。您向這個權限群組要求任何權限組合時,系統會顯示單一執行階段對話方塊,並要求使用者核准您的應用程式對鄰近裝置的存取權。在系統設定中,使用者必須以群組的形式啟用或停用鄰近裝置權限。例如,使用者無法停用 Wi-Fi 存取權,但保持特定應用程式的藍牙存取權。

嚴格宣告應用程式不會衍生實體位置

當您指定 Android 13 以上版本為目標時,請考慮應用程式是否會從 Wi-Fi API 取得位置資訊;如果不是,強烈建議您強力聲明。如要進行此斷言,請在應用程式資訊清單檔案中,將 usesPermissionFlags 屬性設為 neverForLocation,如以下程式碼片段所示。這項程序類似於您在聲明藍牙裝置資訊絕不會用於位置資訊時採取的做法:

<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 以上版本為目標,您必須宣告 NEARBY_WIFI_DEVICES 權限,才能呼叫下列任一 Wi-Fi API:

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 資訊。