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>

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

打开网络再运行该程序:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值