目标:
我正在寻找一种方法来查找安卓设备的唯一标识符。
背景:
我将在登录请求有效载荷中使用ID,由于我的应用程序是基于许可证的服务应用程序,所以在正常情况下ID不应更改。
现有方法:
iOS 中有一些iOS 的唯一标识符解决方案,例如CFUUID、identifierForVendor、Keychain、广告标识符等可以达到预期效果。
但在 Android 中,我所知道的所有选项似乎都存在漏洞。
IMEI:
TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String m_deviceId = TelephonyMgr.getDeviceId();
缺点
它依赖于SIM卡,因此:
如果没有SIM卡,我们就完了
如果有双重SIM卡,我们也无法使用
Android_ID:
String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
缺点
- 如果操作系统版本升级,则可能会更改设备ID。
- 如果设备已经取得了 root 权限,它也会发生变化。
- 无法保证设备ID是唯一的,有报告称一些制造商存在重复设备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,并存储它,这样下次登录时,我们将检查密钥的存储值是否为空,如果是,则生成并存储它,否则我们将使用密钥的值。
如果有与iOS的keychain相当的东西,那么这个方法就很好用。
寻找全局标识符,类似于iOS的advertisingIdentifier,该标识符对于设备中的所有应用程序都是相同的。
任何帮助都将不胜感激!