yirj
2021-01-29 16:25
采纳率: 66.7%
浏览 155

Android开发 获取外网IP地址的工具类出现一个很迷惑的问题,求解!!

我所遇到的问题:

在一个写的安卓APP跑源码项目时到模拟器或者真机上时,直接通过下面代码的方式,调用输出可以直接的获取到外网的IP,但是当我把APP打包了之后,连接WIFi或者使用数据网络将APP运行到真机上获取IP的时候就是获取不到打印为空,很迷惑。也添加了关于网络的3个权限拥有完全的网络访问权限,真机也给了位置信息权限。

    new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String ip = IpUtils.GetNetIp();
                    System.out.println("当前外网IP:"+ip);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

当前有问题的代码:

public class IpUtils {
    /**
     * 获取外网ip地址的方法2
     *
     * @return
     */
    public static String GetNetIp() {
        URL infoUrl = null;
        InputStream inStream = null;
        String line = "";
        try {
            infoUrl = new URL("http://httpbin.org/ip"); //json格式信息的API,使用案例。
            URLConnection connection = infoUrl.openConnection();
            HttpURLConnection httpConnection = (HttpURLConnection) connection;
            int responseCode = httpConnection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                inStream = httpConnection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8"));
                StringBuilder strber = new StringBuilder();
                while ((line = reader.readLine()) != null)
                    strber.append(line + "\n");
                inStream.close();
                // 从反馈的结果中提取出IP地址
                int start = strber.indexOf("{");
                int end = strber.indexOf("}");
                String json = strber.substring(start, end + 1);
                if (json != null) {
                    try {
                        JSONObject jsonObject = new JSONObject(json);
                        line = jsonObject.optString("origin");
//                        System.out.println("IP:" + line);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                return line;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return line;
    }
}

希望各位大神在上面的代码的基础上修改代码,能让打包之后的App安装在真机上获取输出外网的IP地址 [最好适配多种网络环境(数据网络,WIFI网络,代理网络VPN)的外网IP获取],希望大佬们提点一下作为初学者的小弟,可以帮帮我想一个解决的办法,再次感谢各位大佬,感激不尽!

  • 好问题 提建议
  • 收藏

2条回答 默认 最新

  • yirj 2021-01-30 09:39
    已采纳

    在APP中调用接口,然后手动解析出IP地址,接口是http请求,在高版本系统上会出现请求失败,是因为从Android 9.0开始默认禁止了http请求,可以使用如下的方案来解决:

    1.https://httpbin.org/ip   (IP后面网址里的http后面添加s,让其成为安全连接)

    2.https://blog.csdn.net/sunnyjerry/article/details/105265048 (根据这篇文章的方式搞一搞)

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • yirj 2021-01-29 17:41

    之前测试获取不到的原因是因为在Android 10上获取不到,换了Android 6.1和7.1的手机就获取到了,请问怎么可以让Android 10这样的高系统的手机版本获取的到外网IP地址,哪里的限制,有什么好的方法吗?

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题