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推荐的方法,否则有可能会被下架。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android系统的UUID(Universally Unique Identifier)是一个用于标识设备的字符串。在Android中,可以使用以下代码获取设备的UUID: ```java import android.provider.Settings.Secure; public class DeviceUuidFactory { private static String uuid; public static String getDeviceUUID(Context context) { if (uuid == null) { final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); try { if (!"9774d56d682e549c".equals(androidId)) { uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8")).toString(); } else { final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); uuid = deviceId != null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")).toString() : UUID.randomUUID().toString(); } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } return uuid; } } ``` 这段代码使用了Android设备的Android ID来生成UUID。如果Android ID不可用或为默认值 "9774d56d682e549c",则会使用设备的TelephonyManager获取设备ID(IMEI)作为UUID。如果获取设备ID也失败了,则会生成一个随机的UUID。 请注意,使用设备ID(IMEI)作为UUID可能会导致在一些设备上无法获取唯一标识符,因为不是所有设备都有IMEI,并且在某些设备上可能无法访问该权限。 另外,需要在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值