安卓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;
    }
相关推荐
佛系打工仔42 分钟前
绘制K线第二章:背景网格绘制
android·前端·架构
my_power5204 小时前
车载安卓面试题汇总
android
csj504 小时前
安卓基础之《(15)—内容提供者(1)在应用之间共享数据》
android
yeziyfx5 小时前
kotlin中 ?:的用法
android·开发语言·kotlin
2501_915918416 小时前
只有 Flutter IPA 文件,通过多工具组合完成有效混淆与保护
android·flutter·ios·小程序·uni-app·iphone·webview
robotx6 小时前
AOSP 设置-提示音和振动 添加一个带有开关(Switch)的设置项
android
青莲8436 小时前
RecyclerView 完全指南
android·前端·面试
青莲8436 小时前
Android WebView 混合开发完整指南
android·前端·面试
龙之叶7 小时前
【Android Monkey源码解析三】- 运行解析
android
KevinWang_8 小时前
Android 的 assets 资源和 raw 资源有什么区别?
android