【问题标题】:Getting the external IP of the device causes exception获取设备的外部IP导致异常
【发布时间】:2014-10-17 06:20:25
【问题描述】:

我正在尝试获取设备的外部 IP。我查看了许多类似问题的答案,发现了许多不同的方法,但它们都抛出异常,所以这个问题不是重复的。我在清单中添加了以下权限:

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

我尝试过的解决方案之一如下: 来自 (Android get external IP)

public void getCurrentIP () {
ip.setText("Please wait...");  
try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet("http://whatismyip.everdot.org/ip");
        // HttpGet httpget = new HttpGet("http://whatismyip.com.au/");
        // HttpGet httpget = new HttpGet("http://www.whatismyip.org/");
        HttpResponse response;

        response = httpclient.execute(httpget);

        //Log.i("externalip",response.getStatusLine().toString());

        HttpEntity entity = response.getEntity();
        if (entity != null) {
                long len = entity.getContentLength();
                if (len != -1 && len < 1024) {
                        String str=EntityUtils.toString(entity);
                        //Log.i("externalip",str);
            ip.setText(str);
                } else {
                        ip.setText("Response too long or error.");
                        //debug
                        //ip.setText("Response too long or error: "+EntityUtils.toString(entity));
                        //Log.i("externalip",EntityUtils.toString(entity));
                }            
        } else {
                ip.setText("Null:"+response.getStatusLine().toString());
        }

}
catch (Exception e)
{
    ip.setText("Error");
}

}

除了这段代码,我尝试了许多其他不同站点的代码,但我仍然遇到异常。我需要其他权限还是代码有问题?其他人说这个代码对他们有用。请帮忙。

这里是日志:

08-23 18:11:52.430: E/MYAPP(9644): exception
08-23 18:11:52.430: E/MYAPP(9644): android.os.NetworkOnMainThreadException
08-23 18:11:52.430: E/MYAPP(9644):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1142)
08-23 18:11:52.430: E/MYAPP(9644):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-23 18:11:52.430: E/MYAPP(9644):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-23 18:11:52.430: E/MYAPP(9644):  at java.net.InetAddress.getAllByName(InetAddress.java:214)
08-23 18:11:52.430: E/MYAPP(9644):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:141)
08-23 18:11:52.430: E/MYAPP(9644):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
08-23 18:11:52.430: E/MYAPP(9644):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
08-23 18:11:52.430: E/MYAPP(9644):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
08-23 18:11:52.430: E/MYAPP(9644):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
08-23 18:11:52.430: E/MYAPP(9644):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
08-23 18:11:52.430: E/MYAPP(9644):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
08-23 18:11:52.430: E/MYAPP(9644):  at com.mreprogramming.ultimatesmartphoneanalyser.Wifi.external_IP(Wifi.java:95)
08-23 18:11:52.430: E/MYAPP(9644):  at com.mreprogramming.ultimatesmartphoneanalyser.Wifi.onResume(Wifi.java:176)
08-23 18:11:52.430: E/MYAPP(9644):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
08-23 18:11:52.430: E/MYAPP(9644):  at android.app.Activity.performResume(Activity.java:5211)
08-23 18:11:52.430: E/MYAPP(9644):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2844)
08-23 18:11:52.430: E/MYAPP(9644):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2883)
08-23 18:11:52.430: E/MYAPP(9644):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2321)
08-23 18:11:52.430: E/MYAPP(9644):  at android.app.ActivityThread.access$600(ActivityThread.java:150)
08-23 18:11:52.430: E/MYAPP(9644):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
08-23 18:11:52.430: E/MYAPP(9644):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-23 18:11:52.430: E/MYAPP(9644):  at android.os.Looper.loop(Looper.java:213)
08-23 18:11:52.430: E/MYAPP(9644):  at android.app.ActivityThread.main(ActivityThread.java:5225)
08-23 18:11:52.430: E/MYAPP(9644):  at java.lang.reflect.Method.invokeNative(Native Method)
08-23 18:11:52.430: E/MYAPP(9644):  at java.lang.reflect.Method.invoke(Method.java:525)
08-23 18:11:52.430: E/MYAPP(9644):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
08-23 18:11:52.430: E/MYAPP(9644):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
08-23 18:11:52.430: E/MYAPP(9644):  at dalvik.system.NativeStart.main(Native Method)

Wifi.java:95 是

response = httpclient.execute(httpget);

【问题讨论】:

  • “我仍然遇到异常” -- stackoverflow.com/questions/23353173/…
  • @CommonsWare 语法错误?
  • @greenapps 我试过的每个代码都会抛出一个独特的异常
  • 这个代码呢?开始命名吧。
  • @greenapps 这段代码 ClientProtocolException 和 IOException

标签: android http ip


【解决方案1】:

我解决了这个问题。代码抛出异常是因为 android 不允许主线程中的 http 请求。所以我使用了一个新线程并且代码有效。

Thread thread = new Thread(new Runnable(){
              @Override
              public void run(){
                  Looper.prepare(); 

                  //The code from my question here

            });
            thread.start();

【讨论】:

  • 你为什么不先搜索你得到的异常?这是多年来众所周知的事情。所以它会让你的问题重复。
  • @osayilgan 你是对的,我应该先检查一下。但是答案可能对其他人有所帮助,因为我检查的问题没有提到新线程。所以我相信这个问题很有用。
猜你喜欢
  • 2015-04-20
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2011-06-01
相关资源
最近更新 更多