Android设备ID混淆

如果我拨打* * 8 2 5 5 * * ,我得到我的Android设备ID,以android- 35c2acdd...

资源 资源

如果我使用Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID)结果开始于a96b4b27...

如果我使用((TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()结果开始于3538330...

这些ID-s有什么区别? 我怎样才能得到的结果

* * 8 2 5 5 * *拨号

IMEI

IMEI是电话模块的“ MAC ” – 当通过GSM / GPRS / HSPDA /等连接时,电话使用的唯一ID。 GSMnetworking使用它将来自GSMnetworking的电话和数据的呼叫和数据直接路由到因特网(这是一个IPnetworking)。

电话模块是处理电话networking(GSM或CMDA)的芯片或电路板,并且通常具有用于可移动SIM卡的插槽。 某些电话具有多个电话模块(主动双SIM卡或多SIM卡电话)。 每个电话模块都有自己的IMEI。

制造商在制造过程中为每个电话(严格来说是电话模块)提供一个独特的IMEI。 但是,如果您拥有合适的软件,则通常可以重新编号。 这通常是在手机被盗后才能给手机一个新的身份和bipass被盗的手机屏蔽系统。

IMEI可以使用TelephonyManager.getDeviceId() API以编程方式获得。

CDMA手机具有 不同的长度和格式 的ESN或MEID ,即使使用相同的API检索。

没有电话模块的Android设备(例如很多平板电脑和电视设备) 没有IMEI 。 Schlangi评论说,一些没有电话模块的设备伪造了IMEI,所以IMEI的存在并不总是保证设备具有电话模块。

ANDROID_ID

ANDROID_ID是手机上另一个唯一的号码 – 这是OS第一次启动时自动生成的(这样做可以使制造商从生产线上移除一步)。

ANDROID_ID可以(并且确实)改变,例如:

它主要由开发人员使用(例如识别和连接使用adb设备)

根据上述注意事项,ANDROID_ID可以用来识别Android设备,实际上它意味着它在设备生命周期的重要部分唯一标识设备,但是不能被依赖。

另外请注意,在Froyo有一个错误,许多设备给自己一样的 ANDROID_ID。 这是错误

其他标识符

还有其他一些可以用来识别设备的东西:

  • WiFi模块的MAC地址: WifiManager.getConnectionInfo() – > WifiInfo.getMacAddress() 。 这通常可以在软件中改变,但是在设备寿命期间通常是恒定的。 也只有在WiFi模块开启的情况下才能读取。
  • 蓝牙模块的MAC地址: BluetoothAdaptor.getAddress() 。 与WiFi MAC一样,这通常可以在软件中进行更改,并且可能在您需要时closures
  • 订户的电话号码。 如果用户从电信公司请求新的号码,或者用户切换SIM卡,这可能会改变。 它从TelephonyManager.getLine1Number()获得。 这仅适用于安装了当前SIM的Android手机设备以及带有电话服务的付费服务。
  • SIM卡包含自己的识别号码( IMSI )。 这是从TelephonyManager.getSubscriberId() API获得的。 很显然,SIM卡可能不会在任何特定的时间出现,并且在SIM卡更换时发生改变 – 用户可以在保持相同的号码的情况下升级/更换SIM卡,所以您不能说这是一对一的一个特定的电话或用户。
  • 与IMSI相关的是MSISDN 。 这用作订阅的标识(您与您的移动提供商签订的特定电话号码的合同),并因此给设备提供其电话号码。 MSISDN可能与多个SIM卡相关联,因此可能与多个电话相关联。 它与所有的警告阅读上面的SIM卡。 这可以通过TelephonyManager.getSimSerialNumber()进行检索。 谢谢Schlangi的更正和补充
  • 姜饼和后来有android.os.Build.SERIAL许多制造商设置(但不是所有的错误)。

其他说明

您需要特定的权限才能访问每个API,因此如果您尝试所有这些API,那么您的应用在Google Play商店中的权限就会相当宽容。

我想这个链接解释所有其他可用的选项也https://android-developers.googleblog.com/2011/03/identifying-app-installations.html

在网上find:

 private static final Uri URI = Uri.parse("content://com.google.android.gsf.gservices"); private static final String ID_KEY = "android_id"; String getAndroidId(Context ctx) { String[] params = { ID_KEY }; Cursor c = ctx.getContentResolver() .query(URI, null, null, params, null); if (!c.moveToFirst() || c.getColumnCount() < 2) return null; try { return Long.toHexString(Long.parseLong(c.getString(1))); } catch (NumberFormatException e) { return null; } } 

添加权限:

 <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 

不过,我怀疑这是一个有logging的ID,我会很小心,因为如果GTalk得到更新可能无法正常工作。

资料来源: http : //blog.codepainters.com/2012/01/17/how-to-obtain-gtalk-android-id/

另外值得看看: http : //www.toxicbakery.com/android-development/getting-google-auth-sub-tokens-in-your-android-applications/

有一些方法来获得Android手机上的唯一标识符。

  1. Android ID它是在设备第一次启动时生成的64位hexstring。 一般情况下,除非出厂重置,否则不会更改。

    Secure.getString(getContentResolver(),Secure.ANDROID_ID);

Android ID被认为是不可靠的,因为它有时可能是空的。 该文件指出“它可以在工厂重置时更改”。 这个string也可以在固定电话上修改。

  String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); Returns: 9774d56d682e549c . No special permissions required. 

2. WLAN MAC地址string是另一个可用作设备ID的唯一标识符。 在阅读之前,您需要确保您的项目具有android.permission.ACCESS_WIFI_STATE权限,否则无线局域网MAC地址将为空。

  WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); String m_szWLANMAC = wm.getConnectionInfo().getMacAddress(); Returns: 00:11:22:33:44:55 (not a real address since this is a custom ROM , as you can see the MAC address can easily be faked). WLAN doesn't have to be on, to read this value. 

