在我的应用程序中,我正在连接到一个拥有自己的 WiFi 网络的设备。 在 android 6 及更高版本中,即使没有互联网连接,系统也会在几秒钟后询问我是否要连接到该网络。 只有在批准该消息后,我才能连接到我的设备。 我尝试以编程方式连接到网络,而不是强制用户每次都进入他的设置并手动连接。我使用以下代码连接到设备网络:
private void connectToWiFi(WifiManager wifiManager, String wifiName) {
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = "\"" + wifiName + "\"";
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiManager.addNetwork(configuration);
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for (WifiConfiguration i : list) {
if (i.SSID != null && i.SSID.equals("\"" + wifiName + "\"")) {
wifiManager.disconnect();
wifiManager.enableNetwork(i.networkId, true);
wifiManager.reconnect();
break;
}
}
}
并且还试图强制应用程序使用 WiFi 连接而不是我正在使用的蜂窝数据:
NetworkRequest.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder = new NetworkRequest.Builder();
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
String ssid = wifiManager.getConnectionInfo().getSSID();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.bindProcessToNetwork(null);
if (ssid.equals("\"" + Prefs.getWifiName(PUFMainActivity.this) + "\"")) {
connectivityManager.bindProcessToNetwork(network);
connectivityManager.unregisterNetworkCallback(this);
}
}
}
});
}
虽然只要蜂窝数据处于 Activity 状态,设备似乎就不会连接。如果我禁用蜂窝数据,那么它就可以正常工作。 我需要知道是否有一种方法可以在不告诉用户禁用他的蜂窝数据的情况下以编程方式执行我想要的操作。
谢谢
最佳答案
Although as long as the Cellular data is active the device doesn't apear to be connected. If I disable the Cellular data then it works fine.
我遇到了类似的问题。默认解决方案对我不起作用,所以我使用了 Network
类中的 bindSocket
方法,显然它工作得很好。我不知道这个解决方案是否适用于您的问题,但这里有一些代码:
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] networks = connectivityManager.getAllNetworks();
for(Network network : networks){
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI){
wifiNetwork = network; // Grabbing the Network object for later usage
}
}
在套接字之后:
if(android.os.Build.VERSION.SDK_INT >= 22) {
wifiNetwork.bindSocket(socket);
}
更新:
您也可以使用 NetworkCallback
来获取 Network
对象。
NetworkRequest.Builder builder;
builder = new NetworkRequest.Builder();
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
wifiNetwork = network;
}
});
关于android - 在没有互联网连接的情况下使用 WiFi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42329775/