Android 除IMEI、安卓id、WLAN Mac和蓝牙地址外,设备的完美唯一id 目标:

Android 除IMEI、安卓id、WLAN Mac和蓝牙地址外,设备的完美唯一id 目标:,android,bluetooth,wif,uniqueidentifier,mac-address,Android,Bluetooth,Wif,Uniqueidentifier,Mac Address,我正在寻找一种方法,为android设备找到一个唯一的\u id 背景: 我将在登录请求负载中使用Id,由于我的应用程序是基于许可证的服务应用程序,因此在正常情况下Id不应更改 现有办法: 在iOS中,有一些诸如供应商的或标识,以及钥匙链、广告标识等。。这项工作可以达到预期的效果 但在安卓系统中,我知道的所有选项似乎都有漏洞 IMEI: TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SER

我正在寻找一种方法,为android设备找到一个唯一的\u id

背景: 我将在登录请求负载中使用Id,由于我的应用程序是基于许可证的服务应用程序,因此在正常情况下Id不应更改

现有办法: 在iOS中,有一些诸如供应商的标识,以及钥匙链、广告标识等。。这项工作可以达到预期的效果

但在安卓系统中,我知道的所有选项似乎都有漏洞

IMEI:

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String m_deviceId = TelephonyMgr.getDeviceId();
  String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
   BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
   String m_bluetoothAdd = m_BluetoothAdapter.getAddress();
缺点

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();
因此,它依赖于sim卡

  • 如果没有sim卡,我们就完了

  • 如果有双sim卡,那么我们是dommed

Android\u ID:

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String m_deviceId = TelephonyMgr.getDeviceId();
  String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
   BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
   String m_bluetoothAdd = m_BluetoothAdapter.getAddress();
缺点

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();
  • 如果操作系统版本升级,则可能会更改
  • 如果设备是根设备,它将被更改
  • 不保证设备id是唯一的有一些报告称一些制造商有重复的设备id
WLAN MAC地址

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();
缺点

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();
  • 如果没有wifi硬件,我们就注定要失败
  • 在一些新设备中,如果wifi关闭,那么我们就完了
蓝牙地址:

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String m_deviceId = TelephonyMgr.getDeviceId();
  String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
   BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
   String m_bluetoothAdd = m_BluetoothAdapter.getAddress();
缺点:

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String m_deviceId = TelephonyMgr.getDeviceId();
  String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
   BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
   String m_bluetoothAdd = m_BluetoothAdapter.getAddress();
  • 如果没有蓝牙硬件,我们就完蛋了
  • 在未来的一些新设备中,如果它关闭,我们可能无法读取它
可能的解决方案: 我认为有两种方法可以解决这个问题

  • 我们通过将时间戳与我提到的唯一id进行散列来生成一个随机id,并将其存储,以便下次登录时,我们将检查key的存储值是否为null,如果为null,那么我们将生成并存储它,否则我们将使用key的值

    如果存在与iOS的钥匙链相当的东西,那么我们很擅长这种方法

  • 查找一个全局标识符,例如iOS的广告标识器,它与设备中的所有应用程序相同


感谢您的帮助

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

如果你想“追踪你的用户”,可以考虑谷歌移动分析公司(Google Analytics Mobile)


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

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

我选择使用Android\u ID,因为它不依赖于任何硬件

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


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

计算Id不适合我的应用程序。因为如果卸载了应用程序并且Id消失了,那么我就注定要失败。@Duraiamuthan.H哈希方法是稳定的,并且在重新安装应用程序时会保持不变。它可能会在ROM上更改,但请重新安装/更改!如果卸载应用程序,该值将如何保持。哈希值可能会根据应用程序重新安装期间的wifi/Bluetooth状态和可用性而变化。@Duraiamuthan.H没问题,哈希函数每次执行时都会给出相同的结果,想象一下id=f(wifi\u mac、Bluetooth\u mac、android\u id)。对于相同的输入,id将始终相同。您可以使用该类进行哈希运算。如果每次输入相同,则该类是正确的。它将给出相同的哈希值,但存在输入可能会更改的可能性。例如,如果某些最新设备中的wifi关闭,wifi\u mac将返回空值,而Bluetooth\u mac也可能在即将发布的版本中遇到相同的问题,并且android\u id在更新后不是唯一的所有投诉都是重复的。投票指出Build.Serial。但是没有电话的设备没有Build.Serial。这对我来说是个问题,因为我的应用程序将用于仅wifi的设备。Build.Serial可从API 9或2.3姜饼中获得,但这对我来说不是问题,因为我的应用程序将以4.0为目标上面的@Duraiamuthan.H我认为所有设备都有“串行”,但不是所有设备都有“IMEI”号码。@ JaydBurrave-我不确定所有的设备都有<代码> Bug。序列< /代码>我读到的地方如果设备没有电话,那么就不会有“代码”> Studio。序列< /代码>那个设备。例如,考虑WiFi设备。你能确认吗?@ DuraiAmuthan。你想让我确认你读到的东西吗?关于build.serial:,您是对的。我已经用更多的信息更新了我的帖子。我说你必须选择软件和硬件(最有可能的是在设备之间跟踪用户的软件)。我读了你的问题,投了赞成票。你在4个多月前问过这个问题,但没有真正的回应。我不确定处理iOS+Android唯一ID的最佳方法。这将把它带到下一个层次。我现在会使用一些无缝的东西,比如使用OAuth的“登录Google”。通过这种方式,它可以在iOS、Android或Web设备上工作。@JaredBurrows-OAuth是否提供跟踪单个设备的功能?我提供每个用户的设备配额。i、 e用户最多可以使用三分之一的帐户devices@DuraiAmuthan.H,我已经阅读了你下面的评论。你说你的应用程序依赖于wifi,你需要一个unigue设备