安卓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;
    }
相关推荐
alexhilton6 小时前
用Konsist与Lint强制执行设计系统契约
android·kotlin·android jetpack
北京自在科技10 小时前
谷歌安卓 Gemini 迎来界面改版,Find Hub 接入 Gemini 支持物品记忆查找
android·安卓
YB137512 小时前
Jetpack Compose 动画Modifier.animateItem()
android
DevLoom_12 小时前
macOS 命令行 curl/git 报 SSL 证书错误?eMudhra 事件完整修复指南
git·macos·ssl
2401_8858850413 小时前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
收纳过往13 小时前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava
狂热开发者14 小时前
车载中控要给鸿蒙用户,能不能和 Android 共用一个二维码?
android·华为·harmonyos
.Bryce.15 小时前
T2-LLM评测不等于Agent评测
android·java·人工智能·后端·gpt·agent·1024程序员节
美狐美颜SDK开放平台16 小时前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
2601_9689007716 小时前
玻璃深加工的工艺窗口:4 道工序的温度与时间参数边界
android·java·javascript