在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。可以通过下面的方法获取:

import android.provider.Settings;
String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);
1
2
ANDROID_ID可以作为设备标识,但需要注意:
厂商定制系统的Bug:不同的设备可能会产生相同的ANDROID_ID:9774d56d682e549c。
厂商定制系统的Bug:有些设备返回的值为null。
设备差异:对于CDMA设备,ANDROID_ID和TelephonyManager.getDeviceId() 返回相同的值。

Sim Serial Number
装有SIM卡的设备,可以通过下面的方法获取到Sim Serial Number:
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String SimSerialNumber = tm.getSimSerialNumber();
注意:对于CDMA设备,返回的是一个空值!

import java.util.UUID;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.telephony.TelephonyManager;
import android.provider.Settings;
@SuppressLint("NewApi") public class AndroidUUID
{
static public String getDeviceId(Context context) {
StringBuilder deviceId = new StringBuilder();

// 渠道标志
deviceId.append("a");
try {
//MAC
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
String wifiMac = info.getMacAddress();

if(wifiMac != null && !wifiMac.isEmpty()){
deviceId.append("mac");
deviceId.append(wifiMac);
return deviceId.toString();
}

//IMEI
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
if(imei != null && !imei.isEmpty()){
deviceId.append("imei");
deviceId.append(imei);
return deviceId.toString();
}

String androidID = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
if(androidID != null && !androidID.isEmpty()){
deviceId.append("androidid");
deviceId.append(androidID);
return deviceId.toString();
}

//序列号(sn)
String sn = tm.getSimSerialNumber();
if(sn != null && !sn.isEmpty()){
deviceId.append("sn");
deviceId.append(sn);
return deviceId.toString();
}

//如果上面都没有, 则生成一个id:随机码
String uuid = getUUID(context);
if(uuid != null && !uuid.isEmpty()){
deviceId.append("uuid");
deviceId.append(uuid);
return deviceId.toString();
}

} catch (Exception e) {
e.printStackTrace();
deviceId.append("uuid").append(getUUID(context));
}
return deviceId.toString();
}

/**
* 得到全局唯一UUID
*/

public static String getUUID(Context context){
String uuid = null;

SharedPreferences sp = context.getSharedPreferences("SP", Context.MODE_PRIVATE);

if(sp != null){
uuid = sp.getString("uuid", "");
}

if(uuid == null || uuid.isEmpty()){
uuid = UUID.randomUUID().toString();
SharedPreferences.Editor eidtor = sp.edit();
eidtor.putString("uuid", uuid);
eidtor.commit();
}
return uuid;
}
}

最新文章

  1. Kernel Time和User Time分别指什么
  2. sublime Text 2 配置以及 Python环境搭建
  3. 安装Ubuntu 16.04后要做的事
  4. servlet中Java连接数据库后的基本操作
  5. 在本地环境用虚拟机win2008 sever搭建VS2013 + SVN 代码版本控制环境
  6. 第一天开通博客,就粗略写一下刚了解TCP/IP协议工作过程
  7. Oracle 版本查看及版本号说明
  8. hive的安装步骤
  9. ArcGIS API for Javascript配置
  10. XHTML使用规范
  11. python手记(51)
  12. 如何使用Flexbox和CSS Grid,实现高效布局
  13. .gitignore文件的配置和生效
  14. Springboot & Mybatis 构建restful 服务三
  15. 关于mysql远程登录问题
  16. [kuangbin带你飞]专题一 简单搜索(回顾)
  17. 关于LookUp的切换实例
  18. Java中常见的排序方式-快速排序(升序)
  19. 【论文笔记】Dynamic Routing Between Capsules
  20. xbeePROS1发送的数据在802.15.4网络中有多大时延?

热门文章

  1. .net core 根据数据库生成实体类
  2. 【php设计模式】享元模式
  3. 一个用JavaScript生成思维导图(mindmap)的github repo
  4. Java基础加强-内部类及代理
  5. php-amqplib库操作RabbitMQ
  6. 【leetcode】617. Merge Two Binary Trees
  7. 在DjangoAdmin中使用KindEditor(上传图片)
  8. delphi Tidhttp 发送json格式报文
  9. 基本算法 st
  10. redis + boost.asio