在设备首次启动时,系统会随机生成一个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;
}
}

ANDROID_ID的更多相关文章

  1. 关于Unity启动调用Android_id问题排查

    问题:Unity启动时获取了设备信息,其中包括Android_id 以下是在androidstudio中的log,使用Xposed的LoginHook看到Unity启动时获取了android_id信息 ...

  2. Android NDK几点回调方式

    一.NDK中获取android设备ID的方式 Java代码如下(获取设备ANDROID_ID): final String androidId = Secure.getString(context.g ...

  3. 淘宝上倒卖新浪微盘事件来龙去脉——谈谈巧用IMEI

    这是一个老黄历的事件,曾记得淘宝上的卖家卖10元卖50g网络硬盘,并且卖的相当的火,一个月就卖了500个账号.由于我也是那个事件的亲身经历者之一,这里就看到了IMEI号在项目中防止作弊是何其的重要. ...

  4. Android 手机上获取物理唯一标识码[转]

    所有添加有谷歌账户的设备可以返回一个 ANDROID_ID 所有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId() 返回相同的值(只要在设置时添 ...

  5. Android 获取可靠的手机编码

    项目中出现了将设备和用户信息进行绑定的需求.最先想到的是IMEI串码和IMSI串码.手机登陆的时候一直都没有问题.换了一个平板中之后IMEI和IMSI串码都获取不到了.后来查了一下原因,是因为平板上是 ...

  6. umeng 渠道统计 android

    1.配置AndroidManifest.xml,添加权限 <uses-permission android:name="android.permission.ACCESS_NETWOR ...

  7. Android 系统ID介绍

    Android上系统ID有很多,本文只介绍常用的ANDROID ID.DEVICE ID.IMEI/MEID.WIFI/BT ADDRESS等几个,本文介绍这些ID的数据格式.长度及一些基本知识. 一 ...

  8. 【Android】设备标识

    Android系统以及设备都有很多的“标识”号,比如常见的IMEI,SerizalNumber,UUID等概念,但是这些都存在一定程度上的不可靠性,到底如何标记一台Android设备? 文章内容多来自 ...

  9. Android设备唯一性判断

    前段时间项目需要一个功能,就是在操作完某一个逻辑之后返回给客户一个红包,安全校验团队需要我们提供android设备的唯一标示,起初直接通过获取设备的imei号传给了server端,后台公司云迹监控发现 ...

随机推荐

  1. luogu4777[模板]拓展中国剩余定理题解

    题目链接 https://www.luogu.org/problemnew/show/P4777 分析 扩展\(CRT\)就是解决模数不互质的情况,说是扩展\(CRT\),其实都是扩欧... 先来考虑 ...

  2. python之如何爬取一篇小说的第一章内容

    现在网上有很多小说网站,但其实,有一些小说网站是没有自己的资源的,那么这些资源是从哪里来的呢?当然是“偷取”别人的数据咯.现在的问题就是,该怎么去爬取别人的资源呢,这里便从简单的开始,爬取一篇小说的第 ...

  3. ES6中map数据结构学习

    在项目中遇到一个很恶心的需求,然后发现ES6中的map可以解决,所以简单学习了一下map. Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是“字符串-值”对,属性只 ...

  4. c# 如何把一个同步方法变成异步方法

    1 例如有同步方法如下: private static void GenerateFile(DataTable dt) { } 2 变为异步方法 private static void Generat ...

  5. vue 导航守卫

    1.全局守卫(在所有路由展示前触发)//在main.js中 router.beforeEach((to, from, next) => {      to 即将要进入的到的路由,值为路由    ...

  6. 关于iReport5.6.0无法正常启动或者闪退或者JDK8不兼容的解决方案

    参考网址: https://blog.csdn.net/erlian1992/article/details/76359191?locationNum=6&fps=1 说白了 ,即 jaspe ...

  7. vue 之this.$router.push、replace、go的区别

    一.this.$router.push 说明:跳转到指定URL,向history栈添加一个新的记录,点击后退会返回至上一个页面 使用: this.$router.push('/index') this ...

  8. Computer Vision_2_Active Shape Models:Active Shape Models-Their Training and Application——1995

    此为计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面. 1. Active Appearance Models 活动表观模型和活动轮廓模型基本思想来源 Snake,现在 ...

  9. Django基础(一):基础引用

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  10. Zabbix4.2Server端部署

    一.安装 1.前期安装准备 前期准备一个大一点的分区准备用于zabbix 数据库的存放,为方便后期扩容,我们在这里选择新加一个磁盘并以LVM的方式进行挂载(此处省略虚拟机添加硬盘等操作) # df - ...