获取主机ip android

时间:2013-05-02 03:26:42

标签: java android ip-address

试图做我的作业,但无法理解。

我正在制作一款应用程序,该应用程序可以在与我家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时请求地址,但目前这是微不足道的。

1 个答案:

答案 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" />