3.如果您的项目具有android.permission.BLUETOOTH权限,则可以在具有蓝牙的Android设备上使用BT MAC地址string。

  BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_szBTMAC = m_BluetoothAdapter.getAddress(); 

返回:43:25:78:50:93:38 英国电信不一定要上,阅读它。 4. IMEI仅适用于使用手机的Android设备:

  TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE 

这需要在AndroidManifest.xml中添加一个权限,用户将在安装软件之后得到通知:android.permission.READ_PHONE_STATE。 IMEI对于您的手机是唯一的,它看起来像这样:359881030314356(除非你有一个预制作设备,如0000000000000无效的IMEI)。 有关更多信息, 请参阅此链接。

IMEI

标准化机构强制规定,公共networking的移动设备可能由IMEI号唯一标识

设置IMEI是制造商的责任。 在实践中,开发者有时会看到IMEI如000000 …或123456 …有时IMEI相同的手机将投入生产,这当然是一个应该修复的bug。

ANDROID_ID

在设备第一次启动时随机生成的一个64位数字(作为hexstring),并应在设备的生命周期内保持不变。 (如果在设备上执行出厂重置,值可能会改变。)

它看起来像Android不信任制造商,并提供了一个替代的唯一ID。

编辑:

这是我得到(而不是IMEI)和Android设备不是电话:

 $ adb shell dumpsys iphonesubinfo Phone Subscriber Info: Phone Type = GSM Device ID = null 

我认为上面提供的所有信息都足以理解代码。

但是我认为你还是“看不到#8255 ##拨号盘的结果”(如果我在了解这个地方的地方出了问题,

我想这背后的原因是针对Android中的USSD代码的最新错误修复之一。 (你可以阅读更多关于这个,并检查你的设备是否在列表上,它遍布整个networking)

最后,如果你只是想直接得到android ID,我build议你使用这个app-

https://play.google.com/store/apps/details?id=com.redphx.deviceid&hl=en