我正在开发一款只在应用连接到移动数据网络时才执行某些安全操作的应用。我正试图让应用程序通过特定网络强制所有网络流量,所以我正在查看在21级添加的这个api调用:http://developer.android.com/reference/android/net/ConnectivityManager.html#setProcessDefaultNetwork(android.net.Network)
Network[] networks = cm.getAllNetworks();
for (int i = 0; i < networks.length; i++) {
NetworkInfo netInfo = cm.getNetworkInfo(networks[i]);
if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
foundMobile = true;
Log.d("ANDREW", "Found potential network: setting default...");
result = ConnectivityManager.setProcessDefaultNetwork(networks[i]);
Log.d("ANDREW", "Result: " + result);
}
if (result) {
Log.d("ANDREW", "Success! Restricted to: " + netInfo.toString());
break;
}
}
基本上我正在获得设备支持的所有网络,检查所有网络并查看其中是否有任何一个是移动网络,然后尝试设置默认网络。它确实找到了移动网络,但它从未设法将其设置为默认网络。结果是错误的,以及未来的结果:
Network defProcNetwork = ConnectivityManager.getProcessDefaultNetwork();
也是空的。
我还尝试了一种替代方法,根据我看到的另一个SO答案,网络根本不可用:
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
NetworkCallback networkCallback = new NetworkCallback() {
@Override
public void onAvailable(Network network) {
Log.d("ANDREW", "Network is available!");
boolean result = ConnectivityManager.setProcessDefaultNetwork(network);
Log.d("ANDREW", "RESULT: " + result);
if (ConnectivityManager.getProcessDefaultNetwork() != null) {
Log.d("ANDREW", "Successfully set default network ");
}
}
};
NetworkRequest networkRequest = builder.build();
connectivityManager.requestNetwork(networkRequest, networkCallback);
connectivityManager.registerNetworkCallback(networkRequest, networkCallback);
我获得了isAvailable回调,但它仍然无法设置默认网络。
没有可以使用的日志消息,我甚至查看了本机代码,并且没有任何内容可以指示出现了什么问题。 SDK没有描述我可以看到的任何额外步骤,所以我的问题是,为什么这总是返回false并且开发人员应该做些什么才能使其工作?我在Nexus 5和Nexus 6上都试过这个。
答案 0 :(得分:0)
我发现它为什么不起作用,本机代码创建了一个套接字,它也恰好需要INTERNET权限。它未在SDK中列出,但您的应用程序需要此权限才能设置默认网络。