android.os.Build.SERIAL是唯一的吗?

29

我希望为Android手机和平板电脑使用一个唯一的ID。 IMEI在没有SIM卡的设备上不起作用,有时MAC地址会返回null。

我不确定android.os.Build.SERIAL是否唯一。

请问有人知道吗?

谢谢, 问候。

6个回答

22

是的,但请注意它仅在API级别9中添加,并且可能不会存在于所有设备上。在早期平台上获取唯一ID,需要读取诸如MAC地址或IMEI之类的内容。

通常,尝试读取所有可能的ID,并使用任何可用的ID。请参阅此文章了解指导。


嗨,Graham,我之前尝试使用getConnectionInfo().getMacAddress(),但是一些设备返回了null值。 - Jutikorn
1
是的,这是可以预料的。不幸的是,在所有设备和API级别上都没有普遍可靠的唯一标识符。 - Graham Borland
@GrahamBorland - Build.SERIAL 真的是唯一的吗?我们可以期望所有设备在2.3之后都会有它,无论是wifi还是非wifi设备吗?它会在设备重置和操作系统升级后仍然存在吗? - Durai Amuthan.H
1
@DuraiAmuthan.H 我不确定序列号的唯一性,但可以确认它在设备重置和操作系统升级后仍然存在。根据我的经验,在刷机和更换内核的过程中,我的序列号并没有改变。曾经有一次我改变了手机的所有内容(固件、恢复、操作系统、内核),但序列号仍然保持不变。 - Arko Chakraborti
很好,因为今天大多数应用程序都支持从Api Level 15开始。 - Chinthaka Devinda
自 Android 10 开始,Google 不允许读取 IMEI 号码,因此请注意。 - Smeet

11

您可以使用构建序列号和Android ID来创建自己的唯一ID。

String serial =    Build.SERIAL;
String android_id =Secure.getString(context.getContentResolver(),
                   Secure.ANDROID_ID);

String myKey=serial +android_id ;

1
在我看来,这是这个主题的最佳解决方案。因为如果出现ANDROID_ID始终相同的情况(这可能会发生,请参见https://android-developers.googleblog.com/2011/03/identifying-app-installations.html),再加上不存在的SERIAL ID,那将是非常不幸的。 - Bevor
请注意,在Android 10中,读取IMEI和序列号是不允许的。 - Smeet
@smeet 在安卓10中我们该怎么做? - Vrajesh
2
@Vrajesh,对于这个问题目前没有完美的解决方案,因为现在Android专注于独特的安装而不是独特的设备。据我所知,我们无法获取任何唯一标识设备的唯一ID。 - Smeet
但要注意,Android ID在进行恢复出厂设置时会改变,因此不适用于某些情况。 - Houskov

3
我认为对于唯一标识符,您应该使用Android Id。以下是获取Android Id的代码:

我认为对于唯一标识符,您应该使用Android Id。以下是获取Android Id的代码:

String android_id = Secure.getString(this.getContentResolver(),
            Secure.ANDROID_ID);
Log.d("Android","Android ID : "+android_id);

每次进行恢复出厂设置时,您的智能手机都会设置一个新的#Android_ID。请小心! - oskarko

3

串行通信只在API:9中公开。但是您可以使用反射在较旧版本中获取它。但是文档提到“如果可用”,所以不要依赖它。

String deviceSerial = (String) Build.class.getField("SERIAL").get(
                    null);

3
如果有的话,它被期望是唯一的。但是不能保证这个属性已经设置。而且它只适用于API 9。很不幸,没有简单的方法可以唯一地识别设备。一些属性,如SERIAL可能存在,另一些属性,如ANDROID_ID则不是唯一的,还有一些属性,如MAC取决于WIFI是否存在或其状态(如果wifi模块关闭,则您可能无法读取其MAC)。有些属性,如IMEI即使设备配备了电话模块也无法读取。因此,最好的方法是收集尽可能多的数据,并尝试构建您可能认为是唯一设备ID的东西。

1
大多数可以通过自定义ROM进行伪造。 - NikkyD
1
是的,因此我的回答中使用了“很可能”这个词。但是篡改它需要一些努力,Joe User 不经常这样做,因此这取决于 OP 的需求是否适合。 - Marcin Orlowski
1
不是的。虽然应该是这样,但由于制造商、型号等原因,它在很多方面都存在问题。 - Marcin Orlowski

1

MAC地址、IMEI和序列号的组合怎么样?

你只需要处理它们都可能不存在的事实,特别是在没有SIM卡的旧手机上。

我觉得MAC地址返回null很奇怪。在我看来这不可能发生,因为移动设备没有MAC地址没有任何意义。

有两个MAC地址可能存在,但在某些情况下可能无法访问。


1
如果硬件单元(例如wifi)关闭,则没有其MAC地址。 - Marcin Orlowski
1
两者都可以关闭,因此应该适用于两者。 - Marcin Orlowski
我在我的设备上总是收到来自BT的MAC地址。 - NikkyD
刚刚检查了我的S2,即使在离线模式下,系统信息也显示了我的WiFi MAC地址。虽然从未操作过这个MAC地址,但它似乎即使在离线状态下也是可用的。 - NikkyD
1
不,它不必须。它可以。而且通常不会这样做。 - Marcin Orlowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接