android检测用户是否使用代理上网
在一些网络需求中,为了防止用户抓包,往往采用检测用户当前网络是不是VPN上网的手段。但是依照国内网上的写法,测试中发现根本就没有用。所以经过一段时间的查询之后,找到了解决方法。
以往的写法
/* *
* 判断设备 是否使用代理上网
*/
private boolean isWifiProxy(Context context) {
final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
String proxyAddress;
int proxyPort;
if (IS_ICS_OR_LATER) {
proxyAddress = System.getProperty("http.proxyHost");
String portStr = System.getProperty("http.proxyPort");
proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
} else {
proxyAddress = android.net.Proxy.getHost(context);
proxyPort = android.net.Proxy.getPort(context);
}
return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
}
现在的新写法
注意:使用该写法容易产生一刀切的问题,但是目前没有找到很好的解决方案,因此只能将就用一下
/**
* 检测用户是否使用VPN代理上网抓包
* @param context 上下文
* @return vpn使用结果
*/
public static boolean isVpnProxy(final Context context) {
ConnectivityManager connMgr = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
boolean isVpnConn = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
for (Network network : connMgr.getAllNetworks()) {
NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
if (networkInfo.getType() == ConnectivityManager.TYPE_VPN) {
isVpnConn |= networkInfo.isConnected();
}
}
}
return isVpnConn;
}