美文网首页移动开发
获取android手机mac地址

获取android手机mac地址

作者: xbase | 来源:发表于2017-01-03 15:07 被阅读7727次

android系统6.0之后,对mac地址的获取添加了权限,按照普通的方法获取如下:

WifiManager  wifiMan = (WifiManager)context.getSystemService(Context.WIFI_SERVICE) ;
WifiInfo wifiInf = wifiMan.getConnectionInfo();
return wifiInf.getMacAddress();

但是这种情况,获取到的mac地址都是:02:00:00:00:00:00,看来就需要另一种方法来获取mac地址:

private static final String marshmallowMacAddress = "02:00:00:00:00:00";
  private static final String fileAddressMac = "/sys/class/net/wlan0/address";

  public static String getAdresseMAC(Context context) {
    WifiManager wifiMan = (WifiManager)context.getSystemService(Context.WIFI_SERVICE) ;
    WifiInfo wifiInf = wifiMan.getConnectionInfo();

    if(wifiInf !=null && marshmallowMacAddress.equals(wifiInf.getMacAddress())){
      String result = null;
      try {
        result= getAdressMacByInterface();
        if (result != null){
          return result;
        } else {
          result = getAddressMacByFile(wifiMan);
          return result;
        }
      } catch (IOException e) {
        Log.e("MobileAccess", "Erreur lecture propriete Adresse MAC");
      } catch (Exception e) {
        Log.e("MobileAcces", "Erreur lecture propriete Adresse MAC ");
      }
    } else{
      if (wifiInf != null && wifiInf.getMacAddress() != null) {
        return wifiInf.getMacAddress();
      } else {
        return "";
      }
    }
    return marshmallowMacAddress;
  }

