1.落笔缘由

最近需要获取能够标志Android设备的唯一标识,但是由于Android系统版本不同或者root等诸多原因,造成有些设备标识为NULL或者标识相同的问题,在网上搜索了相关资料,总结一下各种情况。

2.代码

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.Log;/*** @author Administrator* 2017-1-13* 测试机型:* S7-601w 4.1.2系统* IMEI,Serial,Mac,AndroidId都有* FDR-A01w 5.1.1系统* IMEI=null* 其他Serial,Mac,AndroidId都有* 坚果* IMEI,Serial,Mac,AndroidId都有*/
public class Test extends Activity
{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.test);Log.i("lgy", "IMEI:"+ getLocalIMEI(this));Log.i("lgy", "Serial:"+getSerial());Log.i("lgy", "Mac:"+getMac(this));Log.i("lgy", "AndroidId:"+getAndroidId(this));}/***TODO 序列号*从Android 2.3 (“Gingerbread”)开始可用,可以通过android.os.Build.SERIAL获取,对于没有通话功能的设备,它会*返回一个唯一的device ID* @return*/public String getSerial(){try{String str = android.os.Build.class.getField("SERIAL").get(null).toString();return str;} catch (IllegalAccessException | IllegalArgumentException| NoSuchFieldException e){e.printStackTrace();}return null;}/*** * 获取设备的IMEI* IMEI*方式:TelephonyManager.getDeviceId():*问题*范围:网上说“只能支持拥有通话功能的设备,对于平板不可以”,但是我测试了型号FDR-A01w平板确实拿到的是null,*而 型号S7-601的平板却能拿到。*持久性:返厂,数据擦除的时候不彻底,保留了原来的标识。*权限:需要权限:android.permission.READ_PHONE_STATE*bug: 有些厂家的实现有bug,返回一些不可用的数据* @return*/public String getLocalIMEI(Context context){TelephonyManager tm = null;try{tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);if (null != tm){return tm.getDeviceId();}} catch (Exception ex){} finally{tm = null;}return null;}/*** Administrator* 2017-1-13*TODO* Mac地址*ACCESS_WIFI_STATE权限*有些设备没有WiFi,或者蓝牙,就不可以,如果WiFi没有打开,硬件也不会返回Mac地址* @return*/public String getMac(Context context){WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);  WifiInfo info = wifi.getConnectionInfo();  return info.getMacAddress(); }// Android Id  /*** Administrator* 2017-1-13*TODO*    ANDROID_ID*2.2(Froyo,8)版本系统会不可信,来自主要生产厂商的主流手机,至少有一个普遍发现的bug,这些有问题的手机相同的ANDROID_ID: 9774d56d682e549c*但是如果返厂的手机,或者被root的手机,可能会变* @param context* @return*/private static String getAndroidId(Context context) {  String androidId = Settings.Secure.getString(  context.getContentResolver(), Settings.Secure.ANDROID_ID);  return androidId;  }
}
  1. android.os.Build能获取的设备信息

由于在获取序列号的时候使用到了Build,所以总结一下这里能获取的设备信息,网上也有总结过,所以我就不在一一去认真了解了,直接复制一下过来记录一下,不过具体使用的时候还是要去看一下源码,因为有些可能已经Deprecated了。

android.os.Build.BOARD:获取设备基板名称
android.os.Build.BOOTLOADER:获取设备引导程序版本号
android.os.Build.BRAND:获取设备品牌
android.os.Build.CPU_ABI:获取设备指令集名称(CPU的类型)
android.os.Build.CPU_ABI2:获取第二个指令集名称
android.os.Build.DEVICE:获取设备驱动名称
android.os.Build.DISPLAY:获取设备显示的版本包(在系统设置中显示为版本号)和ID一样
android.os.Build.FINGERPRINT:设备的唯一标识。由设备的多个信息拼接合成。
android.os.Build.HARDWARE:设备硬件名称,一般和基板名称一样(BOARD)
android.os.Build.HOST:设备主机地址
android.os.Build.ID:设备版本号。
android.os.Build.MODEL :获取手机的型号 设备名称。
android.os.Build.MANUFACTURER:获取设备制造商
android:os.Build.PRODUCT:整个产品的名称
android:os.Build.RADIO:无线电固件版本号,通常是不可用的 显示unknown
android.os.Build.TAGS:设备标签。如release-keys 或测试的 test-keys
android.os.Build.TIME:时间
android.os.Build.TYPE:设备版本类型  主要为"user" 或"eng".
android.os.Build.USER:设备用户名 基本上都为android-build
android.os.Build.VERSION.RELEASE:获取系统版本字符串。如4.1.2 或2.2 或2.3等
android.os.Build.VERSION.CODENAME:设备当前的系统开发代号,一般使用REL代替
android.os.Build.VERSION.INCREMENTAL:系统源代码控制值,一个数字或者git hash值
android.os.Build.VERSION.SDK:系统的API级别 一般使用下面大的SDK_INT 来查看
android.os.Build.VERSION.SDK_INT:系统的API级别 数字表示android.os.Build.VERSION_CODES类 中有所有的已公布的Android版本号。全部是Int常亮。可用于与SDK_INT进行比较来判断当前的系统版本

