目标:
我正在寻找一种方法来找出安卓设备的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获取它。