IPv6技术正在蓬勃发展。
最近做项目的时候,客户要求Setting中将所有的IPv6地址都能够显示出来,目前通过Android标准接口只能获取一个IPv6地址,但是安卓设备可能有多个IPv6地址。为此我们首先想到利用ifconfig去获取,但是用java代码执行Runtime.getRuntime().exec(“ifconfig eth0”)时,发现没有权限。网上有几种方法写到:先执行Runtime.getRuntime().exec(“su”),获取root权限,再去执行Runtime.getRuntime().exec(“ifconfig eth0”),可是我们的设备不允许执行”su”来获取权限。
最后,通过查找代码,参照framework层,获取子网前缀的方法,来获取IPv6地址。
核心的方法是去执行”/system/bin/ip -6 addr show“ 来获取IPv6地址。
话不多说,直接上代码,代码的功能里面的注释写的很明白,参照修改使用即可。
package com.test.getipv6addr;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import android.util.Log;
public class GetIPv6Address {
private static final String TAG = "GET_IPV6"; // TAG标签
private static final String getIpv6Cmd = "/system/bin/ip -6 addr show "; // 默认获取Ipv6地址的shell命令
private static final int IPV6LEN_LEFT_BIT = 6; // 默认,截取的Ipv6字符串左起始位
private static final int IPV6LEN_RIGHT_BIT = 1; // 默认,截取的Ipv6字符串右结束位
private static int ipv6AddrNum = 0; // 记录Ipv6地址的个数
private static String ipv6AddrString = ""; // 由Ipv6地址组成的个数
/**
* 构造函数:GetIPv6Address()
* 参数: 无
* 注意: 调用此构造函数将获取所有网口的Ipv6地址
* */
public GetIPv6Address() {
Log.d(TAG, "get all interface ipv6 address.");
getIpv6Addr(getIpv6Cmd);
}
/**
* 构造函数:GetIPv6Address(String iface)
* 参数: 网口的名称,例如:eth0、wlan0等
* 注意: 调用此构造函数将获取传入网口参数的Ipv6地址
* */
public GetIPv6Address(String iface) {
Log.d(TAG, "get " + iface + " ipv6 address.");
getIpv6Addr(getIpv6Cmd + iface);
}
/**
* 方法名:getIpv6AddrNumber()
* 参数: 无
* 功能: 获取Ipv6地址字符串
* 返回值:返回由Ipv6地址组成的字符串,例如:::1/128&fdd1:850a:264c::581/64&fe80::86ff:4cff:fe4b:ecb1/64&
* */
public String getIpv6AddrString() {
return ipv6AddrString;
}
/**
* 方法名:getIpv6AddrNumber()
* 参数: 无
* 功能: 获取Ipv6地址个数
* 返回值:返回getIpv6Addr()方法获取的Ipv6地址个数
* */
public int getIpv6AddrNumber() {
return ipv6AddrNum;
}
/**
* 方法名:getIpv6Addr(String command)
* 参数: shell下需要执行的命令,例如: /system/bin/ip -6 addr show
* 功能: 1、获取Ipv6地址,并统计地址的个数
* 返回值:无
* */
private void getIpv6Addr(String command) {
String ipv6addrTemp = "";
ipv6AddrNum = 0;
ipv6AddrString = "";
try {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec(command);
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine()) != null) {
if((line.contains("inet6")) && (line.contains("scope"))) {
ipv6addrTemp = line.substring(line.indexOf("inet6") + IPV6LEN_LEFT_BIT, line.lastIndexOf("scope") - IPV6LEN_RIGHT_BIT);
ipv6AddrString = ipv6AddrString + ipv6addrTemp + "&";
ipv6AddrNum++;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
ipv6AddrString = "";
Log.d(TAG, "get ip error" + e);
}
}
}
注意:以上的代码只是获取IPv6地址的个数和字符串,获取字符串后,切割之后便可以分条显示IPv6地址。
OK,就是这么简单。