Java setProcessDefaultNetwork始终返回false
我正在开发一款应用程序,它只在连接到移动数据网络时执行一些安全操作。我正试图让应用程序强制其所有网络流量通过特定网络,因此我正在查看在级别21中添加的api调用: 也为空 我还尝试了另一种方法,以防根据另一个答案网络不可用,所以我看到:Java setProcessDefaultNetwork始终返回false,java,android,networking,Java,Android,Networking,我正在开发一款应用程序,它只在连接到移动数据网络时执行一些安全操作。我正试图让应用程序强制其所有网络流量通过特定网络,因此我正在查看在级别21中添加的api调用: 也为空 我还尝试了另一种方法,以防根据另一个答案网络不可用,所以我看到: ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); NetworkRequest.
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上都尝试过这一点。我发现了它不起作用的原因,本机代码创建了一个套接字,该套接字也恰好需要INTERNET许可。SDK中未列出此权限,但您的应用程序需要此权限才能设置默认网络。对于学分,可在此处找到替代方法问题:
Network defProcNetwork = ConnectivityManager.getProcessDefaultNetwork();
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);