Android获取唯一标识符的实现
Posted android_ls
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android获取唯一标识符的实现相关的知识,希望对你有一定的参考价值。
获得一部android设备的唯一标识码
业务需求:
1、同一部手机,多次获取、卸载重装,得到的设备标识是同一个值
2、不同手机,获得的设备标识一定要不同
解决方案:
使用AndroidId + 硬件信息生成的UUID
1、获得硬件UUID(无需权限,根据硬件相关属性,生成UUID)
2、获取AndroidId(无需权限,极个别设备获取不到数据,拿不到时,使用的是Random)
3、使用AndroidId和硬件UUID生成一个设备唯一标识UUID,
4、对设备唯一标识UUID做32位的MD5加密,得到一个固定长度的序列号
具体代码实现:
/**
* 获得设备的AndroidId
* 备注:无需权限,极个别设备获取不到数据
*/
@SuppressLint("HardwareIds")
fun getAndroidId(context: Context): String
var androidId = ""
try
// d55e1d246a7b4bba
androidId = Settings.Secure.getString(
context.contentResolver,
Settings.Secure.ANDROID_ID
)
catch (e: Exception)
e.printStackTrace()
XLog.i("-->androidId = $androidId")
// 特殊处理,如果获取不到AndroidId或获取的值是返回同样的特定字符串
if (TextUtils.isEmpty(androidId)
|| TextUtils.equals("000000000000000", androidId)
|| TextUtils.equals("00000000000000", androidId)
|| TextUtils.equals("9774d56d682e549c", androidId)
)
androidId = UUID.randomUUID().toString()
return androidId
/**
* 选用了几个不会随系统更新而改变的值
* 备注:无需权限,同型号设备相同
*/
private fun getDeviceUUID(): UUID
// cepheus|Xiaomi|cepheus|cepheus|qcom|MI 9|V12.5.6.0.RFACNXM
val buildInfo = StringBuffer().append(Build.BOARD)
.append("|").append(Build.BRAND)
.append("|").append(Build.PRODUCT)
.append("|").append(Build.DEVICE)
.append("|").append(Build.HARDWARE)
.append("|").append(Build.MODEL)
.append("|").append(Build.VERSION.INCREMENTAL).toString()
// Build.ID:RKQ1.200826.002
XLog.i("-->Build.ID = $Build.ID")
try
return UUID(
Build.ID.toString().hashCode().toLong(),
buildInfo.hashCode().toString().replace("-", "").toLong()
)
catch (e: Exception)
return UUID(
UUID.randomUUID().toString().hashCode().toLong(),
buildInfo.hashCode().toString().replace("-", "").toLong()
)
/**
* 获取设备的唯一标识码
*/
fun getDeviceId(context: Context): String
var deviceId = SpUtils[AppConstants.SP_CTID, ""].toString()
if (TextUtils.isEmpty(deviceId))
deviceId = buildDeviceUUID(context)
SpUtils[AppConstants.SP_CTID, deviceId]
return deviceId
/**
* 以AndroidId和设备build相关信息生产唯一UUID
*/
private fun buildDeviceUUID(context: Context): String
// ffffffff-8df3-1ee3-0000-000049542248
val androidId = getAndroidId(context)
val deviceUUID = getDeviceUUID().toString()
val encryptStr: String = UUID(
androidId.hashCode().toLong(),
deviceUUID.hashCode().toLong(),
).toString().replace("-", "")
return MD5Utils.encryption(encryptStr)
备注:
1、为什么搞的这么复杂?为了将数据重复性降到极低(UUID也存在重复性,只是重复性极低而已)
2、Google推荐的唯一标识符最佳做法:使用 Android 标识符的最佳做法
3、经生产环境验证,当获取不到AndroidId,使用随机生成的值时,生成的设备一标识UUID存在重复的值
4、如果是海外产品,建议使用Google推荐的方法,否则有可能会被下架。
以上是关于Android获取唯一标识符的实现的主要内容,如果未能解决你的问题,请参考以下文章