我正在寻找一种方法来为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);
缺点
WLAN MAC地址
WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();
缺点
蓝牙地址:
BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_bluetoothAdd = m_BluetoothAdapter.getAddress();
缺点:
我认为有两种方法可以解决这个问题
我们通过哈希时间戳生成一个随机ID,其中包含我提到的唯一ID并将其存储,以便下次登录时我们将检查key的存储值是否为null,如果是,那么我们将生成并存储它,否则我们将使用密钥的值。
如果有相当于iOS的 keychain 的内容,那么我们很擅长这种方法。
查找iOS的 advertisingIdentifier 等全局标识符,该设置符号与设备中的所有应用相同。
感谢任何帮助!
答案 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获取它。