Android设备ID混淆
如果我拨打* # * # 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 # * # *拨号
IMEI
IMEI是电话模块的“ MAC ” – 当通过GSM / GPRS / HSPDA /等连接时,电话使用的唯一ID。 GSMnetworking使用它将来自GSMnetworking的电话和数据的呼叫和数据直接路由到因特网(这是一个IPnetworking)。
电话模块是处理电话networking(GSM或CMDA)的芯片或电路板,并且通常具有用于可移动SIM卡的插槽。 某些电话具有多个电话模块(主动双SIM卡或多SIM卡电话)。 每个电话模块都有自己的IMEI。
制造商在制造过程中为每个电话(严格来说是电话模块)提供一个独特的IMEI。 但是,如果您拥有合适的软件,则通常可以重新编号。 这通常是在手机被盗后才能给手机一个新的身份和bipass被盗的手机屏蔽系统。
IMEI可以使用TelephonyManager.getDeviceId() API以编程方式获得。
CDMA手机具有 不同的长度和格式 的ESN或MEID ,即使使用相同的API检索。
没有电话模块的Android设备(例如很多平板电脑和电视设备) 没有IMEI 。 Schlangi评论说,一些没有电话模块的设备伪造了IMEI,所以IMEI的存在并不总是保证设备具有电话模块。
ANDROID_ID
ANDROID_ID是手机上另一个唯一的号码 – 这是OS第一次启动时自动生成的(这样做可以使制造商从生产线上移除一步)。
ANDROID_ID可以(并且确实)改变,例如:
- 恢复出厂设置(包括重新刷新操作系统时)
- 在软件中:例如https://play.google.com/store/apps/details?id=com.vcastroi.changeid
它主要由开发人员使用(例如识别和连接使用adb
设备)
根据上述注意事项,ANDROID_ID可以用来识别Android设备,实际上它意味着它在设备生命周期的重要部分唯一标识设备,但是不能被依赖。
另外请注意,在Froyo有一个错误,许多设备给自己一样的 ANDROID_ID。 这是错误
其他标识符
还有其他一些可以用来识别设备的东西:
- WiFi模块的MAC地址: WifiManager.getConnectionInfo() – > WifiInfo.getMacAddress() 。 这通常可以在软件中改变,但是在设备寿命期间通常是恒定的。 也只有在WiFi模块开启的情况下才能读取。
- 蓝牙模块的MAC地址: BluetoothAdaptor.getAddress() 。 与WiFi MAC一样,这通常可以在软件中进行更改,并且可能在您需要时closures
- 订户的电话号码。 如果用户从电信公司请求新的号码,或者用户切换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许多制造商设置(但不是所有的错误)。
其他说明
您需要特定的权限才能访问每个API,因此如果您尝试所有这些API,那么您的应用在Google Play商店中的权限就会相当宽容。
我想这个链接解释所有其他可用的选项也https://android-developers.googleblog.com/2011/03/identifying-app-installations.html
在网上find:
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"/>
不过,我怀疑这是一个有logging的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/
有一些方法来获得Android手机上的唯一标识符。
-
Android ID它是在设备第一次启动时生成的64位hexstring。 一般情况下,除非出厂重置,否则不会更改。
Secure.getString(getContentResolver(),Secure.ANDROID_ID);
Android ID被认为是不可靠的,因为它有时可能是空的。 该文件指出“它可以在工厂重置时更改”。 这个string也可以在固定电话上修改。
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); Returns: 9774d56d682e549c . No special permissions required.
2. WLAN MAC地址string是另一个可用作设备ID的唯一标识符。 在阅读之前,您需要确保您的项目具有android.permission.ACCESS_WIFI_STATE权限,否则无线局域网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地址string。
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(除非你有一个预制作设备,如0000000000000无效的IMEI)。 有关更多信息, 请参阅此链接。
IMEI
标准化机构强制规定,公共networking的移动设备可能由IMEI号唯一标识
设置IMEI是制造商的责任。 在实践中,开发者有时会看到IMEI如000000 …或123456 …有时IMEI相同的手机将投入生产,这当然是一个应该修复的bug。
ANDROID_ID
在设备第一次启动时随机生成的一个64位数字(作为hexstring),并应在设备的生命周期内保持不变。 (如果在设备上执行出厂重置,值可能会改变。)
它看起来像Android不信任制造商,并提供了一个替代的唯一ID。
编辑:
这是我得到(而不是IMEI)和Android设备不是电话:
$ adb shell dumpsys iphonesubinfo Phone Subscriber Info: Phone Type = GSM Device ID = null
我认为上面提供的所有信息都足以理解代码。
但是我认为你还是“看不到#8255 ##拨号盘的结果”(如果我在了解这个地方的地方出了问题,
我想这背后的原因是针对Android中的USSD代码的最新错误修复之一。 (你可以阅读更多关于这个,并检查你的设备是否在列表上,它遍布整个networking)
最后,如果你只是想直接得到android ID,我build议你使用这个app-
https://play.google.com/store/apps/details?id=com.redphx.deviceid&hl=en