Android開發提高篇(1)—–獲取本地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>

好瞭,不打開網絡直接運行該程序,可以看到提示:

 

 

打開網絡再運行該程序:

 

好瞭。

摘自 lknlfy
 

發佈留言