美文网首页移动开发
获取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";
        }
      }
    

    相关文章

      网友评论

      • 康康渐渐:此方法在海信和乐视手机上会打开用户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