灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3809回复:0

Android开发提高篇(1)-----获取本地IP

楼主#
更多 发布于:2012-09-06 13:42


一、概述
       习惯了Linux下的网络编程,在还没用智能机之前就一直想知道怎么得到手机的IP地址(玩智能机之前我是不搞手机应用的)。好了,得知Android是基于Linux内核的,那么不就可以利用之前学的Linux下的网络编程方法来获取IP了吗?呵呵,其实这是比较底层的方法,在Android上,完全可以利用java的API来实现,而且实现的代码非常简单。下面的实现只可以获取到本地IP(内网IP),不包括外网IP,想获得外网IP的话要用其他方法。

二、实现
    新建工程GetIp,修改/res/layout/main.xml文件,在里面增加一个TextView文本,完整的main.xml文件如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
3     Android:orientation="vertical"
4     Android:layout_width="fill_parent"
5     Android:layout_height="fill_parent"
6     >
7
8      <TextView
9         Android:id="@+id/nametextview"
10         Android:layout_width="fill_parent"
11         Android:layout_height="wrap_content"
12         Android:text=" "
13         Android:textSize="20px"
14         />
15
16     <TextView
17         Android:id="@+id/ipTextView"
18         Android:layout_width="fill_parent"
19         Android:layout_height="wrap_content"
20         Android:text=" "
21         Android:textSize="20px"
22         />
23
24 </LinearLayout>

接着,修改GetIp.java文件,主要是声明一个ConnectivityManager对象和一个NetworkInfo对象,编写一个对话框函数,当用户没有打开网络就运行该程序时,该对话框会提示用户检查网络。完整的GetIp.java文件如下:

  1 package com.nan.getip;
  2
  3 import Android.app.Activity;
  4 import Android.app.AlertDialog;
  5 import Android.content.Dialoginterface;
  6 import Android.net.ConnectivityManager;
  7 import Android.net.NetworkInfo;
  8 import Android.os.Bundle;
  9 import java.net.InetAddress;
10 import java.net.NetworkInterface;
11 import java.util.Enumeration;
12 import java.net.SocketException;
13 import Android.util.Log;
14 import Android.widget.TextView;
15
16
17 public class GetIp extends Activity
18 {
19     private TextView ipTextView = null;
20     private TextView nameTextView = null;
21     //定义一个ConnectivityManager对象
22     private ConnectivityManager mConnectivityManager = null;
23     //定义一个NetworkInfo对象
24     private NetworkInfo mActiveNetInfo = null;
25
26     /** Called when the activity is first created. */
27     @Override
28     public void onCreate(Bundle savedInstanceState)
29     {
30         super.onCreate(savedInstanceState);
31         setContentView(R.layout.main);
32
33         nameTextView = (TextView)findViewById(R.id.nametextview);
34         ipTextView = (TextView)findViewById(R.id.ipTextView);
35         //实例化mConnectivityManager对象
36         mConnectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);//获取系统的连接服务
37         //实例化mActiveNetInfo对象
38         mActiveNetInfo = mConnectivityManager.getActiveNetworkInfo();//获取网络连接的信息
39         if(mActiveNetInfo==null)
40             myDialog();
41         else
42             setUpInfo();
43
44     }
45
46     //获取本地IP函数
47     public String getLocalIPAddress()
48     {
49         try
50         {
51             for (Enumeration<NetworkInterface> mEnumeration = NetworkInterface.getNetworkInterfaces(); mEnumeration.hasMoreElements();)
52             {
53                NetworkInterface intf = mEnumeration.nextElement();
54                for (Enumeration<InetAddress> enumIPAddr = intf.getInetAddresses(); enumIPAddr.hasMoreElements();)
55                {
56                    InetAddress inetAddress = enumIPAddr.nextElement();
57                    //如果不是回环地址
58                    if (!inetAddress.isLoopbackAddress())
59                    {
60                        //直接返回本地IP地址
61                        return inetAddress.getHostAddress().toString();
62                    }
63                }
64            }
65         }
66         catch (SocketException ex)
67         {
68             Log.e("Error", ex.toString());
69         }
70         return null;
71     }
72
73     //显示IP信息
74     public void setUpInfo()
75     {
76         //如果是wifi网络
77         if(mActiveNetInfo.getType()==ConnectivityManager.TYPE_WIFI)
78         {
79             nameTextView.setText("网络类型:WIFI");
80             ipTextView.setText("IP地址:"+getLocalIPAddress());
81         }
82         //如果是手机网络
83         else if(mActiveNetInfo.getType()==ConnectivityManager.TYPE_MOBILE)
84         {
85             nameTextView.setText("网络类型:手机");
86             ipTextView.setText("IP地址:"+getLocalIPAddress());
87         }
88         else
89         {
90             nameTextView.setText("网络类型:未知");
91             ipTextView.setText("IP地址:");
92         }
93
94     }
95
96     //显示对话框
97     private void myDialog()
98     {
99         AlertDialog mDialog = new AlertDialog.Builder(GetIp.this)
100         .setTitle("注意")
101         .setMessage("当前网络不可用,请检查网络!")
102         .setPositiveButton("确定", new DialogInterface.OnClickListener()
103         {
104
105             @Override
106             public void onClick(DialogInterface dialog, int which)
107             {
108                 // TODO Auto-generated method stub
109                 //关闭对话框
110                 dialog.dismiss();
111                 //结束Activity
112                 GetIp.this.finish();
113             }
114         })
115         .create();//创建这个对话框
116         mDialog.show();//显示这个对话框
117     }
118
119 }

最后,修改AndroidManifest.xml文件,在里面添加2个权限:

<uses-permission Android:name="Android.permission.INTERNET"></uses-permission>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"></uses-permission>

好了,不打开网络直接运行该程序,可以看到提示:




打开网络再运行该程序:



好了。



喜欢0 评分0
游客

返回顶部