在我的应用中,我正在连接到具有自己的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并尝试强制该应用使用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);
}
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
尽管只要蜂窝数据处于活动状态,设备就不会出现连接状态。如果我禁用蜂窝数据,那么它将正常工作。我需要知道是否有一种方法可以以编程方式完成我想做的事情,而无需告诉用户禁用其蜂窝数据。
谢谢
尽管只要蜂窝数据处于活动状态,设备就不会出现连接状态。如果我禁用蜂窝数据,那么它将正常工作。
我面临着类似的问题。默认解决方案对我不起作用,因此我使用了类中的bindSocket方法Network,显然它可以正常工作。我不知道此解决方案是否适用于您的问题,但是下面是一些代码:
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
}
}
Run Code Online (Sandbox Code Playgroud)
在套接字之后:
if(android.os.Build.VERSION.SDK_INT >= 22) {
wifiNetwork.bindSocket(socket);
}
Run Code Online (Sandbox Code Playgroud)
更新:
您也可以使用a 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;
}
});
Run Code Online (Sandbox Code Playgroud)
从 Marshmallow 开始,您的代码看起来是正确的,但请注意,您的解决方案在 Lollipop(API 级别 21 和 22)中不起作用。
该问题可能是因为您可能试图在连接 WiFi 网络后强制应用程序使用 WiFi 连接。
您需要在更改为 WiFi 网络之前设置NetworkCallback, 以便仅通过 WiFi 进行通信。这是因为一旦连接到所需的网络,onAvailable()将被调用,并且bindProcessToNetwork()将被执行。
考虑查看我的完整解决方案,其中我使用了相同的方法,但也支持 Lollipop。我在Android版本5.1.1、6.0、6.0.1、7.1.1和8.1.0中测试了它。
| 归档时间: |
|
| 查看次数: |
5196 次 |
| 最近记录: |