以 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:
WifiManager
WifiAwareManager
WifiAwareSession
WifiP2pManager
WifiRttManager
Wi-Fi 存取權工作流程
圖 1 顯示在搭載 Android 13 以上版本的裝置上,針對指定 Android 13 以上版本為目標版本的應用程式,Wi-Fi 存取權的工作流程。請注意,只要您聲明應用程式不會從 Wi-Fi 裝置資訊推斷實際位置,就不需要再宣告 ACCESS_FINE_LOCATION
權限:
圖 2 顯示搭載 12L 以下版本的裝置上,Wi-Fi 存取權的工作流程。請注意,此方法需要 ACCESS_FINE_LOCATION
權限。