我正在开发一个Wifi自动连接功能,我很震惊这个API是多么糟糕.
我现在使用了5种不同的API,但我仍然无法以用户预期的方式获得它.
我有一个在Android 10+上启用wifi自动连接的设置,我将try 以下方法:
- 判断我是否持有
ACCESS_WIFI_STATE
权限: - 当我获得许可后,我会在Android 11+上判断我之前的wifi建议是否保存了
wifiManager.networkSuggestions.isNotEmpty()
如果是真的,我会判断我当前连接的wifi,请参阅步骤x.在较低级别上,我会跳过此步骤并转至步骤3 - 我使用wifi建议API和
WifiNetworkSuggestion.Builder()
,并建议用户使用我的wifi - 当用户接受我的建议时,到目前为止我很好.我无法在Android 10上验证我的建议是否被接受.在Android 11上,这是可能的(参见步骤2).然而,我仍然不知道设备是否真的连接了wifi.所以我进入第7步
- 当用户拒绝我的建议时,我几乎退出了游戏,我再也不能问用户了(从技术上讲,有一个隐藏良好的功能,你可以切换权限,但没有用户会找到它).在安卓10上,我只需判断我是否连接了正确的wifi,至少理论上是这样(见第7步).
- 在安卓11+上,我可以退回到
Settings.ACTION_WIFI_ADD_NETWORKS
意图,它总是可以添加wifi(缺点是用户可以共享wifi密码) - 我需要验证之前的步骤是否有效,用户是否实际连接到所需的wifi.为此,我已经拥有权限
ACCESS_WIFI_STATE
、ACCESS_NETWORK_STATE
、ACCESS_COARSE_LOCATION
和ACCESS_FINE_LOCATION
.然而,ConnectivityManager
API并没有返回实际的SSID
,这让我抓狂. - 如果用户没有连接到正确的wifi,我会try 使用
Settings.Panel.ACTION_WIFI
操作让用户连接到正确的wifi
总结一下:
- 我使用
WifiNetworkSuggestion
API - 如果可能的话,我会退到
Settings.ACTION_WIFI_ADD_NETWORKS
- 我try 验证用户当前是否连接到了正确的wifi
- 我try 通过
Settings.Panel.ACTION_WIFI
操作帮助用户连接到正确的wifi(甚至打开wifi)
这真的是一团糟还是有更简单的方法?
我目前正在访问SSID,如下所示:
private val currentSsid: String?
get() =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val wifiInfo = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)?.transportInfo as? WifiInfo
wifiInfo?.ssid
} else {
wifiManager.connectionInfo?.ssid
}
基于Unable to get WIFI SSID using onCapabilitiesChanged in Android 12,我认为我访问值的方式不受支持.我现在得到的值是"<unknown ssid>"
.