43

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

4

5 回答 5

82

IMEI

IMEI 是电话模块的“ MAC ”——电话通过 GSM/GPRS/HSPDA/等连接时使用的唯一 ID。GSM 网络使用它通过 GSM 网络将电话和数据路由到网关,进入 Internet(这是一个 IP 网络)。

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

制造商在制造过程中为每部电话(严格来说是电话模块)赋予了唯一的 IMEI。但是,如果您拥有正确的软件,通常可以重写该数字。这通常在手机被盗后进行,以便为手机提供新的身份并通过双向被盗电话阻止系统。

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

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

没有电话模块的 Android 设备(例如许多平板电脑和电视设备)没有 IMEI。正如Schlangi评论的那样,一些没有电话模块的设备会伪造IMEI,因此 IMEI 的存在并不(总是)保证设备具有电话模块。

ANDROID_ID

ANDROID_ID 是手机上的另一个唯一编号 - 这是由操作系统在首次启动时自动生成的(这样做可以使制造商从生产线中移除一个步骤,从而使制造商变得更加容易)

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

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

鉴于上述警告,ANDROID_ID 可用于识别 Android 设备,实际上意味着它在设备生命周期的重要部分内唯一地识别设备,但不能依赖。

另请注意,在 Froyo 中存在一个错误,其中许多设备为自己提供了相同的ANDROID_ID。这是错误

其他标识符

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

  • WiFi模块的MAC地址:WifiManager.getConnectionInfo() -> WifiInfo.getMacAddress()。这通常可以在软件中更改,但通常在设备生命周期内保持不变。此外,只有打开 WiFi 模块才能读取。
  • 蓝牙模块的 MAC 地址:BluetoothAdaptor.getAddress()。与 WiFi MAC 一样,这通常可以在软件中进行更改,并且可能会在您需要时关闭
  • 订户的电话号码。如果用户从电信公司请求一个新号码,或者如果用户更换 SIM,这可能会改变。它是从TelephonyManager.getLine1Number()获得的。这仅适用于安装了当前 SIM 卡并通过电信公司提供付费服务的 Android 手机设备。
  • SIM 包含自己的识别号 ( IMSI )。这是从TelephonyManager.getSubscriberId() API 获得的。显然,SIM 卡可能在任何特定时间都不存在,并且它会随着 SIM 卡的更换而改变——用户可以在保持相同号码的同时升级/更换他们的 SIM 卡,所以你不能说这是一对一的特定的电话或用户。
  • 与 IMSI 相关的是MSISDN。这用作订阅标识(您与移动提供商签订的特定电话号码合同),因此为设备提供了电话号码。MSISDN 可能与几张 SIM 卡相关联,因此与几部电话相关联。它附带了阅读上述 SIM 卡的所有注意事项。这可以通过TelephonyManager.getSimSerialNumber()检索。感谢Schlangi的更正和补充
  • Gingerbread 和后来的android.os.Build.SERIAL是许多制造商设置的(但不是全部。Bugger)。

其他注意事项

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

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

于 2012-12-12T00:59:07.590 回答
8

在网上找到:

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/

于 2012-12-11T11:59:23.167 回答
5

有一些方法可以在 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. 如果您的项目具有 android.permission.BLUETOOTH 权限,则可以在带有蓝牙的 Android 设备上读取 BT MAC 地址字符串。

    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. 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(除非您的预生产设备具有无效的 IMEI,例如 0000000000000)。有关更多信息,请参阅此链接。

于 2012-12-18T09:06:39.440 回答
3

IMEI

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

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

ANDROID_ID

在设备首次启动时随机生成的 64 位数字(作为十六进制字符串),在设备的整个生命周期内应保持不变。(如果在设备上执行恢复出厂设置,该值可能会发生变化。)

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

编辑:

这是我在不是手机的 Android 设备上获得的(而不是 IMEI):

$ adb shell dumpsys iphonesubinfo
Phone Subscriber Info:
  Phone Type = GSM
  Device ID = null
于 2012-12-07T06:19:39.357 回答
1

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

但是我认为您仍然“无法看到##8255##拨号的结果如果我在理解这一点上出错了,请原谅)

我认为这背后的原因是针对 Android 中的 USSD 代码的最新错误修复之一。(您可以阅读有关此内容的更多信息并检查您的设备是否在列表中。它遍布整个网络)

最后,如果您只是想直接获得 android ID,我建议您使用这个应用程序-

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

于 2012-12-17T16:38:39.390 回答