android设备ID混乱

Ger*_*ári 44 java android device

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

And*_*ock 82

IMEI

IMEI是电话模块的" MAC " - 电话通过GSM/GPRS/HSPDA /等连接时使用的唯一ID.GSM网络使用它将来自电话的呼叫和数据通过GSM网络路由到网关,然后进入因特网(这是一个IP网络).

电话模块是处理电话网络(GSM或CMDA)的芯片或电路板,并且通常具有用于可移动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模块打开时才能读取它.
  • 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


Vin*_*rat 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

添加权限:

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这是一个记录的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/


nee*_*j t 5

有一些方法可以获得Android手机上的唯一标识符.

  1. Android ID它是一个64位十六进制字符串,它是在设备首次启动时生成的.通常,除非出厂重置,否则不会更改.

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

Android ID被认为不可靠,因为它有时可能为空.该文档指出它"可以在出厂重置时更改".此字符串也可以在root电话上更改.

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

Returns: 9774d56d682e549c . No special permissions required.
Run Code Online (Sandbox Code Playgroud)

2. WLAN MAC地址字符串是您可以用作设备ID的另一个唯一标识符.在阅读之前,您需要确保您的项目具有android.permission.ACCESS_WIFI_STATE权限,否则WLAN MAC地址将显示为null.

 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.
Run Code Online (Sandbox Code Playgroud)

3.如果您的项目具有android.permission.BLUETOOTH权限,则可以读取具有蓝牙的Android设备上可用的BT MAC地址字符串.

    BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
    m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
   String m_szBTMAC = m_BluetoothAdapter.getAddress();
Run Code Online (Sandbox Code Playgroud)

返回:43:25:78:50:93:38.BT不必打开,阅读它.4. IMEI仅适用于使用电话的Android设备:

 TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
 String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE
Run Code Online (Sandbox Code Playgroud)

这需要在AndroidManifest.xml中添加权限,安装软件时会通知用户:android.permission.READ_PHONE_STATE.IMEI对于您的手机来说是独一无二的,它看起来像这样:359881030314356(除非您的预生产设备具有无效的IMEI,如0000000000000).有关更多信息,请参阅此链接.