我需要检查我的Android应用程序是否存在到主机的路由。这是我的代码:
private void ensureRouteToHost(String proxyAddr) throws IOException
{
ConnectivityManager connMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
int inetAddr;
inetAddr = lookupHost(proxyAddr); // Return -938825536 for IP 192.168.10.200
Log.d(TAG, "host for proxy is " + inetAddr);
if (inetAddr == -1)
{
Log.e(TAG, "cannot establish route for " + proxyAddr + ": unkown host");
throw new IOException("Cannot establish route for " + proxyAddr + ": Unknown host");
}
else
{
int[] apnTypes = new int[] {ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_MOBILE_MMS, ConnectivityManager.TYPE_MOBILE_DUN, ConnectivityManager.TYPE_MOBILE_HIPRI, ConnectivityManager.TYPE_MOBILE_SUPL};
for (int i=0; i<apnTypes.length; i++)
{
if (connMgr.requestRouteToHost(apnTypes[i], inetAddr))
{
Log.d(TAG, "route to host requested");
return;
}
}
Log.e(TAG, "unable to request route to host");
throw new IOException("Cannot establish route to proxy " + inetAddr);
}
}
public static int lookupHost(String hostname)
{
hostname = hostname.substring(0, hostname.indexOf(":") > 0 ? hostname.indexOf(":") : hostname.length());
String result = "";
String[] array = hostname.split("\\.");
if (array.length != 4) return -1;
int[] hexArray = new int[] {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
hexArray[0] = Integer.parseInt(array[0]) / 16;
hexArray[1] = Integer.parseInt(array[0]) % 16;
hexArray[2] = Integer.parseInt(array[1]) / 16;
hexArray[3] = Integer.parseInt(array[1]) % 16;
hexArray[4] = Integer.parseInt(array[2]) / 16;
hexArray[5] = Integer.parseInt(array[2]) % 16;
hexArray[6] = Integer.parseInt(array[3]) / 16;
hexArray[7] = Integer.parseInt(array[3]) % 16;
for (int i=0; i<8; i++)
{
result += Integer.toHexString( hexArray[i] );
}
return Long.valueOf(Long.parseLong(result, 16)).intValue();
}
它在大多数设备上都能完美运行,但这真的很奇怪,它在Nexus S Europe上无效。我尝试了几个Nexus,我总是遇到这个问题。
当我拨打ensureRouteToHost
时,问题出在connMgr.requestRouteToHost(apnTypes[i], inetAddr)
方法中。无论我输入什么,它总是返回false。我的计划是检查我的MMS应用程序是否可以访问IP 192.168.10.200
。 这对于公共IP(例如stackoverflow.com)(69.59.197.21或1161544981为int)都不起作用。
那么,你知道为什么这不适用于某些设备吗? 感谢您阅读我的帖子。
答案 0 :(得分:0)
您需要调出这些界面,例如首先是HIPRI。这样做的方法是described here。
但是我发现虽然这会使两个接口都出现,并且requestRouteToHost
返回true(至少,一旦网络实际启动),路由仍然没有效果。
这是在许多不同的手机上测试的。
如果你成功了,请告诉我。
答案 1 :(得分:-1)
问题解决了。 无法使用wifi找到IP路由。最简单的方法是禁用wifi,做你的东西,然后启用wifi。
以下是我使用的代码:
// Disable wifi if it's active
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifiManager.isWifiEnabled())
{
mWasWifiActive = true;
wifiManager.setWifiEnabled(false);
Log.e(TAG, "Wifi was enabled, now Off.");
}
// Do stuff here
// Re-enable wifi if it was active before routing
if (mWasWifiActive)
{
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
Log.e(TAG, "Wifi is back online.");
}