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>
好了,不打開網絡直接運行該程序,可以看到提示:

 \
 

打開網絡再運行該程序:

 \
好了。

 本文轉自:http://www.2cto.com/kf/201203/121463.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM