Android应用开发提高篇-----获取本地IP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android应用开发提高篇-----获取本地IP相关的知识,希望对你有一定的参考价值。

一、概述

       习惯了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>

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

 

技术分享

打开网络再运行该程序:

 

技术分享

好了。



 
 
标签: Android开发
好文要顶 关注我 收藏该文 技术分享 技术分享
0
0
 
(请您对文章做出评价)
 
« 上一篇:Android应用开发基础篇(6)-----Service
» 下一篇:Android应用开发基础篇(7)-----BroadcastReceiver
posted @ 2012-02-21 19:27 lknlfy 阅读(2319) 评论(1) 编辑 收藏

 

 
#1楼 2012-03-04 12:18 | 陈小道  
写的很好,不仅内容好,而且排版清晰。
我原来也写过获ip的当不知道为什么老是获得的是ipv6。
后来我改成这样了:
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
// 设置IP地址
public String setIpAddr(WifiManager wifiManager) {
    // 判断wifi是否开启
    String ipString = "";
    if (wifiManager.isWifiEnabled()) {
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int ipAddress = wifiInfo.getIpAddress();
        // 格式转换
        ipString = (ipAddress & 0xFF) + "." + ((ipAddress >> 8) & 0xFF)
                "." + ((ipAddress >> 16) & 0xFF) + "."
                + ((ipAddress >> 24) & 0xFF);
    else // 如果wifi没有开启的话,就获取3G的IP
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface
                    .getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
 
                // 遍历所有的网卡设备,一般移动设备上只有2张网卡,其中一张是环回网卡
                for (Enumeration<InetAddress> enumIpAddr = intf
                        .getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    // 过滤掉环回网卡和IPv6
                    if (!inetAddress.isLoopbackAddress()
                            && !(inetAddress instanceof Inet6Address)) {
                        ipString = inetAddress.getHostAddress().toString();
                    }
                }
            }
        catch (SocketException ex) {
            Log.e("TAG""getIpAddr()" + ex.toString());
        }
    }
    return ipString;
}

 

以上是关于Android应用开发提高篇-----获取本地IP的主要内容,如果未能解决你的问题,请参考以下文章

android 获取IP地址

android 获取IP地址

android 获取IP地址

Android应用开发提高篇-----FaceDetector(人脸检测)

Android应用开发提高篇-----Camera使用

Android应用开发提高篇-----文本朗读TTS(TextToSpeech)