我正在开发一个针对 Android 4.0 (API 14) 及更高版本的 Android 应用程序。
我正在寻找每个设备唯一且永久存在的序列号(随设备一起死亡,恢复出厂设置后不会更改)。
我在网上找到了很多关于 Android 设备唯一标识符的结果,但在android.os.Build.SERIAL number.
到目前为止,我消除了使用ANDROID_ID因为恢复出厂设置后可能会发生变化。我还消除了使用IMEI因为 Android 设备可能不是电话。我无法使用 wifi 或蓝牙MAC地址因为设备可能没有这样的硬件和/或如果未启用硬件,这样的 MAC 地址可能无法读取(基于我在网上找到的内容)。
我相信我可能会寻找 Android 设备序列号。
使用它可以轻松访问android.os.Build.SERIAL(因为它是在 API 级别 9 中添加的,不需要任何额外的权限)。
我的问题是:
考虑到我的应用程序面向 Android 4.0 (API 14) 及更高版本,每个设备的 Android 设备的 android.os.Build.SERIAL 编号是否唯一?
根据这个有用article https://android-developers.blogspot.com/2011/03/identifying-app-installations.html在 Android 开发者博客中,android.os.Build.SERIAL
should如果可用,则应是唯一的。
来自文章:
没有电话功能的设备需要在此处报告唯一的设备 ID;有些手机也可能这样做。
这是否意味着序列号可能不可用?
正确,它可能不可用。请注意他们说“需要没有电话功能的设备......”,因此只有没有“电话”功能的设备(例如仅支持 wifi 的平板电脑)才需要提供SERIAL
数字,尽管有些手机仍然这样做(例如 Nexus 4)。
关于这个主题肯定缺乏文档,但从措辞来看,可能只有“没有电话功能的设备”才需要提交唯一 ID,而提交唯一 ID 的手机可能不是唯一的。
满足上述条件的另一种选择是什么?
对于你的情况,我认为你最好的选择是首先检查deviceId
(IMEI,或其他什么)如果deviceId
不存在然后你回退到使用android.os.Build.SERIAL
(因为这可能是平板电脑)就像这样:
public static String getDeviceId(Context context) {
final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
if (deviceId != null) {
return deviceId;
} else {
return android.os.Build.SERIAL;
}
}
请记住使用deviceId
你需要许可android.permission.READ_PHONE_STATE
.
So由于您的应用程序的 minSDK 为 14,因此您可以安全地使用该字段android.os.Build.SERIAL
。如果我们假设没有电话功能的设备确实总是提供唯一的 IDSERIAL
那么我认为这对于始终获得唯一的设备 ID 来说是一个安全的选择(当然,排除任何错误)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)