如何获取Android设备的IMEI 1与IMEI 2?求ADB或C#库可行方案
通过ADB或C#库获取Android设备的IMEI 1与IMEI 2
ADB命令方案
双SIM设备的IMEI读取依赖系统版本、权限及厂商限制,尤其是Android 10+隐私权限收紧后,部分设备会限制非系统场景读取IMEI2。以下是可行的命令尝试:
基础读取命令
- 读取所有可用IMEI(返回十六进制,需转十进制):
adb shell service call iphonesubinfo 1
注:若要读取IMEI2,可将命令中的1改为2,部分设备支持此参数。 - Android 8.0+直接查看设备信息:
adb shell dumpsys iphonesubinfo
部分设备会直接列出Device ID 1和Device ID 2,对应IMEI1与IMEI2。
权限与限制说明
- 确保设备已开启USB调试并授权当前电脑的调试权限。
- Android 10及以上,普通ADB权限可能无法读取IMEI2,需尝试root后的ADB shell(
adb root),但root会失去设备保修且存在安全风险。 - 部分厂商(如华为、小米)的隐私策略会直接限制ADB读取IMEI2,此类场景无法通过常规命令绕过。
C#库方案
1. 跨平台调用ADB命令
在C#中直接执行ADB命令并解析输出,适用于桌面端或跨平台场景:
using System.Diagnostics; using System.Text.RegularExpressions; public static string GetDeviceIMEI(int simSlot = 1) { var processStartInfo = new ProcessStartInfo { FileName = "adb", Arguments = simSlot == 1 ? "shell service call iphonesubinfo 1" : "shell service call iphonesubinfo 2", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; using var process = Process.Start(processStartInfo); if (process == null) return null; string output = process.StandardOutput.ReadToEnd(); process.WaitForExit(); // 提取十六进制内容并转换为十进制IMEI var hexMatch = Regex.Match(output, @"(\d+)"); return hexMatch.Success ? Convert.ToInt64(hexMatch.Groups[1].Value, 16).ToString() : null; }
注:需确保ADB路径已加入系统环境变量,或在代码中指定ADB的绝对路径。
2. Android应用内读取(Xamarin/.NET MAUI)
若开发Android应用,可直接调用Android原生API:
using Android.Telephony; using Android.Content; using Android.OS; public static string GetIMEIBySlot(Context context, int slotIndex) { var telephonyManager = (TelephonyManager)context.GetSystemService(Context.TelephonyService); if (telephonyManager == null) return null; if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { return telephonyManager.GetImei(slotIndex); } else { // 旧版本系统仅支持读取默认SIM的IMEI return telephonyManager.Imei; } }
注意:
- 需在
AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" />。 - Android 10及以上,非系统应用无法获取IMEI,仅系统签名应用或root设备可读取。
内容的提问来源于stack exchange,提问作者Rahul Arya
相关产品推荐
相关产品推荐

