2017-02-19 109 views
2

在我的应用程序中,我连接到具有自己的WiFi网络的设备。 在Android 6及以上版本中,系统在几秒后询问我是否想连接到该网络,即使没有互联网连接。 只有在批准该消息后,我才能连接到我的设备。 我尝试以编程方式连接到网络,并且不强制用户每次都进入他的设置并进行手动连接。我用下面的代码连接到设备网络:使用无WiFi连接的WiFi

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); 
        } 
       } 
      } 
     }); 

    } 

虽然只要当蜂窝数据处于活动状态时,设备不能连接。如果我禁用了蜂窝数据,那么它工作正常。 我需要知道是否有办法以编程方式做我想要的东西,而不告诉用户禁用他的蜂窝数据。

由于

+0

嗨@YYJO你有这个问题的答案吗? –

+0

@KenRatanachaiS。不幸的是,据我可以告诉它只是不适用于Android。 – YYJo

回答

1

虽然只要蜂窝数据是活动的,设备不被连接不 apear。如果我禁用了蜂窝数据,那么它的工作原理就是 。

我正面临类似的问题。默认的解决方案不适合我,所以我使用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); 
} 

UPDATE: 可以使用NetworkCallbackNetwork也是对象。

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; 
    } 
});