强制Android使用无线网络,无网络

强制Android使用无线网络,无网络

问题描述:

我正在构建一款需要通过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 –

你能试着设置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

你需要的设置来禁用移动数据(不能肯定,如果这是可以编程方式,这可能是一个可能的选项) - 或取出USIM;

其他常见的行为,它会一直回落到最佳的可用连接(而与互联网网关的连接可能是首选,因为它是由大多数应用程序使用)。

也看到这个answer

您可以检查无线网络连接,然后进行其他显示一个对话框,用户要求他连接到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 
    } 
}