接下来,来分析一下其中两个重要的方法
1.getAdressMacByInterface()

 private static String getAdressMacByInterface(){
    try {
      List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
      for (NetworkInterface nif : all) {
        if (nif.getName().equalsIgnoreCase("wlan0")) {
          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("MobileAcces", "Erreur lecture propriete Adresse MAC ");
    }
    return null;
  }

2.getAddressMacByFile(wifiMan)

  private static String getAddressMacByFile(WifiManager wifiMan) throws Exception {
    String ret;
    int wifiState = wifiMan.getWifiState();

    wifiMan.setWifiEnabled(true);
    File fl = new File(fileAddressMac);
    FileInputStream fin = new FileInputStream(fl);
    ret = crunchifyGetStringFromStream(fin);
    fin.close();

    boolean enabled = WifiManager.WIFI_STATE_ENABLED == wifiState;
    wifiMan.setWifiEnabled(enabled);
    return ret;
  }

  private static String crunchifyGetStringFromStream(InputStream crunchifyStream) throws IOException {
    if (crunchifyStream != null) {
      Writer crunchifyWriter = new StringWriter();

      char[] crunchifyBuffer = new char[2048];
      try {
        Reader crunchifyReader = new BufferedReader(new InputStreamReader(crunchifyStream, "UTF-8"));
        int counter;
        while ((counter = crunchifyReader.read(crunchifyBuffer)) != -1) {
          crunchifyWriter.write(crunchifyBuffer, 0, counter);
        }
      } finally {
        crunchifyStream.close();
      }
      return crunchifyWriter.toString();
    } else {
      return "No Contents";
    }
  }

相关文章

  • 获取android手机mac地址

    android系统6.0之后,对mac地址的获取添加了权限,按照普通的方法获取如下: 但是这种情况,获取到的mac...

  • Android 版本兼容 — Android 6.0 和 7.0

    Android 6.0 和 7.0后获取Mac地址 随着Android的版本迭代,获取设备的Mac地址也发生了改变...

  • Android 6.0 蓝牙Mac地址获取

    Android 6.0以后获取到的Mac地址都是常量:02:00:00:00:00:00 蓝牙Mac地址获取 Wi...

  • 学习socket笔记

    获取手机wifi 名称 和mac地址 获取手机在链接wifi网络下 ip地址

  • Android 获取mac地址

    由于项目开发需要获取设备的mac地址,因此查阅了Android获取mac地址相关信息,本篇博客转载自《Androi...

  • Android 获取MAC地址

    获取MAC地址的方法主要有如下四种方式1、使用busybox ifconfig2、使用cat /sys/class...

  • android获取mac地址

    获取mac地址分为三段 1.Android 6.0 之前(不包括6.0) 2.Android 6.0(包括) -...

  • Android Mac地址

    android系统6.0之后,对mac地址的获取添加了权限,按照普通的方法获取如下: 但是这种情况,获取到的mac...

  • android 获取mac

    android 获取mac地址 这个方法Android 7.0是获取不到的,返回的是null,其实是返回“02:0...

  • 获取设备唯一ID

    官方博客获取mac地址各种ID获取唯一性ID,各种ID的意义与限制 一.android_id ANDROID_ID...

网友评论

  • 康康渐渐:此方法在海信和乐视手机上会打开用户wifi,原因为何啊,楼主知道不,球指点
    xbase:这个真是不知啊,你说的手机太冷门了
  • 5f3cd2e99a85:十分感谢
  • 自傷無色:纠个错 getAdressMacByInterface少了一个d
  • 自傷無色:所以说还是要开启(过)wifi才可以获取吗?就没有与wifi无关的获取方法吗?
  • tianyake:支持一下
    xbase:@tianyake 谢谢
  • Rong007:这样写的话,在打开app的时候,会弹出app尝试打开WiFi的系统弹窗
    xbase:你说的情况跟系统版本和rom有关系
  • 8e493f84a81d:这个方法有bug。如果我不开wifi,用4g,就会弹出请求权限,我就算给了权限。我们在链接wifi的时候,有一个时间间隔,这个时候代码会直接返回02000000这个。还有下面这段代码:
    if (result != null){
    return result;
    } else {
    result = getAddressMacByFile(wifiMan);
    return result;
    }
    else走不进去。没有wifi的情况 直接被catch掉了。
    到现在也没有特别好的方法获取mac地址。确保mac的唯一性。
    xbase:@秋名山_小尼玛 1.mac地址和4g没啥关系。 2.弹出请求权限,那是因为系统问题,如果我没猜错,你应该是6.0以上的系统。 3.如果你开机之后从没有用过wifi,那么这个值也会返回02000000,这个是我们开发者控制不了的,如果想弥补,可以考虑监控开启wifi的动作,然后在去获取mac地址,但是这个策略问题,跟获取mac的具体方案没有任何关系了。
  • 殇_7fbb:要用电脑吗?具体要用到什么呢?
  • 小毛驴_71f8:唯一性标识这个点确实有用,放在c里实现就更好了,反编译代码驻入java实现还是有风险
    Java_com_admaster_babygrowth_utils_DeviceInfoUtil_stringFromMacJNI(JNIEnv *env, jobject) {
    std::string macstr = "unknow";
    ifstream _file;
    _file.open(FILENAME, ios::in);
    if (!_file) {
    return env->NewStringUTF(macstr.c_str());
    } else {
    std::ifstream t("/sys/class/net/wlan0/address");
    std::string str((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());
    return env->NewStringUTF(str.c_str());
    }
    }
  • 5837da444429:mac地址是一定可以获取得到是吗???
    xbase:@爱踢才会赢 我也去吸收借鉴改良别人的方法,站在巨人的肩膀上
    爱踢才会赢:我用两个手机都可以获取到一个是4.2的,另一个是7.0的,用了好几种方法都不行吗,就这个最牛,谢谢
    xbase:@zgq_aed0 不敢打包票
  • feng__:嗯,试了试,果然可以获取到非(020000000000)的mac地址,有效果,特意登录上谢谢你。
    feng__:@殇_7fbb 用的开发软件,Eclipse或者是Android Studio
    殇_7fbb: @feng__ 要用啥软件来使用这些代码。?
    xbase:@sundyn 客气,互相学习啊

本文标题:获取android手机mac地址

本文链接:https://www.haomeiwen.com/subject/xbxnvttx.html