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" />


更多相关文章

  1. android 里 meta-data 的使用
  2. Android利用系统广播---监听应用程序安装和卸载
  3. Android(安卓)+NDK+eclipse+opengl ES2.0 开启深度测试
  4. Android(安卓)播放视频的方法+播放测试地址 http
  5. React Native Android环境配置 第一个实例的坑
  6. Android(安卓)访问权限设置--cocos2dx常用权限
  7. Android检测外接USB设备的几种方法
  8. 安卓APP:利用AndroidStudio开发usb串口通信软件【第2步】
  9. Android(安卓)-BLE蓝牙小DEMO

随机推荐

  1. python中if和elif的区别介绍
  2. cookie 保存和清除用户样式
  3. python利用while求100内的整数和方式
  4. js 自定义获取指定类名的标签集合
  5. 用JS实现简单计算器的坑
  6. localstorage刷新背景页面不变色
  7. laravel 商城实战开发 Dingoapi 用户管理
  8. axios跨域请求,post总是报错No ‘Access-C
  9. 超可爱Q版人物表情怎么画?可爱Q版小人表情
  10. 保存用户设置练习