adb实现自动接听

开发背景

在自动化测试工作中,常常要对测试机进行通话方面的压力测试。此时,配合机有这样的需求:它需要自动接听来自测试机的电话,然后在通话持续一段时间后自动挂断

特别要注意的是,配合机必须只对测试机拨打的通话进行自动接听,要将其他来电排除在外,不受其干扰,以此确保通话压力测试能够准确、有效地进行。

相关指令

adb shell dumpsys telephony.registry:获取当前设备的通话状态信息

  • mCallState:来电状态。0:空闲状态;1:响铃;2:通话中;
  • mCallIncomingNumber:来电号码;
  • mDataConnectionState :数据流量连接状态(可以用来判断是否打开数据流量)

adb shell am start -a android.intent.action.CALL -d tel:xxx:拨打指定电话

adb shell input keyevent 5:接听电话

adb shell input keyevent 6:挂断电话

功能实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def autoAnswer(device: str, number: str, duration: int = 10) -> None:
"""
自动接听电话
:param device: 设备号
:param number: 电话号码
:param duration: 通话时长,单位秒
"""
while True:
if "1" in subPopen(f"adb -s {device} shell dumpsys telephony.registry|findstr mCallState"):
time.sleep(2)
print("来电")
if number in subPopen(f"adb -s {device} shell dumpsys telephony.registry | findstr mCallIncomingNumber"):
subPopen(f"adb -s {device} shell input keyevent 5")
print("接听电话")
time.sleep(duration)
subPopen(f"adb -s {device} shell input keyevent 6")
print("挂断电话")
else:
print("不是指定号码,忽略")
subPopen(f"adb -s {device} shell input keyevent 6")
time.sleep(2)