4.总结
以上的内容大多是从网上摘抄过来的,是本着验证内容是否正确并做笔记的目的写这篇文章的,没有用这篇文章盈利应该不算犯法吧!最后会附上摘抄文章的地址。

5.源码地址

http://download.csdn.net/detail/lgywsdy/9736577

6.参考文章

http://blog.csdn.net/ioiol/article/details/45535601
http://m.blog.csdn.net/article/details?id=50767326

[Android][获取Android设备唯一标识]相关推荐

  1. 格式android id,android 获取APP的唯一标识applicationId的实例

    使用getIdentifier()方法可以方便的获各应用包下的指定资源ID. 方式一 int indentify = getResources().getIdentifier("com.te ...

  2. Android app 标签,android 获取APP的唯一标识applicationId的实例

    使用getIdentifier()方法可以方便的获各应用包下的指定资源ID. 方式一 int indentify = getResources().getIdentifier("com.te ...

  3. 获取安卓设备唯一标识码并存储在SharedPRreferences中

    前言:设备登陆时提供设备序列号信息传到后端,安卓设备日新月异,一些设备仅支持wifi上网即没插卡功能,且互联网企业APP根本无法限制统一用户设备,用户可使用虚拟机不断创建新模拟器来伪装成新设备用于注册 ...

  4. Android 上关于设备唯一标识的调研

    code小生,一个专注 Android 领域的技术平台 作者:千山万水迷了鹿 链接:https://www.jianshu.com/p/fd34fa2ddcd9 声明:本文已获千山万水迷了鹿授权发表, ...

  5. 获取iOS设备唯一标识

    在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理.我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊. 具体可以分为如下几种: 1.UUID 2.IDFA ...

  6. php 手机唯一标示_Php获取移动设备唯一标识

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function is_mobile_request() { $_SERVER['ALL_HTTP'] = isset($_SERVER['ALL_HTT ...

  7. php如何获取手机序列号,Php获取移动设备唯一标识

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function is_mobile_request() { $_SERVER['ALL_HTTP'] = isset($_SERVER['ALL_HTT ...

  8. android获取设备唯一标识_数据埋点:用户唯一标识

    用户唯一标识,是用户唯一的身份ID,相同的身份ID,就会被当做是相同的一个用户. 01 为什么要建设用户唯一标识 如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情. ...

  9. Android 获取设备唯一标识

    一.背景 项目开发中,多少会遇到这种需求:获得设备唯一标识DeviceId,用于标识一个唯一的设备,做数据精准下发或者数据统计分析. 这类文章,网上有许多资料,例如:使用IMEI.MAC等作为设备标识 ...

  10. 获取android设备唯一编号_如何获取Android设备唯一标识码教程

    ID的全称是(Virtual identity electronic identification),中文名为通用账户,是俗称的网络身份证.它是一种互联网身份认证协议,其具有唯一性和信息不可否认性.I ...

最新文章

  1. python有用知识
  2. C# 正则表达式小结
  3. 第21届国际C语言混乱代码大赛获奖作品
  4. 脑梗塞康复治疗,选择技术很重要!
  5. js保持div悬浮,不随页面向下滚动而被覆盖
  6. 接口可以继承抽象类吗_Python接口类的多继承以及抽象类的单继承
  7. Leviathan系列4-7
  8. ios刺客信条一直显示连接服务器,刺客信条本色iOS进不去怎么办
  9. Android基础教程学习(一)
  10. html播放器参数,Windows Media Player网页播放器及其参数含义
  11. 读书笔记 大前研一《专业主义》
  12. js 判断系统类型和手机型号(厂商)
  13. python中如何使用云片网发送短信验证码
  14. 2023最新毕业设计选题 -python毕设选题推荐 - 如何选题 避免被坑
  15. 使用Windows平台的VS2022来调试AKStream
  16. 我的世界服务器兑换系统怎么做,Minecraft我的世界村民交易方法及兑换表格
  17. hdu 1116 Play on Words
  18. Winform像菜单一样弹出自定义内容实现示例
  19. roll() java_java.util.Calendar.roll(int field,int amount)方法实例
  20. Spring Cloud 配置(E.SR5)

热门文章

  1. Linux中打开文件显示行号相关命令
  2. php 微信表情 转码和解码方法
  3. 负载均衡和反向代理和网关
  4. 提高电子邮件的打开率的策略
  5. 2017河南工业大学校赛 D rqy的键盘
  6. C++的LoadLibrary动态加载dll
  7. 班级考勤管理系统 数据结构 C语言
  8. JAVA 1052:计算邮资
  9. 写文案,还有更简单的方法
  10. 学习这篇总结后,你也能做出天天快报一样的推荐系统 1