获取Android Phone的各种IP

因为要知道AP模式下的Android Phone的IP啊,好让其他连接上的手机可以直接访问这手机上的服务,不过好像AP模式下默认都是192.168.43.1这个IP

所以要想办法拿到各种IP,比如说外网IP(这个是移动网络动态分配的,在这个项目里,完全没看到什么卯月)、还有内网IP(供其它局域网内的手机访问其服务)。

官方提供的接口,好像都是获取自身在GPRS/3G/4G/WIFI下的IP,好像也可以获取AP模式下的IP?

咱这里通过使用shell里的程序来获取我们需要的信息,比如说ifconfig(权限不够,用系统级程序的UID+签名可以破,发布不出去,需要root的话,就没什么卯月了,不过ifconfig里面可以提供的信息真是好丰富啊,还能用它配置网络。)、ip addr(这个没什么权限要求,就是你了!基于AOSP的原生系统来做,不知道会不会有厂商改动这一块的东西,啧啧)这里只提取了局域网IP、局域网广播IP、和移动网络的IP,其他的信息需求,可以自己调用ip addr看下。

代码:

private String[] getLocalStaticIP() throws IOException{
        String ip[]=new String[3];
        Runtime runtime=Runtime.getRuntime();
        java.lang.Process proc = runtime.exec("ip addr");
        InputStream is=proc.getInputStream();
        InputStreamReader isr=new InputStreamReader(is);
        BufferedReader br=new BufferedReader(isr);
        String line;
        int i=0;
        while((line=br.readLine())!=null){
            if(line.contains("inet")&&line.contains("ap")){
                Pattern p=Pattern.compile("(?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))");
                Matcher m=p.matcher(line);
                while(m.find()){
                    ip[i]=m.group();
                    i++;
                }
            }
            if(line.contains("inet")&&line.contains("ccmni")){
                Pattern p=Pattern.compile("(?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))");
                Matcher m = p.matcher(line);
                while(m.find()){
                    ip[2]=m.group();
                }
            }
        }
        if(ip[2]!=null)return ip;
        else return null;
    }

直接读shell信息,然后正则表达式提取了三个IP,局域网IP、局域网广播IP、外网IP。

好! 又完成一篇,碎觉。

Leave a Reply

Your email address will not be published. Required fields are marked *