现在博主在上大三,正在学习一些计算机网络的一些概念,知道了局域网ip和网关ip不同的概念,当时还纳了闷了2的32次方好像不咋够用啊,原来是这个样子。

由于之前学过一段时间的Android,同时又在上Android开发的个性课,于是就自然萌发出了一个自己通过编写Android程序获取ip相关信息的小程序。

手机在连入局域网的WiFi的时候,会自动获取IP地址信息到本机,然后可以通过“设置→系统→关于手机→状态信息→IP地址”查看当前的IP地址,得到的应该是IPv6的,不过下方的如“192.168.1.102”就是对应的IPv4的地址,而如果通过4G流量上网的话,那么得到的直接就是IPv4的。

而网关ip也可以说是外网ip则需要与互联网有过信息交流后才能知道,所以要通过一次网络连接才可以,而不少网站(诸如:http://city.ip138.com/city0.asp、http://ip.taobao.com/service/getIpInfo2.php?ip=myip)也提供了查询本机网关ip的服务,只要直接从浏览器输入地址即可得到相关信息。

然而博主要说的是这是诸如2011年、2014年那时候的说法,在目前的实践中已经不太可行了,就比如ip138那个,键入后其实会被链接到http://1212.ip138.com/ic.asp,故当前的话应该将查询网址设为1212的,至于淘宝的那个,如果用电脑浏览器打开的话, 是可以获取到信息的,并且还很详细,可是如果用手机(博主用的是UC浏览器,Android),会出现一个下载php文件的提示,浏览器无法直接解析php文件,所以这种方法也是不可行的,同时博主自己也实际测试了一下发现确实不可以,至少目前我的不可以(Android5.1 华为)。

于是在网上查找并参考了相关资料之后,思路也就基本有了。说实话,现在的网络真的实在是太便捷,真的是很大的一个助手,各种博客论坛开源项目git的存在,程序员的日子已经相对而言很好了。

然而在代码初次编写后发现程序可以获取本机IP、MAC地址,这很容易,直接获取就是了,然而网关IP的获取则崩溃了。

后来发现这个网络操作应该放在子线程来进行,应该通过回调来通知主线程更新UI。
然而修改完成后发现还是无法成功,最后发现是他喵的没有申请android.permission.INTERNET权限。

然而功夫不负有心人,最终还是完成了,嘻嘻。

起初我是想把获取IP信息放在一个类里面通过提供一些方法来实现模块的复用和松耦合,最后发现在网关IP这里失败了,由于要进行异步操作,更新UI操作,无法实现代码独立。
所以最终做成了这个样子:


这里是主Activity代码

import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.text.Html;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;import org.json.JSONObject;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class MainActivity extends AppCompatActivity {    static final String TAG = "MainActivity";    public static final int UPDATE_TEXT = 1;    Button mButton;    TextView textview;    //通过Handler实现对主线程UI更新的回调    private Handler mHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case UPDATE_TEXT:                    IPInfomation ipinfo = new IPInfomation(MainActivity.this);                    String ipadd = ipinfo.getWIFILocalIpAdress();                    String macadd = ipinfo.getMacAddress();                    //String hostip = ipinfo.getHostAddress();                    Log.i(TAG, "onClick: sfafdasf");                    //textview.setText("内网ip为:"+ipadd+"\nMAC地址为:"+macadd);                    String hostip = (String) msg.obj;                    //String ipinfo = (String)textview.getText();                    textview.setText("内网ip为:"+ipadd+"\nMAC地址为:"+macadd+"\n网关地址为:"+hostip);                    break;                default:                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mButton = (Button) findViewById(R.id.button);        textview = (TextView) findViewById(R.id.textView);        mButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //创建一个新的工作线程用来执行网络操作,这里用到了OKHttp开源库                new Thread(new Runnable() {                    @Override                    public void run() {                        URL infoUrl = null;                        InputStream inStream = null;                        Log.i(TAG, "haha");                        try                        {                            OkHttpClient client = new OkHttpClient();                            Request request = new Request.Builder().url("http://1212.ip138.com/ic.asp").build();                            Response response = client.newCall(request).execute();                            String responseData = response.body().string();                            responseData = Html.fromHtml(responseData).toString();                            String hostIp = responseData.substring(responseData.indexOf("[") + 1, responseData.indexOf("]"));                            Log.i(TAG, hostIp);                            Message message = new Message();                            message.what = UPDATE_TEXT;                            message.obj = hostIp;                            mHandler.sendMessage(message);                        }                        catch(MalformedURLException e) {                            e.printStackTrace();                        }                        catch (IOException e) {                            e.printStackTrace();                        }                        //下面的操作只是对通过淘宝接口获取的一次尝试,经实践证实,失败了。                        String IP = "";                        try                        {                            String address = "http://ip.taobao.com/service/getIpInfo2.php?ip=myip";                            URL url = new URL(address);                            HttpURLConnection connection = (HttpURLConnection) url                                    .openConnection();                            connection.setUseCaches(false);                            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK)                            {                                InputStream in = connection.getInputStream();// 将流转化为字符串                                BufferedReader reader = new BufferedReader(                                        new InputStreamReader(in));                                String tmpString = "";                                StringBuilder retJSON = new StringBuilder();                                while ((tmpString = reader.readLine()) != null)                                {                                    retJSON.append(tmpString + "\n");                                }                                Log.i(TAG, retJSON.toString());                                JSONObject jsonObject = new JSONObject(retJSON.toString());                                String code = jsonObject.getString("code");                                if (code.equals("0"))                                {                                    JSONObject data = jsonObject.getJSONObject("data");                                    IP = data.getString("ip") + "(" + data.getString("country")                                            + data.getString("area") + "区"                                            + data.getString("region") + data.getString("city")                                            + data.getString("isp") + ")";                                    Log.e(TAG, "您的IP地址是:" + IP);                                }                                else                                {                                    IP = "";                                    Log.e(TAG, "IP接口异常,无法获取IP地址!");                                }                            }                            else                            {                                IP = "";                                Log.e(TAG, "网络连接异常,无法获取IP地址!");                            }                        }                        catch (Exception e)                        {                            IP = "";                            Log.e(TAG, "获取IP地址时出现异常,异常信息是:" + e.toString());                        }                    }                }).start();            }        });        Log.i(TAG, "onCreate: ");    }}

以下是IPInfomation类的代码实现:

import android.content.Context;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;/** * Created by defangfang on 2017/3/29. */public class IPInfomation {    private  WifiManager mWifiManager;    private  WifiInfo mWifiInfo;    public IPInfomation(Context mContext){        //获取wifi服务        mWifiManager = (WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);        //判断wifi是否开启        if (!mWifiManager.isWifiEnabled()) {            mWifiManager.setWifiEnabled(true);        }        mWifiInfo = mWifiManager.getConnectionInfo();    }    public  String getWIFILocalIpAdress() {        int ipAddress = mWifiInfo.getIpAddress();        return formatIpAddress(ipAddress);    }    private static String formatIpAddress(int ipAdress) {        return (ipAdress & 0xFF ) + "." +                ((ipAdress >> 8 ) & 0xFF) + "." +                ((ipAdress >> 16 ) & 0xFF) + "." +                ( ipAdress >> 24 & 0xFF) ;    }    public  String getMacAddress() {        return mWifiInfo.getMacAddress();    }}

界面如下:


Over

更多相关文章

  1. Android[安卓] 版Air Video 远程播放电脑视频
  2. android解析xml文件的方式之DOM解析
  3. [Android]你不知道的Android进程化(1)--进程信息
  4. android动态加载资源
  5. Android(安卓)进阶——高级UI必知必会之常用的自定义ViewGroup进
  6. android 扫码设备获取扫码回调内容实践
  7. android获取设备分辨率的新方法
  8. 高德地图Android错误码1008、32和7;错误提示invalid_user_scode;返
  9. android 优秀源码

随机推荐

  1. 应用程序(xx)与系统不兼容,是否继续安装?
  2. 让洪水猛兽变成温顺小羊——浅谈Android
  3. Android中对话框的类型
  4. Android开发教程02:Android四大组件简介
  5. Android差量更新
  6. Android(安卓)代码混淆技术总结
  7. Android(安卓)Toast进阶——自定义Toast
  8. Android平台调用Web Service:示例
  9. Android NDK之接口统一
  10. [Android] 开心消消乐代码(写的比较简单)