一些开发人员可能需要识别其用户的Android设备。 通常,这样做并不是为了识别设备,而是为了确定应用程序的特定安装。 如果开发人员有多个应用程序并且想了解它们在相同的环境中工作,那么我也遇到了几种必要的情况。
Google说,识别设备很容易。 但是我们在谈论Android :)
本文重点介绍不想附加到Google服务的应用程序或库。因此,让我们深入了解获得唯一设备标识符的奇妙冒险。
在这里,我们看到几种方法:
- 广告编号
- IMEI
- MAC地址
- 序列号
- Android ID
到目前为止看起来还不错,不是吗? 获取Android设备唯一标识符的方法多达五种。 我敢肯定,如果您仍然在网络上沙沙作响,肯定会找到其他几种方法,但是在这里,我做了最受欢迎的方法。 因此,让我们按顺序进行。
广告编号
这是Google Play服务提供的唯一广告标识符。 广告必须运作,以便Google了解可以使用特定用户显示哪些广告,以及已经使用应用程序中内置的广告横幅显示了哪些广告。 而且这也意味着,例如,如果您的应用程序是从Amazon下载的,则您将丢失此标识符,此外,您还必须将
Google库拖到您的应用程序中。
dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' }
结论:我们并不能在所有情况下都识别出该设备。
但是我们肯定要吧? 然后继续前进。
IMEI
这是GSM手机上使用的移动设备的国际标识符。 网络使用IMEI号码识别智能手机,并阻止访问被盗或列入黑名单的设备的网络。 但是不幸的是,使用IMEI可能会出现许多问题:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { String imei = telephonyMgr.getImei(); } else { String imei = telephonyMgr.getDeviceId(); }
结论:我们并不能在所有情况下都识别出该设备,它们也会欺骗我们:C
MAC地址
并非100%可靠。
Google自己谈论这个问题 ,但是不幸的是,我确实遇到了一些依赖于设备MAC地址的应用程序。 不要这样做。
可能可以从设备的WiFi或蓝牙硬件中检索Mac地址。 我们不建议将其用作唯一标识符。 首先,并非所有设备都具有WiFi。 另外,如果未打开WiFi,则硬件可能不会报告Mac地址。
序列号
它被认为是设备的唯一序列号,一直保留到“末尾”。 您可以通过以下方式获得它:
现在介绍问题。 首先,要获取序列号,您将需要向用户请求权限
READ_PHONE_STATE ,
否则用户可能会拒绝。 其次,
可以更改序列号。
结论:我们并不能在所有情况下都识别出该设备,我们必须征求用户的许可,该用户会欺骗他们并且仍然会欺骗我们。
Android ID
-在这里! -我们必须大喊。 -解决所有麻烦的方法!
Android ID也是唯一的设备标识符。 它是设备第一次引导期间生成和存储的64位值。
您可以这样获得:
Secure.getString(getContentResolver(), Secure.ANDROID_ID);
这样短的时间似乎使我们免于识别设备的麻烦。 在示例中,甚至Google家伙也将Android_ID用于
LVL 。
在这里,我们的希望破灭了,没有什么是一样的了。 更新到Android 8之后,
Android_ID现在对于每个已安装的应用程序而言都是唯一的。 但是,除此之外,Google关心我们,因此在更新之前安装的应用程序将保留与Google使用为此专门编写的服务保存的标识符相同的标识符。 但是,如果先卸载应用程序,然后重新安装,则Android_ID将有所不同。 为防止这种情况发生,您需要使用KeyValueBackup。

但是此备份服务需要注册,还要指定软件包名称。 此外,文档说这可能由于
任何原因都不起作用。 谁该怪? 没有人,就是那样。
一般结论
如果您有一个好的后端,只需收集设备的演员表(已安装的应用程序,服务,可以获得的有关设备的任何数据)并比较已经存在的参数,请考虑可接受的更改百分比。
PS我像往常一样在电报频道
@paradisecurity中发布所有集合,该链接可以在我的个人资料中找到,也可以在按名称搜索电报中找到。
快乐:)