Android mac地址获取方式
2019-08-07 本文已影响0人
geaosu
本文出自: https://blog.csdn.net/u012400885/article/details/53505597/
2018年1月17日14:04:09更新:
产品,后台反馈,说部分手机或存在获取不到Mac的情况。再仔细询问后,发现获取不到的有如下特征:
当前网络环境为4G
然而经过LZ在公司打死搜索Android机型测试后发现如下几个奇葩无奈的事儿:
部分设备在WIFI、4G以及无网络的情况可以正常获取Mac;
较多设备仅仅支持在WIFI情况下可以获取。
针对以上问题,LZ有如下猜(xiang)测(fa):
既然在WIFI状态下正常获取,那么如果我4G情况下打开WIFI,可以获取到么?
1
针对以上想法,LZ专门做了一个测试,测试结果,很nice~
果然,4G情况下打开WIFI即可获取到正常的MAC!
需要权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.Log;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.Reader;
import java.net.NetworkInterface;
import java.util.Collections;
import java.util.List;
/**
* author : HLQ
* e-mail : 925954424@qq.com
* time : 2018/01/17
* desc : 获取mac 兼容6.0获取 以及4g环境下获取失败
* version: 1.0
*/
public class MacUtils {
/**
* 获取失败默认返回值
*/
public static final String ERROR_MAC_STR = "02:00:00:00:00:00";
// Wifi 管理器
private static WifiManager mWifiManager;
/**
* 实例化WifiManager对象
*
* @param context 当前上下文对象
* @return
*/
private static WifiManager getInstant(Context context) {
if (mWifiManager == null) {
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
}
return mWifiManager;
}
/**
* 开启wifi
*/
public static void getStartWifiEnabled() {
// 判断当前wifi状态是否为开启状态
if (!mWifiManager.isWifiEnabled()) {
// 打开wifi 有些设备需要授权
mWifiManager.setWifiEnabled(true);
}
}
/**
* 获取手机设备MAC地址
* MAC地址:物理地址、硬件地址,用来定义网络设备的位置
* modify by heliquan at 2018年1月17日
*
* @param context
* @return
*/
public static String getMobileMAC(Context context) {
mWifiManager = getInstant(context);
// 如果当前设备系统大于等于6.0 使用下面的方法
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return getAndroidHighVersionMac();
} else { // 当前设备在6.0以下
return getAndroidLowVersionMac(mWifiManager);
}
}
/**
* Android 6.0 设备兼容获取mac
* 兼容原因:从Android 6.0之后,Android 移除了通过WiFi和蓝牙API来在应用程序中可编程的访问本地硬件标示符。
* 现在WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()方法都将返回:02:00:00:00:00:00
*
* @return
*/
public static String getAndroidHighVersionMac() {
String str = "";
String macSerial = "";
try {
// 由于Android底层基于Linux系统 可以根据shell获取
Process pp = Runtime.getRuntime().exec(
"cat /sys/class/net/wlan0/address ");
InputStreamReader ir = new InputStreamReader(pp.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (; null != str; ) {
str = input.readLine();
if (str != null) {
macSerial = str.trim();// 去空格
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
if (macSerial == null || "".equals(macSerial)) {
try {
return loadFileAsString("/sys/class/net/eth0/address")
.toUpperCase().substring(0, 17);
} catch (Exception e) {
e.printStackTrace();
macSerial = getAndroidVersion7MAC();
}
}
return macSerial;
}
/**
* Android 6.0 以下设备获取mac地址 获取失败默认返回:02:00:00:00:00:00
*
* @param wifiManager
* @return
*/
@NonNull
private static String getAndroidLowVersionMac(WifiManager wifiManager) {
try {
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String mac = wifiInfo.getMacAddress();
if (TextUtils.isEmpty(mac)) {
return ERROR_MAC_STR;
} else {
return mac;
}
} catch (Exception e) {
e.printStackTrace();
Log.e("mac", "get android low version mac error:" + e.getMessage());
return ERROR_MAC_STR;
}
}
/**
* 兼容7.0获取不到的问题
*
* @return
*/
public static String getAndroidVersion7MAC() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase("wlan0")) continue;
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
res1.append(String.format("%02X:", b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception e) {
Log.e("mac", "get android version 7.0 mac error:" + e.getMessage());
}
return ERROR_MAC_STR;
}
public static String loadFileAsString(String fileName) throws Exception {
FileReader reader = new FileReader(fileName);
String text = loadReaderAsString(reader);
reader.close();
return text;
}
public static String loadReaderAsString(Reader reader) throws Exception {
StringBuilder builder = new StringBuilder();
char[] buffer = new char[4096];
int readLength = reader.read(buffer);
while (readLength >= 0) {
builder.append(buffer, 0, readLength);
readLength = reader.read(buffer);
}
return builder.toString();
}
}