试图做我的作业,但无法理解。
我正在制作一款应用程序,该应用程序可以在与我家24小时无线连接的手机上运行。我希望它检测主机IP并跟踪任何更改,但我无法让代码工作。我找到了InetAddress类,看起来就像我需要的那样,但是下面的代码抛出了一个通用的异常“坏的东西出错了”,我不知道怎么把它固定下来,因为它不是该方法抛出的UnknownHostException文档:
public void getIP(View view) {
isNetOK();
getLocalIpAddress();
}
public void isNetOK() {
//get connectivity manager
connMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//call getActiveNetworkInfo method of connMan, returns a networkInfo object
NetworkInfo netInfo = connMan.getActiveNetworkInfo();
if (netInfo !=null && netInfo.isConnected()) {
setViewText("net_stat", "Network Connected");
netOK = true;
} else {
setViewText("net_stat", "Network Unavailable");
}
}
public void getLocalIpAddress() {
isNetOK();
if (netOK) {
try{
InetAddress ownIP = InetAddress.getLocalHost();
localIP = ownIP.toString();
}catch (UnknownHostException e){
setViewText("ip_view", "Error: unknown host");
} catch (Exception ex) {
setViewText("ip_view", "Something bad is going wrong");
}
}
isNetOK工作得很好,我已经分别称它为一天左右。
有人可以指出为什么这段代码不起作用? 这是最好的方法吗?我的目标是将家中的服务器与我在GoDaddy获得的域名相关联。我的IP地址是动态的,但每隔几个月才会更改一次,或者当电源耗尽时。我想要一个可以偶尔检查ip一次的应用程序(6小时?),如果有变化通知我,我可以更新DNS。我知道,hacky和slow等等,但它真的只是供私人使用,看看我是否可以使它工作。
编辑1
我在下面的budcopter的答案中尝试了这个方法,最后得到了一些代码处理了一些变化:
public void getLocalIpAddress() {
if (netOK) {
try{
WifiManager WiMan = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = WiMan.getConnectionInfo();
int address = wifiInfo.getIpAddress();
String ipAddress = (String) Integer.toString(address);
setViewText("ip_view", ipAddress);
} /*catch (UnknownHostException e){
setViewText("ip_view", "Error: unknown host");
} */catch (Exception ex) {
setViewText("ip_view", "Something bad is going wrong");
}
}
返回一个有效的int,十位数。但是,当我在whatismyip.com上查看它们时,它们甚至不一样。手机的局域网地址是192.168.1.110,我们的外部IP是75.xx.xx.xxx,返回的是1812048064.即使我重新启动WiFi无线电,这个号码也会返回。不知道WifiManager系统服务给了我什么号码?
此外,我会添加一项检查,以防止在禁用WiFi时请求地址,但目前这是微不足道的。
答案 0 :(得分:0)
试试这个:
public void getLocalIpAddress() {
// remove it, duplicated call
// isNetOK();
if (netOK) {
try{
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
int address = info.getIpAddress();
String ipAddress = Formatter.formatIpAddress(address);
setViewText("ip_view", ipAddress);
} catch (UnknownHostException e){
setViewText("ip_view", "Error: unknown host");
} catch (Exception ex) {
setViewText("ip_view", "Something bad is going wrong");
}
}
不要忘记androidmanifest.xml中的userpermisson:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />