zoukankan      html  css  js  c++  java
  • 关于获取安卓设备的mac地址

    今日发现一个问题,系统要求从设备上获取一个唯一码作为当前登录用户的唯一标识;

    之前尝试过很多方法,最后决定采用mac地址。

    官方获取mac地址的方法是:

    public static String getWifiMac(Context ctx) {
            WifiManager wifi = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE);
            WifiInfo info = wifi.getConnectionInfo();
            String str = info.getMacAddress();
            if (str == null) str = "";
            return str;
        }
    

    但是最后发现,某些设备上(比如乐视2手机,谷歌的Nexus9 pad),用这种方式获取的mac地址都是02:00:00:00:00:00 .

    并不能起到唯一标识的作用。

    后来发现,Android的内核是linux,那么应该可以通过shell命令的方式来获取。

    代码如下:

    /**
         * 这是使用adb shell命令来获取mac地址的方式
         * @return
         */
        public static String getMac() {
            String macSerial = null;
            String str = "";
    
            try {
                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 (IOException ex) {
                // 赋予默认值
                ex.printStackTrace();
            }
            return macSerial;
        }
    

      解决上述两种设备上mac地址获取错误的问题。

         可见,就算是谷歌官方给出的解决方案也未必可靠,要根据实际情况酌情考虑使用。

      另外,尝试了一下在4G网络下获取mac地址,结果是null。说明 4G网络下不会有mac地址这一说,因为根本获取不到。3G网也应该类似(没做试验)。

      但是有些设备,运行shell命令会报错:权限被拒绝。(Nexus 9 pad亲测,这个方法不灵);这就很尴尬了。。

  • 相关阅读:
    docker学习及应用
    openstack入门及应用
    C# 值类型,引用类型区别
    C# 继承
    Unity 使用Plugins接入安卓SDK 基础篇
    详谈 Unity3D AssetBundle 资源加载,结合实际项目开发实例
    Unity3D 协程 浅谈
    《俄罗斯,有点意思》
    老男孩之《生日快乐》
    【诗歌系列】《神曲》
  • 原文地址:https://www.cnblogs.com/hankzhouAndroid/p/6554131.html
Copyright © 2011-2022 走看看