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;
}