您的位置:首页 > 移动开发 > Android开发

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

2012-02-21 19:27 405 查看
[b]一、概述[/b]

习惯了Linux下的网络编程,在还没用智能机之前就一直想知道怎么得到手机的IP地址(玩智能机之前我是不搞手机应用的)。好了,得知Android是基于Linux内核的,那么不就可以利用之前学的Linux下的网络编程方法来获取IP了吗?呵呵,其实这是比较底层的方法,在Android上,完全可以利用Java的API来实现,而且实现的代码非常简单。下面的实现只可以获取到本地IP(内网IP),不包括外网IP,想获得外网IP的话要用其他方法。

[b]二、实现[/b]

新建工程GetIp,修改/res/layout/main.xml文件,在里面增加一个TextView文本,完整的main.xml文件如下:

<?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文件如下:

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个权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>


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



打开网络再运行该程序:



好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: