Android 通过Java方法获取所有IPv6地址

10 篇文章 1 订阅

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,就是这么简单。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值