Android 5.0 Lollipop和4.4 KitKat忽略了我的WiFi网络,enableNetwork()没用

Ser*_*m's 24 android connectivity android-wifi android-5.0-lollipop

我的应用程序直接连接到充当接入点的硬件设备(无法访问互联网).

我无法连接,因为Android 5.0 automaticcaly切换到有效的互联网连接,所以如果我有数据连接(3G,4G,...)或预先配置的网络我无法连接到我的设备,因为它忽略了WiFi .

那么我如何强制Android使用我以编程方式激活的网络?

我只是使用:

wifiManager.enableNetwork(id, true))
Run Code Online (Sandbox Code Playgroud)

id我要连接的设备的网络在哪里.该true参数无用.

使用的建议解决方案ConnectivityManager.requestNetwork()无效.

pel*_*lya 8

您可以尝试使用新的Lollipop API ConnectivityManager.requestNetwork(),假设如下:

ConnectivityManager cm = (ConnectivityManager) Context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.requestNetwork(new NetworkRequest.Builder()
                  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                  .setNetworkSpecifier("XX:XX:XX:XX:XX:XX")
                  .build(),
                  new ConnectivityManager.NetworkCallback() {
                      void onAvailable(Network network) {

                      }
                  });
Run Code Online (Sandbox Code Playgroud)

XX:XX:XX:XX:XX:XX你的WiFi SSID 在哪里.我不确定它的格式,如果它被使用,我没有找到任何对setNetworkSpecifierAndroid内部的引用,除了NetworkCapabilities类.


Ser*_*m's 7

我找到了一个解决方法来启用Lollipop上的desidered网络:

WifiConfiguration在Lollipop中启用网络

现在调用后这是我的代码wifiManager.enableNetwork(id, true):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    List<WifiConfiguration> networks = wm.getConfiguredNetworks();
    Iterator<WifiConfiguration> iterator = networks.iterator();
    while (iterator.hasNext()) {
        WifiConfiguration wifiConfig = iterator.next();
        if (wifiConfig.SSID.replace("\"", "").equals(wc.SSID.replace("\"", "")))
            wm.enableNetwork(wifiConfig.networkId, true);
        else
            wm.disableNetwork(wifiConfig.networkId);
    }
    wm.reconnect();
}
Run Code Online (Sandbox Code Playgroud)

也许秘密就是打电话reconnect(),我此时不知道.

更新 不幸的是,只有在执行代码之前有效的WiFi连接处于活动状态时,此解决方法才有效.如果您只通过3G连接,则不起作用.

2015年1月19日更新

这段代码实际上适用于Android 5/6.0.x:

//bind to current thread
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    connManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            ConnectivityManager.setProcessDefaultNetwork(network);
            //...
        }
    });
}
Run Code Online (Sandbox Code Playgroud)