2017-02-19 152 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; 
    } 
});