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

时间:2014-12-01 17:07:32

标签: android bluetooth wif uniqueidentifier mac-address

目的:

我正在寻找一种方法来为Android设备找到 unique_id

背景:

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

现有方法:

在iOS中,有一些unique id solutions for iOS,例如 CFUUID identifierForVendor ,再加上 Keychain ,广告标识符等......可以按照预期完成这项工作。

但在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

WLAN 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并将其存储,以便下次登录时我们将检查key的存储值是否为null,如果是,那么我们将生成并存储它,否则我们将使用密钥的值。

    如果有相当于iOS的 keychain 的内容,那么我们很擅长这种方法。

  • 查找iOS的 advertisingIdentifier 等全局标识符,该设置符号与设备中的所有应用相同。

感谢任何帮助!

3 个答案:

答案 0 :(得分:7)

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

Build.SERIAL 还取决于电话的可用性,该电话位于仅限wifi设备此Build.SERIAL无法正常工作。

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

答案 1 :(得分:1)

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

如果您想“跟踪您的用户”http://www.google.com/analytics/mobile/

,请考虑使用Google AnalyticsMobile

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

答案 2 :(得分:1)

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