最近博主学习了如何通过某些技术来识别不同的Android手机,在此进行一番总结。

使用DeviceId

deviceId为Android提供的用于手机识别的识别码,其获取代码如下:
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);Log.d("MyLog", telephonyManager.getDeviceId());

打印Log如下:

getDeviceId方法的文档如下:
该方法会根据手机的类型为GSM(Global System for Mobile Communication,全球移动通信系统)或CDMA(Code Division Multiple Access,码分多址),返回对应的IMEI(International Mobile Equipment Identity,国际移动设备身份码)、MEID(Mobile Equipment Identifier,移动设备识别码)或ESN码(Electronic Serial Number,电子序列号)。
但该方法获取的deviceId也有一定的缺陷:
  1. 非手机的Android设备没有deviceId
  2. 获取deviceId需要READ_PHONE_STATE权限
  3. 在少数手机上该方法存在bug

使用MAC地址

MAC地址即 Media Access Control或者Medium Access Control 地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。一般而言,每个主机都会有其自己的MAC地址,因此我们可以通过MAC地址来识别一台Android手机。
以下为获取MAC地址例子:
方法一,使用WifiManager,这种方法需要 ACESS_WIFI_STATE 权限:
        String macAddress = null;WifiManager wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);WifiInfo info = (null == wifiManager ? null : wifiManager.getConnectionInfo());if (null != info) {macAddress = info.getMacAddress();}Log.d("MyLog", macAddress);

值得注意的是,据说在Android 6.0以上版本中,该方法会不再适用,获取的MAC都会变为 02:00:00:00:00:00 默认值。

方法二,使用cmd命令直接访问网卡MAC地址:
        String macSerial = "";try {Process pp = Runtime.getRuntime().exec("cat /sys/class/net/wlan0/address");InputStreamReader ir = new InputStreamReader(pp.getInputStream());LineNumberReader input = new LineNumberReader(ir);String line;while ((line = input.readLine()) != null) {macSerial += line.trim();}input.close();} catch (IOException e) {e.printStackTrace();}Log.d("MyLog", macSerial);

这种方法不需要任何权限即可获取MAC地址,不过当手机未连接wifi时,无法获取MAC地址。

通过MAC地址来识别我们的手机具有一定的可行性,但这种方法仍存在一定的缺陷:
  1. 不是所有设备都具有网卡或者蓝牙
  2. 如果wifi没有打开过,我们便无法获取其MAC地址
  3. 蓝牙设备只有在打开的时候才能获取MAC地址

使用UUID

UUID含义是通用唯一识别码 (Universally Unique Identifier),是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。UUID由以下几部分组合而成:
  1. 当前日期和时间
  2. 时钟序列
  3. 全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得)
获取UUID的例子如下:
        UUID uuid = UUID.randomUUID();Log.d("MyLog", uuid.toString());

打印的log如下:

使用uuid的缺陷如下:
  1. uuid生成的结果较长
  2. uuid需要在用户本地保存,因此有可能被篡改

使用Serial Number

Serial Number是用于辨识设备的序列号,其获取的例子如下:
Log.d("MyLog", android.os.Build.SERIAL);

打印log如下:

该方法的缺陷如下:
  1. Serial Number在没有IMEI码设备(非手机设备)上必须提供,但手机设备上可能没有
  2. 在Android 版本2.3以前可能没有Serial Number
因此,Serial Number可以结合DeviceId来使用

使用ANDROID_ID

在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被恢复出厂设置后该值可能会被重置
获取ANDROID_ID的方法如下:
        String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.Secure.ANDROID_ID);Log.d("MyLog", ANDROID_ID);

打印Log如下:

使用ANDROID_ID时,我们需要注意一下问题:
  1. 在Android 2.2版本中可能存在问题
  2. 可能有设备产生相同ANDROID_ID
  3. 由于厂商定制系统可能导致bug,返回null
综上所述,Android 手机识别的几种方法可以用下图进行总结:

