【问题标题】:why does InetAddress.getLocalHost().getHostAddress() returns 127.0.0.1 in android .But works fine in JAVA program为什么 InetAddress.getLocalHost().getHostAddress() 在 android 中返回 127.0.0.1 。但在 JAVA 程序中工作正常
【发布时间】:2018-11-01 18:10:02
【问题描述】:

我正在开发一个 android 应用程序,它可以返回连接到 WI-FI 网络的设备的 IP 地址。当我使用代码时

InetAddress.getLocalHost().getHostAddress();

在 JAVA 程序中,它将我的 IP 返回为10.160.2.197(这正是我想要的)。但是当我在 Android 应用程序中运行此代码时,它会返回 127.0.0.1 设备已连接到 WIFI。
Stackoverflow 中的一些解决方案建议使用

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

是否无法使用InetAddress.getLocalHost().getHostAddress();获取IP地址
如果不是那为什么?

这是我的代码

 public class MainActivity extends Activity {

     private Button b;
     private TextView t;

     @Override
     protected void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         b=(Button)findViewById(R.id.button);
         t=(TextView)findViewById(R.id.ip);
         b.setOnClickListener(new View.OnClickListener() {

           @Override
           public void onClick(View arg0) {
              getIp obj=new getIp();
              obj.execute()
           }
        });   
     }    

    class getIp extends AsyncTask<Void,Integer,Void>
    {

        String ip;

        public Void doInBackground(Void...params)
        {
             try {
                  ip=InetAddress.getLocalHost().getHostAddress();
                 } catch (UnknownHostException e) {
                 // TODO Auto-generated catch block
                   e.printStackTrace();
                 }
              return null;
        }

        public void onPostExecute(Void result){
            t.setText(ip);
        }


     }
 }

清单包含以下权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

【问题讨论】:

    标签: java android


    【解决方案1】:

    这是 Android 上的预期行为。请参考getLocalHost()的javadoc:

    请注意,如果主机没有设置主机名 - 作为 Android 设备 通常不会——此方法将有效地返回环回 地址,尽管通过获取名称 localhost 然后进行查找 将其转换为 127.0.0.1。

    【讨论】:

      【解决方案2】:

      如果你有ACCESS_WIFI_STATE 的权限,这应该适合你。

      WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
      String ipAddress = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
      

      【讨论】:

      • 但为什么 InetAddress.getLocalHost().getHostAddress();返回 127.0.0.1?
      • 因为本地和外部IP地址不同。
      • 那么为什么当我在eclipse中将它作为JAVA程序运行时它会给我的设备ip?
      • Android 应用程序可能没有设置主机名,这是正常行为。见docs
      • 非常感谢。终于得到了合适的解释
      猜你喜欢
      • 2012-02-26
      • 2019-09-10
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多