如果我拨打电话
*
#
*
#
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 # * # * 拨号?
答案 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
其他标识符
可以使用许多其他东西来识别设备:
其他说明
您需要具备访问每个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/
答案 2 :(得分:5)
在Android手机上有一些获取唯一标识符的方法。
Android ID 它是一个64位十六进制字符串,它是在设备的首次启动时生成的。 一般情况下,除非出厂重置,否则不会发生变化。
Secure.getString(getContentResolver(),Secure.ANDROID_ID);
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