Android 手机识别相关推荐

  1. android筛选cookie,服务器无法从Android手机识别Cookie

    我正在尝试连接到drupal服务器.我以前能够做到这一点,但drupal开发人员现在要求我添加另一个cookie.服务器没有注册我尝试在下面发送的cookie.谁能明白为什么? public stat ...

  2. 基于android的条码识别技术,基于Android手机的条码识别系统研究

    摘要: 当前,条码技术在商品管理.生产自动化.邮政系统.交通运输等领域得到了广泛的应用.与此同时,随着网络信息技术的发展,尤其是近几年以智能手机为代表的智能终端设备的兴起,移动互联网获得了蓬勃发展,为 ...

  3. adb 51 android.rules,使用51-android-rules解决ubuntu上不识别 android手机的问题

    此文系转载:http://blog.sina.com.cn/s/blog_96a11ddf0101t56b.html 首先我们在编译完一个项目后,在项目的输出档中将会有一个adb文件 /out/hos ...

  4. 【问题解决】解决eclipse不识别Android手机的问题

    [问题&解决]解决eclipse不识别Android手机的问题 参考文章: (1)[问题&解决]解决eclipse不识别Android手机的问题 (2)https://www.cnbl ...

  5. 适用于Android手机的汉信码识别SDK

    Android手机上识别QRCode的App很多,源于那个有名的开源项目 ZXing 和 zBar,就目前看来在苹果手机上的识别效果还是很不错的, 不过由于苹果自动iOS7之后就已经内置了QRCode ...

  6. Android手机扫描识别银行卡技术

    Android手机扫描识别银行卡技术 1.Android手机扫描识别银行卡技术背景分析 手机支付.网络支付已经非常成熟,消费者已经习惯了使用手机支付宝进行支付,用手机银行进行消费和转账.但是,整个线上 ...

  7. android手机 u盘 启动不起来,安卓手机不识别U盘、不能连接PC的处理方法

    一.安卓手机不识别u盘 手机外接优盘,就是OTG功能,OTG功能就是On-The-Go的英文缩写,字面上可以理解为"安上即可用".而作为无线通讯设备或是移动设备的一项拓展功能,其实 ...

  8. 如何修改软件识别android手机型号

    今天看到QQ空间里别人发的心情下面显示发自手机iphone6,于是好奇QQ空间是如何识别手机型号的,经过百度发现.原来android手机System/build.prop文件可以实现修改手机型号的功能 ...

  9. Android手机身份证拍照识别SDK

    Android手机身份证拍照识别SDK 一.Android手机身份证拍照识别应用背景 这些年,随着互联网金融的极速发展,第三方支付.理财.P2P网贷.征信等APP应用成爆发式的增长,在众多APP中都涉 ...

最新文章

  1. JAVASCRIPT函数式编程
  2. LC31 Next Permutation
  3. PowerPC汇编指令集
  4. php面向对象封装mysql_php mysqli面向对象封装mysql数据库常用操作
  5. java bigdecimal赋值_Java中BigDecimal类介绍及用法(亲测)
  6. sql相同顺序法和一次封锁法_率土之滨追击战法攻略
  7. 大数据预测实战-随机森林预测实战(三)-数据量对结果影响分析
  8. HDU-1520 Anniversary party(树形DP)
  9. Idea tomcat控制台日志乱码
  10. javascript权威指南_重读javascript权威指南(3)
  11. 12种常见贴片焊接工具
  12. 20162327WJH第二次实验——树
  13. 区块链教程之Bitcoin公钥和地址生成
  14. 【JavaScript】为什么是script error.
  15. 基于CAN总线的汽车诊断协议--Windows上位机设计
  16. android 自动弹起键盘
  17. ubuntu/linux下打包压缩war、解压war包和jar命令
  18. Snowflake Snow Snowflakes
  19. 图解实时操作系统和非实时操作系统的区别
  20. iOS - navigationController简单使用

热门文章

  1. 树莓派 2.8寸 ili9341 tft lcd spi 屏幕显示
  2. office三件套与mathtype的安装和导入word
  3. 水调歌头-中秋 苏轼(宋)
  4. 基于Linux ncurses图形库的贪吃蛇小游戏
  5. 复制目录本身和不复制目录本身的区别
  6. 领域驱动设计(3)模型驱动设计
  7. 【集群】部署LVS-DR群集
  8. solor快速_Solr原理?为什么要用Solr?Solr为什么比较快?
  9. 跟踪到高能量宇宙射线的来源
  10. android_65_简易画画板