当前位置: 代码网 > it编程>App开发>Android > Android获取设备IP地址的示例代码

Android获取设备IP地址的示例代码

2024年05月18日 Android 我要评论
​我们在做android平台gb28181设备接入模块的时候,上层需要拿到设备的ip地址,废话不多说,分享一段获取设备ip地址的代码:package com.daniulive.smartpublis

​我们在做android平台gb28181设备接入模块的时候,上层需要拿到设备的ip地址,废话不多说,分享一段获取设备ip地址的代码:

package com.daniulive.smartpublisher;

import android.content.context;
import android.net.wifi.wifiinfo;
import android.net.wifi.wifimanager;

import java.net.inet4address;
import java.net.inetaddress;
import java.net.networkinterface;
import java.util.enumeration;

public class ipaddrutils {

    /**
     * 获取本机ipv4地址
     *
     * @param context
     * @return 本机ipv4地址;null:无网络连接
     */
    public static string getipaddress(context context) {
        if (null == context)
            return getipaddress();

        // 获取wifi服务
        wifimanager wifimanager = (wifimanager) context.getsystemservice(context.wifi_service);
        // 判断wifi是否开启
        if (wifimanager.iswifienabled()) {
            // 已经开启了wifi
            wifiinfo wifiinfo = wifimanager.getconnectioninfo();
            int ipaddress = wifiinfo.getipaddress();
            string ip = inttoip(ipaddress);
            return ip;
        } else {
            // 未开启wifi
            return getipaddress();
        }
    }

    private static string inttoip(int ipaddress) {
        return (ipaddress & 0xff) + "." +
                ((ipaddress >> 8) & 0xff) + "." +
                ((ipaddress >> 16) & 0xff) + "." +
                (ipaddress >> 24 & 0xff);
    }

    /**
     * 获取本机ipv4地址
     *
     * @return 本机ipv4地址;null:无网络连接
     */
    public static string getipaddress() {
        try {
            for (enumeration<networkinterface> en = networkinterface.getnetworkinterfaces(); en.hasmoreelements();) {
                networkinterface intf = en.nextelement();
                for (enumeration<inetaddress> enumipaddr = intf.getinetaddresses(); enumipaddr.hasmoreelements();) {
                    inetaddress inetaddress = enumipaddr.nextelement();
                    if (!inetaddress.isloopbackaddress()
                            && !inetaddress.isanylocaladdress()
                            && inetaddress instanceof inet4address) {
                        return inetaddress.gethostaddress();
                    }
                }
            }
        } catch (exception e) {
        }

        return null;
    }
}

调用非常简单:

string local_ip_addr = ipaddrutils.getipaddress(context_);
log.i(tag, "initgb28181agent local ip addr: " + local_ip_addr);

当然有些场景下,不一定可以拿到设备ip,这时候,需要手动设置ip地址到模块。

方法补充:

除了上文的方法,小编还为大家整理了其他android 获取设备ip的方法,希望对大家有所帮助

获取ip

使用wifi联网与不使用wifi,获取到的ip地址不同。因此,需要先判断当前设备通过哪种方式联网,然后再获取对应的ip地址。

判断网络连接类型

通过connectivitymanager判断网络连接类型,代码如下:

private fun checkcurrentnetworktype() {
    val connectivitymanager = getsystemservice(context.connectivity_service) as connectivitymanager
    connectivitymanager.run {
        if (build.version.sdk_int < build.version_codes.m) {
            when (activenetworkinfo?.type) {
                connectivitymanager.type_mobile -> {
                    // 通过手机流量
                }
                connectivitymanager.type_wifi -> {
                    // 通过wifi
                }
                else -> {}
            }
        } else {
            // android m 以上建议使用getnetworkcapabilities api
            activenetwork?.let { network ->
                getnetworkcapabilities(network)?.let { networkcapabilities ->
                    if (networkcapabilities.hascapability(networkcapabilities.net_capability_validated)) {
                        when {
                            networkcapabilities.hastransport(networkcapabilities.transport_cellular) -> {
                                // 通过手机流量
                            }
                            networkcapabilities.hastransport(networkcapabilities.transport_wifi) -> {
                                // 通过wifi
                            }
                        }
                    }
                }
            }
        }
    }
}

获取手机卡联网 ip

通过networkinterface获取ipv4地址,代码如下:

networkinterface.getnetworkinterfaces().let {
    loo@ for (networkinterface in collections.list(it)) {
        for (inetaddresses in collections.list(networkinterface.inetaddresses)) {
            if (!inetaddresses.isloopbackaddress && !inetaddresses.islinklocaladdress) {
                // ip地址
                val mobileip = inetaddresses.hostaddress
                break@loo
            }
        }
    }
}

获取wifi联网 ip

通过connectivitymanagerwifimanager来获取ip地址,代码如下:

private fun getwifiip() {
    if (build.version.sdk_int < build.version_codes.q) {
        val wifimanager = applicationcontext.getsystemservice(context.wifi_service) as wifimanager
        // ip 地址
        val wifiip = formatter.formatipaddress(wifimanager.connectioninfo.ipaddress)
    } else {
        // android q 以上建议使用getnetworkcapabilities api
        val connectivitymanager = getsystemservice(context.connectivity_service) as connectivitymanager
        connectivitymanager.run {
            activenetwork?.let { network ->
                (getnetworkcapabilities(network)?.transportinfo as? wifiinfo)?.let { wifiinfo ->
                    // ip 地址
                    val wifiip = formatter.formatipaddress(wifiinfo.ipaddress)
                }
            }
        }
    }
}

到此这篇关于android获取设备ip地址的示例代码的文章就介绍到这了,更多相关android获取ip地址内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com