强制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);
}
});
}
}
你能试着设置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版本是不可见的常数。
'无法解析Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED' – Lonergan6275
@ Lonergan6275直接尝试使用字符串“captive_portal_detection_enabled”,而不是根据您使用的Android版本不可见的常量。 – lax1089
这需要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
}
}
你可以试试我在这个职位给了解决方案:https://stackoverflow.com/questions/42329775/using-a-wifi-without-internet-connection/46165010#46165010 –