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()无效.
您可以尝试使用新的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类.
我找到了一个解决方法来启用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)