[摘要]本文介绍Android开发提高篇之获取本地IP,主要使用ConnectivityManager来实现,并提供详细的示例代码供参考。
一、概述
习惯了Linux下的网络编程,在还没用智能机之前就一直想知道怎么得到手机的IP地址(玩智能机之前我是不搞手机应用的)。好了,得知Android是基于Linux内核的,那么不就可以利用之前学的Linux下的网络编程方法来获取IP了吗?呵呵,其实这是比较底层的方法,在Android上,完全可以利用Java的API来实现,而且实现的代码非常简单。下面的实现只可以获取到本地IP(内网IP),不包括外网IP,想获得外网IP的话要用其他方法。
二、实现
新建工程GetIp,修改/res/layout/main.xml文件,在里面增加一个TextView文本,完整的main.xml文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<? xml
version = "1.0"
encoding = "utf-8" ?> < LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android" android:orientation = "vertical" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > < TextView android:id = "@+id/nametextview" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:text = "
" android:textSize = "20px" /> < TextView android:id = "@+id/ipTextView" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:text = "
" android:textSize = "20px" /> </ LinearLayout > |
接着,修改GetIp.java文件,主要是声明一个ConnectivityManager对象和一个NetworkInfo对象,编写一个对话框函数,当用户没有打开网络就运行该程序时,该对话框会提示用户检查网络。完整的GetIp.java文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
package
com.nan.getip; import
android.app.Activity; import
android.app.AlertDialog; import
android.content.DialogInterface; import
android.net.ConnectivityManager; import
android.net.NetworkInfo; import
android.os.Bundle; import
java.net.InetAddress; import
java.net.NetworkInterface; import
java.util.Enumeration; import
java.net.SocketException; import
android.util.Log; import
android.widget.TextView; public
class
GetIp extends
Activity { private
TextView ipTextView = null ; private
TextView nameTextView = null ; //定义一个ConnectivityManager对象 private
ConnectivityManager mConnectivityManager = null ; //定义一个NetworkInfo对象 private
NetworkInfo mActiveNetInfo = null ; /**
Called when the activity is first created. */ @Override public
void
onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); nameTextView
= (TextView)findViewById(R.id.nametextview); ipTextView
= (TextView)findViewById(R.id.ipTextView); //实例化mConnectivityManager对象 mConnectivityManager
= (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); //获取系统的连接服务 //实例化mActiveNetInfo对象 mActiveNetInfo
= mConnectivityManager.getActiveNetworkInfo(); //获取网络连接的信息 if (mActiveNetInfo== null ) myDialog(); else setUpInfo(); } //获取本地IP函数 public
String getLocalIPAddress() { try { for
(Enumeration<NetworkInterface> mEnumeration = NetworkInterface.getNetworkInterfaces(); mEnumeration.hasMoreElements();) { NetworkInterface
intf = mEnumeration.nextElement(); for
(Enumeration<InetAddress> enumIPAddr = intf.getInetAddresses(); enumIPAddr.hasMoreElements();) { InetAddress
inetAddress = enumIPAddr.nextElement(); //如果不是回环地址 if
(!inetAddress.isLoopbackAddress()) { //直接返回本地IP地址 return
inetAddress.getHostAddress().toString(); } } } } catch
(SocketException ex) { Log.e( "Error" ,
ex.toString()); } return
null ; } //显示IP信息 public
void
setUpInfo() { //如果是WIFI网络 if (mActiveNetInfo.getType()==ConnectivityManager.TYPE_WIFI) { nameTextView.setText( "网络类型:WIFI" ); ipTextView.setText( "IP地址:" +getLocalIPAddress()); } //如果是手机网络 else
if (mActiveNetInfo.getType()==ConnectivityManager.TYPE_MOBILE) { nameTextView.setText( "网络类型:手机" ); ipTextView.setText( "IP地址:" +getLocalIPAddress()); } else { nameTextView.setText( "网络类型:未知" ); ipTextView.setText( "IP地址:" ); } } //显示对话框 private
void
myDialog() { AlertDialog
mDialog = new
AlertDialog.Builder(GetIp. this ) .setTitle( "注意" ) .setMessage( "当前网络不可用,请检查网络!" ) .setPositiveButton( "确定" ,
new
DialogInterface.OnClickListener() { @Override public
void
onClick(DialogInterface dialog, int
which) { //
TODO Auto-generated method stub //关闭对话框 dialog.dismiss(); //结束Activity GetIp. this .finish(); } }) .create(); //创建这个对话框 mDialog.show(); //显示这个对话框 } } |
最后,修改AndroidManifest.xml文件,在里面添加2个权限:
1
2
|
< uses-permission
android:name = "android.permission.INTERNET" ></ uses-permission > < uses-permission
android:name = "android.permission.ACCESS_NETWORK_STATE" ></ uses-permission > |
好了,不打开网络直接运行该程序,可以看到提示:
打开网络再运行该程序: