Android设备ID混乱(android device id confusion)

2019-06-21 16:29发布

如果我拨*#*#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#*#*拨号?

Answer 1:

IMEI

该IMEI是“ MAC ”为电话模块-当它通过GSM / GPRS / HSPDA /等连接,该电话使用的唯一ID。 GSM网络,它使用路由呼叫和数据从手机通过GSM网络说得最多的网关到互联网(这是一个IP网络)。

电话模块是一个芯片或电路板处理该电话网络,GSM或CMDA,和经常具有用于可移除的SIM卡的槽。 有些手机有一个以上的电话模块(有源双或多卡手机)。 每个电话模块都有自己的IMEI。

厂家给每部手机(严格的电话模块)生产过程中一个唯一的IMEI。 但是,如果你有合适的软件数量,通常可以改写。 之后的手机被盗给手机一个新的身份和bipass被盗的手机拦截系统这是经常做。

的IMEI可以使用通过编程得到TelephonyManager.getDeviceId() API。

CDMA电话具有一个ESN或MEID它们是不同的长度和格式 ,尽管它是使用相同的API检索。

没有电话模块的Android设备-例如,许多平板电脑和电视设备- 没有一个IMEI。 作为Schlangi评论,一些设备没有电话模块的IMEI,以一个IMEI的存在不会(总是),保证了设备具有电话模块。

ANDROID_ID

该ANDROID_ID是手机上的另一个唯一的数字-这是由操作系统,因为它首次启动时间(做这种方式使得它通过从生产线一步的厂商更容易)自动生成。

所述ANDROID_ID可以(并且不会)改变,例如:

  • 恢复出厂设置(包括重新刷新OS时)
  • 在软件:如https://play.google.com/store/apps/details?id=com.vcastroi.changeid

它主要用于由开发者(例如,识别和连接到使用装置adb

ANDROID_ID可以被用于识别给定上述警告Android装置,现实地意味着它唯一地标识在装置寿命的显著部分的装置中,但不能依靠。

还要注意,在Froyo的一个bug,其中许多设备给自己同样的 ANDROID_ID。 这是错误

其他标识符

有许多可用于识别设备的其他事情:

  • WiFi模块的MAC地址: WifiManager.getConnectionInfo() - > WifiInfo.getMacAddress() 。 这可以经常在软件改变,但一般是在器件寿命恒定。 此外,如果WiFi模块接通它只能读取。
  • 蓝牙模块的MAC地址: BluetoothAdaptor.getAddress() 。 像无线MAC,这通常可以通过软件改变,当你需要它可能会关闭
  • 用户的电话号码。 如果用户从电信请求新的号码,或者如果用户切换的SIM这可能会改变。 它是从获得TelephonyManager.getLine1Number() 。 这是只存在于安装了当前的SIM卡,并用电信有偿服务的Android手机设备。
  • SIM卡包含它自己的识别码( IMSI )。 这是从获得TelephonyManager.getSubscriberId() API。 显然,SIM可能不会出现在任何特定的时间,它改变时,SIM卡被改变 - 而且用户可以升级/更换他们的SIM卡,同时保持相同的号码,所以你不能说这是一个-to-one的一个特定的电话或用户。
  • 相关的IMSI是MSISDN 。 这个功能用于订阅 (您与您的移动服务提供商特定的电话号码的合同),因此鉴定提供设备的电话号码。 该MSISDN可与部分SIM卡,因此一些手机相关联。 它配备了所有的告诫用于读取SIM以上。 这可以与被检索TelephonyManager.getSimSerialNumber() 。 感谢Schlangi的更正和补充
  • 姜饼后来有android.os.Build.SERIAL很多厂家设置(但不是全部。开溜)。

其他注意事项

你需要特定的权限来访问每个API,因此,如果您尝试为所有的人,你的应用程序在谷歌Play商店的权限看起来相当宽容。

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



Answer 2:

在网上找到了:

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"/>

然而,我怀疑是文档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/



Answer 3:

有一些办法让Android手机上唯一的标识符。

  1. 的Android ID是其在设备的第一引导所生成的64位的十六进制字符串。 一般也不会改变,除非是恢复出厂设置。

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

Android的ID,认为不可靠的,因为它有时是空的。 该文件指出,它“可以在恢复出厂设置改变”。 这个字符串也可以有根的手机上改变。

   String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

Returns: 9774d56d682e549c . No special permissions required.

2. WLAN MAC地址串,是另一个唯一的标识,可以作为一个设备ID使用。 在你读它,你需要确保你的项目有android.permission.ACCESS_WIFI_STATE许可或WLAN 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. BT MAC地址字符串,与蓝牙Android设备,可如果你的项目有android.permission.BLUETOOTH权限读取。

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

返回:43:25:78:50:93:38。 BT没有要上,阅读它。 4.仅适用于手机使用Android设备IMEI:

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

这需要在AndroidManifest.xml中添加权限,用户将在安装软件通知:android.permission.READ_PHONE_STATE。 该IMEI是手机独特的,它看起来像这样:359881030314356(除非你有一个无效的IMEI像0000000000000预生产设备)。 欲了解更多信息请参考以下链接。



Answer 4:

IMEI

有由标准化机构的强制性要求,对于公共网络的移动设备可以通过IMEI号码被唯一标识

这是制造商的责任设置IMEI。 在实践中,开发人员有时会看到IMEI号,像000000 ...或... 123456有时具有相同IMEI的手机去生产,这当然是应该修正了一个错误...

ANDROID_ID

即在装置的第一次启动随机生成一个64位的数(如十六进制字符串)应保持该装置的生存期内保持不变。 (如果在设备上执行出厂复位的值可能会改变。)

它看起来像Android这样不信任的制造商和提供了另一种独特的ID。

编辑:

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

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


Answer 5:

我认为,以上所提供的所有信息是不够好理解的代码。

然而,我觉得你还是“没能看到## 8255 ##表盘的结果”(PLZ借口,如果我出了问题的地方在理解这一点)

我认为这背后的原因是针对Android中取得USSD代码最新的错误修复程序的一个。 (你可以阅读更多关于这一点,并检查您的设备是否在名单上。它的所有网站上)

最后,如果你只是想获取Android ID通俗易懂,我建议你使用这个APP-

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



文章来源: android device id confusion