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

Dur*_*n.H 14 android mac-address bluetooth uniqueidentifier wif

目的:

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

背景:

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

现有方法:

在iOS中,有一些针对iOS的唯一ID解决方案,例如CFUUID或者identifierForVendor,以及Keychain,广告标识符等,可以完成预期的工作.

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

IMEI:

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String m_deviceId = TelephonyMgr.getDeviceId();
Run Code Online (Sandbox Code Playgroud)

缺点

这是依赖SIM卡的

  • 如果没有SIM卡那么我们就注定了

  • 如果有双卡,那么我们就会陷入困境

Android_ID:

  String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)

缺点

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

WLAN MAC地址

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();
Run Code Online (Sandbox Code Playgroud)

缺点

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

蓝牙地址:

   BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
   String m_bluetoothAdd = m_BluetoothAdapter.getAddress();
Run Code Online (Sandbox Code Playgroud)

缺点:

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

可能的解决方案:

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

  • 我们通过哈希时间戳生成一个随机ID,我用上面提到的唯一ID并存储它,以便下次登录时我们将检查key的存储值是否为null,如果是,那么我们将生成并存储它我们' ll使用密钥的值.

    如果有相当于iOS的钥匙串的东西,那么我们对这种方法很好.

  • 找到类似于iOS的advertisingIdentifier的全局标识符,该标识符对于设备中的所有应用程序都是相同的.

任何帮助表示赞赏!

Dur*_*n.H 7

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

Build.SERIAL还取决于wifi设备中电话的可用性,此Build.SERIAL将无法工作.

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

  • 嗯...我们的应用程序在超过14个国家/地区拥有超过1700万次下载,我还没有在我们的数据库中找到重复或空的ANDROID_ID ...也许理论上它可能会发生,但实际上我有足够的数据证明帖子过时了¯\ _(ツ)_ /¯ (2认同)