【发布时间】:2017-07-18 10:38:21
【问题描述】:
我正在构建一个需要通过无法访问互联网的 WiFi 网络进行通信的 Android 应用程序。问题是即使连接了 WiFi,当 wifi 网络上没有连接互联网时,android 也会选择使用蜂窝/移动数据。
我已经阅读了很多关于这个问题的帖子,其中很多都涉及到 root 设备,但这对于生产应用程序是不可能的(root 设备是不是一个选项)。其他解决方案(如我下面的代码)建议使用bindProcessToNetwork(),它在我的 Sony 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("ap-name")) {
connectivityManager.bindProcessToNetwork(network);
}
} else {
//This method was deprecated in API level 23
ConnectivityManager.setProcessDefaultNetwork(null);
if (barCodeData.getSsid().contains("ap-name")) {
ConnectivityManager.setProcessDefaultNetwork(network);
}
}
connectivityManager.unregisterNetworkCallback(this);
}
});
}
}
【问题讨论】:
-
你可以试试我在这篇文章中给出的解决方案:stackoverflow.com/questions/42329775/…
-
barCodeData是什么上下文?
标签: android networking wifi iot access-point