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获取唯一标识符的实现的主要内容,如果未能解决你的问题,请参考以下文章

Android获取唯一标识符的实现

Android设备唯一ID实现方案

iOS 和 Android 的移动设备唯一性

Android 设备唯一标识

如何获取Android唯一标识

如何获取Android唯一标识