安卓设备ID混淆

2022-09-01 01:20:32

如果我拨号,我得到我的Android设备ID,它以35c2acdd开头...* #* #8255#* #* android-

source

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

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

这些 ID 之间有什么区别?我如何获得结果

* # * # 8 2 5 5 # * # * 拨号?


答案 1

艾米

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

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

制造商在制造过程中为每部手机(严格的电话模块)提供唯一的IMEI。但是,如果您有正确的软件,通常可以重写该数字。这通常是在手机被盗后完成的,以便为手机提供新的身份和双通被盗电话拦截系统。

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

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卡会发生变化 - 用户可以在保持相同号码的同时升级/更换SIM卡,因此您不能说这对特定手机或用户来说是一对一的。
  • 与IMSI相关的是MSISDN。这充当订阅(您与移动提供商签订的特定电话号码合同)的标识,因此会为设备提供其电话号码。MSISDN 可能与多个 SIM 卡相关联,因此也与多个手机相关联。它带有阅读上述SIM卡的所有注意事项。这可以通过TelephonyManager.getSimSerialNumber()检索。感谢Schlangi的更正和补充
  • Gingerbread和后来的android.os.Build.SERIAL是许多制造商设置的(但不是全部。窃听器)。

其他注意事项

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

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


答案 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/


推荐