2017-02-27 157 views
20

我正在構建一款需要通過WiFi網絡進行通信的Android應用,該網絡不會有任何互聯網接入。問題是,即使WiFi連接,當wifi網絡上沒有連接互聯網時,android選擇使用蜂窩/移動數據。強制Android使用無線網絡,無網絡

我已經閱讀了許多帖子,其中許多涉及生根設備,但這是不可能與生產應用程序(生根設備是而不是選項)。其他解決方案(如我的代碼波紋管)建議使用bindProcessToNetwork()這完美的作品對我的索尼Z2但不能在其他設備上我已經在(所有正在運行的6.0.1)

private void bindToNetwork() { 
    final ConnectivityManager connectivityManager = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkRequest.Builder builder; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     builder = new NetworkRequest.Builder(); 
     //set the transport type do WIFI 
     builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 
     connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() { 
      @Override 
      public void onAvailable(Network network) { 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 


        connectivityManager.bindProcessToNetwork(null); 
        if (barCodeData.getSsid().contains("screenspace")) { 
         connectivityManager.bindProcessToNetwork(network); 
        } 

       } else { 
        //This method was deprecated in API level 23 
        ConnectivityManager.setProcessDefaultNetwork(null); 
        if (barCodeData.getSsid().contains("screenspace")) { 

         ConnectivityManager.setProcessDefaultNetwork(network); 
        } 
       } 

       connectivityManager.unregisterNetworkCallback(this); 
      } 
     }); 
    } 
} 
+0

你可以試試我在這個職位給瞭解決方案:https://stackoverflow.com/questions/42329775/using-a-wifi-without-internet-connection/46165010#46165010 –

回答

1

你能試着設置captive_portal_detection_enabled的全局設置測試爲0(假)。

什麼實際發生的是,在默認情況下,每次您連接到WiFi時,FW將測試針對服務器(通常是谷歌),看看它是否是一個俘虜的WiFi(需要登錄)。所以如果你的wifi沒有連接到谷歌,這個檢查將失敗。在那之後,設備知道wifi沒有互聯網連接,並且根本不會自動連接到它。

設置此設置爲0,就會避免這種情況的檢查。

編程方式: Settings.Global.putInt(getContentResolver(), Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 0);

編輯:您可能需要使用「captive_portal_detection_enabled」字符串直接,而不是依賴於Android版本是不可見的常數。

+0

'無法解析Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED' – Lonergan6275

+0

@ Lonergan6275直接嘗試使用字符串「captive_portal_detection_enabled」,而不是根據您使用的Android版本不可見的常量。 – lax1089

+1

這需要android.permission.WRITE_SECURE_SETTINGS不可用。我在這個問題中指出,腐爛也不是一種選擇。 http://stackoverflow.com/a/13045819/1685748 – Lonergan6275

0

你需要的設置來禁用移動數據(不能肯定,如果這是可以編程方式,這可能是一個可能的選項) - 或取出USIM;

其他常見的行爲,它會一直回落到最佳的可用連接(而與互聯網網關的連接可能是首選,因爲它是由大多數應用程序使用)。

也看到這個answer

1

您可以檢查無線網絡連接,然後進行其他顯示一個對話框,用戶要求他連接到WiFi網絡

由於該方法NetworkInfo.isConnected()現在已經過時,在API-23,這裏是一個方法檢測,如果Wi-Fi適配器上,並連接到使用WifiManager而不是接入點:

private boolean checkWifiOnAndConnected() { 
    WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

    if (wifiMgr.isWifiEnabled()) { // Wi-Fi adapter is ON 

     WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); 

     if(wifiInfo.getNetworkId() == -1){ 
      return false; // Not connected to an access point 
     } 
     return true; // Connected to an access point 
    } 
    else { 
     return false; // Wi-Fi adapter is OFF 
    } 
}