Android是否有唯一的设备ID,如果有的话,该怎样快速有效获取?

Settings.Secure#ANDROID_ID 返回Android
ID ,是一个64位的16进制字符串

1
2
3
import

android.provider.Settings.Secure;
 
private

String android_id = Secure.getString(getContext().getContentResolver(),Secure.ANDROID_ID);

关于这个问题有很多的答案,不过其中大部分将只能算是答对了一部分,还不够好。

根据我在很多设备上的测试(所有的电话,至少有一个是无效的)

  1. 所有设备针对 TelephonyManager.getDeviceId() 测试都有返回值
  2. 所有GSM设备(都有SIM卡)针对 TelephonyManager.getSimSerialNumber() 测试都有返回值
  3. 所有CDMA设备针对 getSimSerialNumber() 测试返回 NULL(预期中的)
  4. 所有有谷歌帐户的设备都返回了 ANDROID_ID 值
  5. 所有的CDMA设备针对 ANDROID_ID 和 TelephonyManager.getDeviceId() 都返回相同的值(或派生自同一个值) - 前提是安装过程中已经添加了谷歌帐户。
  6. 我还没有机会测试没有SIM卡的GSM设备,没有谷歌账户的GSM设备,以及任何在飞行模式下的设备。

所以,如果你想要得到设备本身的唯一值, TM.getDeviceId()应该是足够了。不过显然的,有些用户比其他人更加偏执一些,可以将这些标识中的一个或者多个进行hash运算就很有用,生成的字符串仍然可以唯一标识该设备,但是不会明确的标识实际的设备。例如,使用String.hashCode(),再加上一个UUID:

1
2
3
4
5
6
7
8
9
final

TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
 
final

String tmDevice, tmSerial, androidId;
tmDevice
=
""

+ tm.getDeviceId();
tmSerial
=
""

+ tm.getSimSerialNumber();
androidId
=
""

+ android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
 
UUID
deviceUuid =
new

UUID(androidId.hashCode(), ((
long)tmDevice.hashCode()
<<
32)
| tmSerial.hashCode());
String
deviceId = deviceUuid.toString();

结果可能类似 :00000000-54b3-e7c7-0000-000046bffd97

对我来说这种方式已经足够了

别忘了增加权限,用于读取 TelephonyManager properties,在manifest 中增加下面一行:

1
<uses-permission

android:name
="android.permission.READ_PHONE_STATE"

/>

Android能够获取到唯一的设备ID吗?的更多相关文章

  1. 【转】获取android设备 id

    关于本文档 Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段 ...

  2. Android中获取IMEI码

    Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)) .getDeviceId(); 1.加入权限 在manifest.xml ...

  3. Windows Store 应用获得设备 ID 的几种方案

    本文为个人博客备份文章,原文地址: http://validvoid.net/solutions-get-device-id-for-uwp/ 通过生成唯一的设备 ID 进行数据统计是应用开发中一个非 ...

  4. ionic获取ios唯一设备id的解决方案

    经常有朋友来问这个问题. 每次都去解释这个问题也浪费不少时间, 所以还是开一篇文章, 把这个问题说清楚吧. 先纠正一个误区吧: 有同学可以通过ionic natvie的device插件获取. 我们在文 ...

  5. Appium自动获取 Android 设备 id 和包名等信息(python)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zhusongziye/article/d ...

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

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

  7. Android 开发 获取设备信息与App信息

    设备信息 设备ID(DeviceId) 获取办法 android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager ...

  8. Android 手机上获取物理唯一标识码

    唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. import android.provider.Settings.Secure;private String android_id ...

  9. IOS开发之——OpenUDID的使用获取用户唯一设备

    下载网址:https://github.com/ylechelle/OpenUDID OpenUDID测试结果分析 1)优点: a.没有用到MAC地址.MAC地址跟UDID一样,存在隐私问题.不能保证 ...

随机推荐

  1. Hadoop读书笔记(一)Hadoop介绍

    1.Hadoop是什么? 适合大数据的分布式与计算平台. HDFS:Hadoop Distributed File System 分布式文件系统  MapReduce:并行计算框架 2.HDFS的架构 ...

  2. UITextField用法

    .创建 .UITextField* textField = [[UITextField alloc]initWithFrame:CGRectMake(, , , )]; .设置委托 //委托类需要遵守 ...

  3. GCD下载后清除缓存

    //GCD下载后清除缓存1 —(void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; //清除缓存 [self.cache re ...

  4. [CSS] Conditionally Apply Styles Using Feature Queries @supports

    While browsers do a great job of ignoring styles they don’t understand, it can be useful to provide ...

  5. jquery-12 折叠面板如何实现(两种方法)

    jquery-12 折叠面板如何实现(两种方法) 一.总结 一句话总结:1.根据点击次数来判断显示还是隐藏,用data方法保证每个元素一个点击次数:2.找到元素的下一个,然后toggle实现显示隐藏. ...

  6. Web全栈工程师修养

    全栈工程师现在是个很热的话题,如何定义全栈工程师?在著名的问答网站Quora上有人提出了这个问题,其中一个获得了高票的回答是: 全栈工程师是指,一个能处理数据库.服务器.系统工程和客户端的所有工作的工 ...

  7. js进阶正则表达式14验证邮编(input的pattern属性)(正则表达式加起^始$)

    js进阶正则表达式14验证邮编(input的pattern属性)(正则表达式加起^始$) 一.总结 1.input的pattern属性:里面可以直接放正则表达式,<input type=&quo ...

  8. css3 实现水晶按钮

    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee432e), color-sto ...

  9. signed 与 unsigned 有符号和无符号数

    unsigned int a = 0; unsigned int b = -1; // b 为 0xffffffff unsigned int c = a - 1; // c 为 0xffffffff

  10. 定义变量let,const

    1.块级作用域let 声明变量,作用域是最近的"{}": 'use strict'; { let test = '1'; } console.log(test);//test is ...