android - 在没有互联网连接的情况下使用 WiFi

标签 android

在我的应用程序中,我正在连接到一个拥有自己的 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/

相关文章:

android - 如何向 Android 应用程序添加垂直平铺(仅)背景

java - Android内存泄漏?

java - 由于构造函数错误无法启动 ListView

android - 升级到 Google Play 服务 :9. 0.0 错误无法解决 : com. google.android.gms :play-services-measurement:9. 0.0

android - 如何获取联系人的主要电子邮件地址

android - 为什么这个 shell 脚本将自己称为 python 脚本?

java - 通过循环从套接字读取数据时获取 "java.io.EOFException"

调用取消后,Android AlarmService repeating alarm 重复一次

android - 从广播接收器向 Activity 发送警报

java - 在 .java 文件中使用 unicode 字符?