Android 10 / API 29:如何将手机连接到已配置的网络?

问题描述 投票:4回答:2

我正在开发一种用户必须遵循以下步骤的应用程序:

  1. 将电话连接到wifi;
  2. 将电话从连接的对象连接到专用热点。

当用户连接到连接对象的专用热点时,应用程序会执行一些HTTP请求以对其进行配置。然后,我想自动将应用程序重新连接到步骤1的全局wifi。

从API 21到API 28,此功能非常易于实现,因为我知道我想重新连接手机的SSID。只需几行代码即可完成:

private fun changeCurrentWifiNetworkLegacy(ssidToConnect: String) {
    val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

    var ssidIdentifier: Int? = null

    wifiManager.configuredNetworks?.forEach { config ->
        Log.d("SSID", config.SSID)

        if (config.SSID == "\"${ssidToConnect}\"") {
            ssidIdentifier = config.networkId
        }
    }

    ssidIdentifier?.let { id ->
        wifiManager.enableNetwork(id, true)
    }
}

在API 29上,根据本文,此简单代码不再起作用:https://developer.android.com/about/versions/10/privacy/changes#configure-wifi

根据该文章,现在,我应该使用2个类:WifiNetworkSpecifier和/或WifiNetworkSuggestion

不幸的是,我找不到使用这些类的有效示例,以便将用户连接到先前配置的SSID。

有人已经实现了吗?

谢谢您的帮助。

android android-wifi android-connectivitymanager
2个回答
0
投票

您可以使用以下代码设置要连接的网络:

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
    val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .setNetworkSpecifier(
            WifiNetworkSpecifier.Builder()
                .setSsid("My ssid")
                .build()
        )
        .build()
    cm.requestNetwork(networkRequest, object: ConnectivityManager.NetworkCallback() {
        override fun onUnavailable() {
            Log.d("TEST", "Network unavailable")
        }

        override fun onAvailable(network: Network) {
            Log.d("TEST", "Network available")
        }
    })
}

这使用ConnectivityManager的networkRequest方法来请求具有特定SSID的网络。

此方法要求呼叫者持有Manifest.permission.CHANGE_NETWORK_STATE权限或修改由Settings.System.canWrite(Context)确定的系统设置的能力。

请参阅NetworkCallback类以获取有关可以获取哪些信息的更多文档。

((编辑:缺少添加运输类型。)

进一步编辑:我需要使用.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)使其正常工作。因为在WifiNetworkSpecifier

只能用于请求本地wifi网络(即没有互联网能力)

根据the docs

这给了我一个弹出设备的请求,但最终向我显示了我要求的Wifi网络。


0
投票

Rolandl,您是否最终找到了“找不到设备..”的原因?我有完全一样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.