自 Android 5.0 Lollipop 版本以来,adb shell dumpsys iphonesubinfo 工具无法正常工作。

19

我们曾经使用以下命令获取设备ID/IMEI:

adb shell dumpsys iphonesubinfo

但自从上一次 Android 更新(5.0 - 棒棒糖)以来,该命令不再返回任何内容。我在 Nexus 4 和 Nexus 5 上都进行了测试。

我知道我可以从代码中获取 IMEI,这仍然有效,但是否有人有 ADB 的解决方法?


1
我认为这是5.0版本中的一个错误。我在4.4.2和5.0上尝试了adb shell dumpsys iphonesubinfo > info.txt,4.4.2将信息放入了文件中,而5.0没有。 - BlackHatSamurai
4个回答

17

您始终可以使用service call命令调用服务方法。

android-5.0.0_r1iphonesubinfo服务的交易代码如下:

 1  getDeviceId
 2  getDeviceIdForSubscriber
 3  getImeiForSubscriber
 4  getDeviceSvn
 5  getSubscriberId
 6  getSubscriberIdForSubscriber
 7  getGroupIdLevel1
 8  getGroupIdLevel1ForSubscriber
 9  getIccSerialNumber
10  getIccSerialNumberForSubscriber
11  getLine1Number
12  getLine1NumberForSubscriber
13  getLine1AlphaTag
14  getLine1AlphaTagForSubscriber
15  getMsisdn
16  getMsisdnForSubscriber
17  getVoiceMailNumber
18  getVoiceMailNumberForSubscriber
19  getCompleteVoiceMailNumber
20  getCompleteVoiceMailNumberForSubscriber
21  getVoiceMailAlphaTag
22  getVoiceMailAlphaTagForSubscriber
23  getIsimImpi
24  getIsimDomain
25  getIsimImpu
26  getIsimIst
27  getIsimPcscf
28  getIsimChallengeResponse
29  getIccSimChallengeResponse

大多数方法需要root权限。但幸运的是,获取设备IMEI/MEID所需的getDeviceId不需要。

要在设备端正确解析service call命令输出并且不依赖于外部组件,请参阅我的这里的回答

还可以阅读从ADB Shell调用Android服务了解更多详情。


谢谢,我已经尝试过服务调用命令,但我需要在不root手机的情况下完成这个任务。 - Jérémy
1
getDeviceId 不需要 root - Alex P.
1
实际上,这在Android 5.0和5.0.1上无法工作,只适用于Android 5.1及以上版本。 - Jérémy
这是适用于所有Android版本的解决方法:https://dev59.com/B2w15IYBdhLWcg3wD3np#37940140 - saschoar
嗨@AlexP.,你能解释一下如何获取这个代码方法列表吗? 我找到了IPhoneSubInfo.aidl源代码,但没有找到列表文件。 - Weekend

13

Sim卡1的IMEI

adb shell service call iphonesubinfo 1 | awk -F "'" '{print $2}' | sed '1 d' | tr -d '.' | awk '{print}' ORS=

3
我已经修改了它以在Windows上运行:adb shell“service call iphonesubinfo 1 | awk -F \"'\" '{print $2}' | sed '1 d' | tr -d '.' | awk '{print}' ORS=" - Robyer

7

获取设备IMEI的ADB命令:

adb shell "service call iphonesubinfo 1 | cut -c 52-66 | tr -d '.[:space:]'"

获取设备手机号码的ADB命令:

adb shell "service call iphonesubinfo 18 | cut -c 52-66 | tr -d '.[:space:]+'"

获取Android ID的ADB命令:

adb shell settings get secure android_id

获取设备序列号的ADB命令:

adb shell getprop ro.serialno

注意:以上所有命令均无需root权限。


4

我同意Alex P和Jeremy的看法,我们可以通过服务调用获取电话IMEI,但这会产生复杂的数据包,难以查看。由于我不是程序员,所以经过很多尝试和研究命令行,我找到了一个解决方案,可以单独获取IMEI,并决定分享它,因为它可以帮助很多人。

以下是我制作的从Lollypop 5.1中获取IMEI的脚本,它适用于非root手机。

@echo off
setlocal enabledelayedexpansion
for /f "tokens=6*" %%a in ('adb shell "service call iphonesubinfo 1 ^| grep -m 1 \"'\""') do (
set imei1=%%a)
for /f "tokens=6*" %%b in ('adb shell "service call iphonesubinfo 1 ^| grep -m 2 \"'\""') do (
set imei2=%%b)
for /f "tokens=4*" %%c in ('adb shell "service call iphonesubinfo 1 ^| grep -m 3 \"'\""') do (
set imei3=%%c) 
set imei=!imei1!!imei2!!imei3!
echo !imei! > imei.txt
for /f "delims=" %%d in (imei.txt) do (
set DeviceIMEI=%%d
set DeviceIMEI=!DeviceIMEI:'=!
set DeviceIMEI=!DeviceIMEI:.=!
set OIMEI=Phone IMEI  !DeviceIMEI!
)
echo %OIMEI%
pause

这将导致“手机IMEI '无论是什么手机IMEI'”。 请记住,它只会显示默认用于呼叫的SIM卡插槽的IMEI。 如果有人可以简化此脚本,那就太棒了。


这个脚本创建imei.txt文件,但是该文件中唯一的内容是一个字符串:“itfound”。 - Petr Krampl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接