强制Android使用无线networking,没有互联网

我正在构build一个需要通过WiFinetworking进行通信的Android应用程序,该networking将不具有任何Internet访问权限。 问题是,即使WiFi连接,当WiFinetworking上没有连接互联网时,androidselect使用蜂窝/移动数据。

我已经阅读了很多关于这个问题的post,其中许多涉及到设备的根源,但是对于生产应用来说这是不可能的(生根设备不是一个选项)。 其他的解决scheme(如我的代码波纹pipe)build议使用bindProcessToNetwork() ,它完美的工作在我的索尼Z2,但没有在我testing过的其他设备上(所有运行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); } }); } } 

Solutions Collecting From Web of "强制Android使用无线networking,没有互联网"

你可以尝试将全局设置captive_portal_detection_enabled设置为0(false)。

实际发生的事情是,默认情况下,每当你连接到一个WiFi,FW将testing一个服务器(通常是谷歌),看看它是否是一个俘虏WiFi(需要login)。 所以如果你的wifi没有连接到谷歌,这个检查将失败。 之后,该设备知道wifi没有互联网连接,根本不会自动连接到它。

将此设置设置为0,将避免此检查。

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

编辑:您可能需要直接使用string“captive_portal_detection_enabled”,而不是根据Android版本不可见的常量。

你需要在设置中禁用移动数据(如果这可以通过编程方式完成,这可能是一个可能的select),或者取出USIM;

否则常见的行为是,它总是会回退到最佳的可用连接(而与因特网网关的连接可能是首选的,因为它被大多数应用使用)。

也看到这个答案 。

你可以检查WiFi是否连接,然后进行其他显示一个对话框,要求用户连接到一个WiFinetworking

由于现在API-23中不推荐使用NetworkInfo.isConnected()方法,因此以下是一种方法,用于检测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 } }