现在博主在上大三,正在学习一些计算机网络的一些概念,知道了局域网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(){@Overridepublic 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;}}};@Overrideprotected 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() {@Overridepublic void onClick(View v) {//创建一个新的工作线程用来执行网络操作,这里用到了OKHttp开源库new Thread(new Runnable() {@Overridepublic 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

Android获取手机WiFi IP地址,MAC地址和网关地址程序实例相关推荐

  1. android socket gprs 与 wifi 网络切换,Android应用开发Android 获取手机Wifi地址和Gprs地址,反射修改Wifi地址...

    Android 获取手机Wifi地址和Gprs地址,反射修改Wifi地址. //查看Wifi地址publicString   getWifiIpAddress() { //获取wifi服务WifiMa ...

  2. Android获取手机及路由器的Mac地址和IP地址

    Android获取Mac地址及IP地址需要添加权限, 在AndroidManifest.xml中: <uses-permission android:name="android.per ...

  3. 获取手机WiFi Ip地址

    如何获取手机WiFi的ip地址,我就直接贴代码吧: public class MainActivity extends AppCompatActivity {private TextView tv;@ ...

  4. Android获取手机IMEI,IMSI, MAC标识和唯一标识的生成

    急的直接看这个: android 获取设备IMEI与序列号: ​ //IMEI(imei) TelephonyManager tm = (TelephonyManager) ChinaApplicat ...

  5. android获取wifi mac地址吗,Android获取当前WiFi的MAC地址-适配所有版本

    ** Android获取当前WiFi的MAC地址 ** package com.dogness.platform.utils; import android.content.Context; impo ...

  6. 【小功能2】android获取手机信息(号码,内存,CPU,分辨率,MAC,IP,SD卡,IMEI,经纬度,信号强度等等)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://2402766.blog.51cto.com/2392766/1080837 为了 ...

  7. iOS 获取手机的ip地址 并传给后台(三步搞定)

    第一步 创建一个NSObject 文件 .h 文件 写 #import <Foundation/Foundation.h> @interface NSObject (GetIP) + (N ...

  8. python获取mac、计算机id_python 获取本机IP、mac地址、计算机名的简单示例

    这篇文章主要为大家详细介绍了python 获取本机IP.mac地址.计算机名的简单示例,具有一定的参考价值,可以用来参考一下. 对python获取本机IP.mac地址.计算机名感兴趣的小伙伴,下面一起 ...

  9. php获取手机ip地址,获取手机的ip地址

    获取手机的ip地址 2014年10月14号 发表于:评论 () 热度:1287 随着手机功能的不断完善,手机网站的开发日趋简单,所以很多人都趋于用html不限定宽度的方式来写电脑网页.同样的,手机浏览 ...

最新文章

  1. python敏感字替换_教学案例_Python处理敏感词汇方法
  2. lacp静态和动态区别_lacp静态与动态区别
  3. mysql 投票总排行_MySQL投票表,查找每个用户对条目的最新投票,并根据值进行计数...
  4. string转为char数组_StringBuilder的区别是什么?String是不可变?一点课堂(多岸学院)...
  5. CV+NLP,使用tf.Keras构建图像搜索引擎
  6. 组装高性能服务器配置,高性能计算服务器参考配置需求.doc
  7. A* search算法解迷宫
  8. 【bzoj2199/Usaco2011 Jan】奶牛议会——2-sat
  9. 飘云阁(PYG)番茄插件 弹窗清除
  10. jabber服务器_最近JavaScript Jabber播客-Microsoft(而非Microsoft)和Web
  11. 原生Js通过form表单提交后的跳转问题
  12. A - 敌兵布阵--线段树--模板水题
  13. 教你快速缩小多个横屏短视频画面的两种方法
  14. 论文阅读:CVPR 2022 Object Localization under Single Coarse Point Supervision
  15. Tensorflow基础知识
  16. 【遗传编程/基因规划】Genetic Programming
  17. 认知觉醒:开启自我改变的原动力
  18. 还在为520礼物发愁吗?教你用python撩女朋友
  19. 传奇微端大带宽服务器如何选择
  20. 项目型公司 VS 产品型公司

热门文章

  1. 三维地面激光扫描行业调研报告 - 市场现状分析与发展前景预测
  2. python中文分句_python实现中文文本分句的例子
  3. [生存志] 第74节 孔子集结诗经
  4. libVLC库下载及测试
  5. 【AD小知识】PCB布线理论及实际操作
  6. ios13测试版怎么卸载软件,苹果iOS13怎么卸载软件 iOS13删除软件教程
  7. APP优化 启动速度优化
  8. unreal无损音乐百度云_嵐-IN THE SUMMER[FLAC]
  9. 解决电脑开机黑屏只有鼠标的问题
  10. Pycharm安装、使用的一些操作