android设备ID混乱

时间:2012-12-06 13:23:57

标签: java android device

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

开头

source source

如果我使用Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID),结果会以 a96b4b27...

开头

如果我使用((TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(),结果会以 3538330...

开头

这些ID-s有什么区别?如何获得

的结果

* * 8 2 5 5 * *  拨号?

5 个答案:

答案 0 :(得分:78)

<强> IMEI

IMEI是电话模块的“MAC” - 电话通过GSM / GPRS / HSPDA /等连接时使用的唯一ID。 GSM网络使用它将来自电话的呼叫和数据通过GSM网络直接路由到网关(即IP网络)。

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

制造商在制造过程中为每部手机(严格来说是电话模块)提供独特的IMEI。但是,如果您拥有合适的软件,通常可以重写该数字。这通常是在手机被盗之后为手机提供新身份和双手被盗手机拦截系统。

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

CDMA手机的ESN或MEID different lengths and formats,即使使用相同的API检索它也是如此。

没有电话模块的Android设备 - 例如许多平板电脑和电视设备 - 没有IMEI 。正如Schlangi所述,有些设备没有电话模块假冒 IMEI,因此IMEI的存在并不(始终)保证设备具有电话模块。

<强> ANDROID_ID

ANDROID_ID是手机上的另一个唯一号码 - 这是第一次启动时由操作系统自动生成的(这样做可以通过删除步骤使制造商更容易 来自生产线)。

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

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

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

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

其他标识符

可以使用许多其他东西来识别设备:

  • WiFi模块的MAC地址:WifiManager.getConnectionInfo() - &gt; WifiInfo.getMacAddress()。这通常可以在软件中更改,但通常在设备生命周期内保持不变。此外,只有打开WiFi模块才能读取它。
  • BlueTooth模块的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更正和补充
  • 姜饼和后来有android.os.Build.SERIAL许多制造商设置(但不是全部.Bugger)。

其他说明

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

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

答案 1 :(得分: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/

答案 2 :(得分:5)

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

  1. Android ID 它是一个64位十六进制字符串,它是在设备的首次启动时生成的。 一般情况下,除非出厂重置,否则不会发生变化。

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

  2. Android ID,被认为不可靠,因为它有时可能为空。 文档指出它可以在出厂重置时更改&#34;。 此字符串也可以在有根电话上更改。

       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。英国电信并不打算阅读它。 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)。 有关详细信息,请refer此链接。

答案 3 :(得分:3)

IMEI

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

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

ANDROID_ID

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

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

编辑:

这是我得到的(而不是IMEI)和手机的Android设备:

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

答案 4 :(得分:1)

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

但我认为你仍然“无法看到#8255#拨号的结果”(如果我在理解这个问题时出错了,请原谅)

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

最后,如果您只想直接获取Android ID,我建议您使用此应用程序 -

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