Android 10+ wifi使用相关权限问题
前言
針對附近 Wi-Fi 設備的新運行時權限:Android 13 引入了?NEARBY_WIFI_DEVICES?權限,該權限屬于?NEARBY_DEVICES?權限組,適用于會管理設備與附近 Wi-Fi 接入點連接情況的應用。借助此權限,您可以更輕松地說明應用為何訪問附近的 Wi-Fi 設備;在以前的 Android 版本中,這類應用需要聲明?ACCESS_FINE_LOCATION?權限。
如果您的應用以 Android 13 為目標平臺并調用多個不同的 Wi-Fi API,則必須從用戶處獲得這項新權限。
注意:如果您的應用嘗試在未獲得適當權限的情況下調用 Wi-Fi API,則會發生?SecurityException。
受影響的用例
這項新權限會影響幾個不同的 Wi-Fi 用例,包括以下用例:
- 查找或連接到附近的設備,如打印機或媒體投射設備。通過該工作流,您的應用可以完成以下類型的任務:
- 通過帶外方式(例如通過 BLE)接收 AP 信息。
- 使用僅限本地使用的熱點,通過 Wi-Fi 感知和連接功能發現并連接到設備。
- 通過 Wi-Fi 直連發現和連接到設備。
- 發起與已知 SSID(例如汽車或智能家居設備)的連接。
- 開啟僅限本地使用的熱點。
- 連接到附近的 Wi-Fi 感知設備。
該權限屬于“附近的設備”權限組
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>保持后向兼容性
由于?NEARBY_WIFI_DEVICES?權限僅適用于 Android 13 或更高版本,因此您應保留對?ACCESS_FINE_LOCATION?的所有聲明,以便在您的應用中提供向后兼容性。不過,只要您堅定聲明應用不會使用 Wi-Fi API 推導物理位置信息,就可以將此權限的最高 SDK 版本設為?32,如下以下代碼段所示:
<manifest ...><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"android:maxSdkVersion="32" /><application ...>...</application> </manifest>請注意,某些 API 仍需要位置信息權限
有幾個 Wi-Fi API 仍然需要?ACCESS_FINE_LOCATION?權限才能獲取位置信息,就像它們在 12L 及更低版本上的一樣。示例包括?WifiManager?類中的以下方法:
- getScanResults()
- startScan()
檢查需要新權限的 API
如果您的應用以 Android 13 或更高版本為目標平臺,您必須聲明?NEARBY_WIFI_DEVICES?權限才能調用以下任何 Wi-Fi API:
- WifiManager
- startLocalOnlyHotspot()
- WifiAwareManager
- attach()
- WifiAwareSession
- publish()
- subscribe()
- WifiP2pManager
- addLocalService()
- connect()
- createGroup()
- discoverPeers()
- discoverServices()
- requestDeviceInfo()
- requestGroupInfo()
- requestPeers()
- WifiRttManager
- startRanging()
Wi-Fi 訪問工作流
圖 1 顯示了搭載 12L 或更低版本的設備上的 Wi-Fi 訪問工作流。請注意對?ACCESS_FINE_LOCATION?權限的依賴。
圖 1.?用于確定以 12L 或更低版本為目標平臺的應用是否可以獲取 Wi-Fi 信息的流程圖。
圖 2 顯示了搭載 Android 13 或更高版本的設備上的 Wi-Fi 訪問工作流(對于以 Android 13 或更高版本為目標平臺的應用)。請注意,只要您聲明應用不會根據 Wi-Fi 設備信息推導物理位置信息,就不再需要聲明?ACCESS_FINE_LOCATION?權限:
?
圖 2.?用于確定以 Android 13 或更高版本為目標平臺的應用是否可以獲取 Wi-Fi 信息的流程圖。
?
總結
以上是生活随笔為你收集整理的Android 10+ wifi使用相关权限问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓Android Studio But
- 下一篇: 2021-12-21 SWUSTOJ69