完美的设备unique_id,除了IMEI,Android_ID,WLAN Mac和蓝牙地址



目标:

我正在寻找一种方法来找出安卓设备的unique_id

背景:

我将在登录请求有效负载中使用 Id,并且由于我的应用程序是基于许可证的服务应用程序,因此 ID 在正常情况下不应更改。

现有方法:

在iOS中,有一些适用于iOS的唯一ID解决方案,例如CFUUID或标识符与钥匙串,广告标识符等相结合。 这可以完成这项工作,达到预期。

但是在Android中,我知道的所有选项似乎都有漏洞。

IMEI:

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String m_deviceId = TelephonyMgr.getDeviceId();

缺点

它是SIM卡依赖所以

  • 如果没有SIM卡,那么我们注定要失败

  • 如果有双卡双待,那么我们就被控制了

Android_ID:

  String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

缺点

  • 如果操作系统版本升级,则可能会更改
  • 如果设备已植根,则会更改
  • 不能保证device_id是唯一的,有一些报告,一些制造商有重复的device_id

无线局域网 MAC 地址

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();

缺点

  • 如果没有wifi硬件,那么我们注定要失败
  • 在一些新设备中,如果wifi关闭,那么我们注定要失败。

蓝牙地址:

   BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
   String m_bluetoothAdd = m_BluetoothAdapter.getAddress();

缺点:

  • 如果没有蓝牙硬件,我们就注定要失败。
  • 将来在某些新设备中,如果它关闭,我们可能无法读取它。

可能的解决方案:

我认为有两种方法可以解决这个问题

  • 我们通过对时间戳进行哈希处理我提到的唯一 ID 来生成一个随机 id,并存储它,以便下次登录期间我们将检查密钥的存储值是否为 null,如果是这样,那么我们将生成并存储它,否则我们将使用密钥的值。

    如果有等效于iOS的钥匙串的东西,那么我们可以使用这种方法。

  • 找到一个全局标识符,例如iOS的广告标识符,这对于设备中的所有应用程序都是相同的。

任何帮助不胜感激!

我选择使用Android_ID,因为它不依赖于任何硬件。

Build.SERIAL

还取决于仅WiFi设备电话的可用性,此Build.SERIAL将不起作用。

我已经在问题本身中解释了其他方法如何依赖于硬件可用性

安卓上没有这样的ID。您可以生成自己的(例如随机 UUID(并将其连接到用户的帐户。这就是Kindle,Audible和其他应用程序以非隐私侵入性方式识别设备的方式。

如果您想"跟踪您的用户",请考虑Google Analytics Mobile,http://www.google.com/analytics/mobile/

如果您想更接近跟踪设备,您可以将上述ID组合在一个哈希函数中。蓝牙 + wifi + android 串行,如果其中任何一个为空,则在哈希中输入 0,例如,如果没有 wifi mac 地址。正如您所指出的,不能保证 id 不会更改。除非用户正在运行自定义 ROM,否则我希望此计算 ID 保持不变。

我认为

,您可以使用设备序列号(硬件序列号,而不是android ID(。您可以在设备设置中看到它。在你的代码中,你可以通过Build.SERIAL获取它。

最新更新