安卓Android 获取mac地址及sn

1、获取设备mac地址的工具类MacUtil,首先获取有线mac地址,如可获取有线mac地址则使用有线mac地址,否则使用无线mac地址。

非系统应用必须添加对应权限,并获取了权限后才可调用,否则会闪退

java 复制代码
import static android.content.Context.WIFI_SERVICE;

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.text.TextUtils;
import android.util.Log;

import java.net.NetworkInterface;
import java.util.Enumeration;

public class MacUtil {
    private static final String TAG = "MacUtil";

    /**
     * 获取mac地址 如可获取有线mac地址则使用有线mac地址,否则使用无线mac地址
     *
     * @param context 上下文
     * @return max
     */
    public static String getMac(Context context) {
        if (context == null) {
            Log.e(TAG,"getMac --  context is null");
            return "";
        }
        String ethMac = getEthernetMac();
        if (TextUtils.isEmpty(ethMac)) {
            Log.i(TAG,"getMac --  ethMac is empty.getWifiMac");
            // 返回无线mac地址
            return getWifiMac(context.getApplicationContext());
        } else {
            // 返回有线mac地址
            return ethMac;
        }
    }

    /**
     * 获取有线MAC地址
     */
    public static String getEthernetMac() {
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface netWork = interfaces.nextElement();
                if (!netWork.getName().equals("eth0")) {
                    continue;
                }
                byte[] macBytes = netWork.getHardwareAddress();
                if (macBytes == null) {
                    Log.w(TAG,"getEthernetMac --  macBytes is null");
                    return "";
                }
                StringBuilder res1 = new StringBuilder();
                for (byte b : macBytes) {
                    res1.append(String.format("%02X:", b));
                }
                if (!TextUtils.isEmpty(res1)) {
                    res1.deleteCharAt(res1.length() - 1);
                }
                return res1.toString();
            }
        } catch (Exception e) {
            Log.e(TAG,"getEthernetMac --  Exception:" + e.getMessage());
        }
        return "";
    }

    /**
     * 获取无线MAC地址(备注:非系统应用需要添加对应权限,否则运行闪退!)
     *
     * @param context 上下文
     * @return 无线MAC地址
     */
    @SuppressLint({"MissingPermission", "HardwareIds"})
    public static String getWifiMac(Context context) {
        WifiManager wifi = (WifiManager) context.getSystemService(WIFI_SERVICE);
        return wifi.getConnectionInfo().getMacAddress();
    }
}

调用方式:

java 复制代码
String mac = MacUtil.getMac(this);

2、获取sn,非系统应用也需要添加对应权限

java 复制代码
    /**
     * 获取设备序列号SN(备注:非系统应用需要添加对应权限,否则运行闪退!)
     *
     * @return SN序列号
     */
    @SuppressLint("MissingPermission")
    public static String getSn() {
        if (!TextUtils.isEmpty(sCacheSn)) {
            return sCacheSn;
        }
        // 使用属性值获取SN号发现在某些设备上获取不到,现采用原生获取方式
        sCacheSn = android.os.Build.getSerial();
        return sCacheSn;
    }
相关推荐
-SOLO-2 小时前
Android Event 日志完全指南
android
壮哥_icon3 小时前
【Android 系统开发】从掉帧卡顿到丝滑:高频硬件中断(IRQ)的 CPU 亲和性性能优化实战
android·性能优化
千里马学框架3 小时前
Android Framework 新手学习踩坑建议指南
android·智能手机·性能优化·framework·aaos·车载开发·系统工程师
我命由我123455 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
狂奔solar6 小时前
ARMA 模型:从白噪声到万能逼近器
android
渣渣灰飞6 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第二章:RBAC 权限系统设计
android·学习·mysql
qq_422828626 小时前
android 图形学之图层数据送显及合成图层(七)
android
MiyamuraMiyako8 小时前
Compose:从自动滚动到双锚点 LazyLayout
android·android jetpack
用户634214199350710 小时前
base_logger_core --- 跨平台 C++ 日志核心库
android
苦瓜花10 小时前
【Kotlin】初入门
android·开发语言·kotlin