0

宿題をやろうとしましたが、わかりません。

自宅のwifiに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 は問題なく動作します。1 日ほど個別に呼び出しています。

誰かがこのコードが機能しない理由を指摘できますか? これは最善のアプローチですか?私の目標は、自宅のサーバーを GoDaddy で取得したドメイン名にリンクすることです。私の IP アドレスは動的ですが、数か月ごと、または電源が切れたときにのみ変更されます。IP をときどき (6 時間?) 確認し、IP が変更された場合は通知して DNS を更新できるアプリが必要です。ハッキーで遅いなどは知っていますが、実際には私的な使用と、それを機能させることができるかどうかを確認するためのものです。

編集1

以下のバドコプターの回答の方法を試してみたところ、最終的にいくつかの変更を加えたコードが得られました。

    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");
          }
     }

これは、10 桁の有効な int を返します。ただし、whatismyip.com と比較して確認すると、それらはまったく同じではありません。電話の LAN アドレスは 192.168.1.110、外部 IP は 75.xx.xx.xxx、返される整数は 1812048064 です。WiFi 無線の電源を入れ直しても、同じ番号が返されます。WifiManager システム サービスが私に与えている番号は何か分かりますか?

また、WiFi が無効になっている場合にアドレスを要求しないようにするためのチェックを追加しますが、現時点では些細なことです。

4

1 に答える 1

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");
      }

 }

また、androidmainfest.xml の userpermisson を忘れないでください。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
于 2013-05-02T03:44:51.083 に答える