我们客户的应用程序的主要功能很大程度上依赖于跟踪客户的设备,他们提供与特定手机(而不是其所有者)绑定的产品。使用设备 IMEI 可以实现这一点,但随着 Android 10 中的隐私更改,他们使其无法访问。
(https://developer.android.com/about/versions/10/privacy/changes https://developer.android.com/about/versions/10/privacy/changes).
Android 有一个关于在特定用户情况下使用什么标识符的文档,但与我们的情况不匹配,因为我们需要它是唯一的、恒定的并且绑定到设备(或者至少难以更改)。https://developer.android.com/training/articles/user-data-ids https://developer.android.com/training/articles/user-data-ids。
我正在考虑 Android ID 是一个可能的解决方案,或者使用 Mac 地址,因为知道它们不是 100% 可靠。
有什么想法吗?建议?经验?在这一点上任何事情都可以是一个选择
我建议您阅读谷歌最佳实践的官方博客,看看哪些用例与您的规范相匹配:https://developer.android.com/training/articles/user-data-ids.html https://developer.android.com/training/articles/user-data-ids.html
对我来说,我遇到了关于 android 标识符的唯一性的同样问题,我发现唯一的解决方案是使用 MediaDrm API (https://android.googlesource.com/platform/frameworks/base/+/android-cts-4.4_r1/media/java/android/media/MediaDrm.java#539 https://android.googlesource.com/platform/frameworks/base/+/android-cts-4.4_r1/media/java/android/media/MediaDrm.java#539)
它包含一个唯一的设备 ID,即使在恢复出厂设置后也可以继续存在,并且不需要清单文件的任何额外权限。
以下是我们如何在 Android 10 上检索唯一标识符的代码:
import android.media.MediaDrm
import java.security.MessageDigest
import java.util.*
object UniqueDeviceID {
/**
* UUID for the Widevine DRM scheme.
* <p>
* Widevine is supported on Android devices running Android 4.3 (API Level 18) and up.
*/
fun getUniqueId(): String? {
val WIDEVINE_UUID = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L)
var wvDrm: MediaDrm? = null
try {
wvDrm = MediaDrm(WIDEVINE_UUID)
val widevineId = wvDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID)
val md = MessageDigest.getInstance("SHA-256")
md.update(widevineId)
return md.digest().toHexString()
} catch (e: Exception) {
//WIDEVINE is not available
return null
} finally {
if (AndroidPlatformUtils.isAndroidTargetPieAndHigher()) {
wvDrm?.close()
} else {
wvDrm?.release()
}
}
}
fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)