前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android自动化测试中使用ADB监听电话并自动接听

Android自动化测试中使用ADB监听电话并自动接听

作者头像
测试开发囤货
发布2023-10-25 10:06:19
5890
发布2023-10-25 10:06:19
举报
文章被收录于专栏:测试开发囤货
Android自动化测试中使用ADB监听电话并自动接听

在Android自动化测试中,模拟电话的接听是一项常见的任务。通过使用Android Debug Bridge(ADB)工具,你可以监听手机的来电状态并自动接听来电。本文将介绍如何使用ADB来实现这一目标。

1. 准备工作

在开始之前,确保你已经完成以下准备工作:

  1. 安装ADB:确保你已经安装了ADB工具,并将其添加到系统的PATH变量中。
  2. USB调试模式:连接你的Android设备到计算机,并在设备上启用USB调试模式。这允许你使用ADB命令与设备通信。

2. 监听来电状态

要监听手机的来电状态,我们可以使用adb shell dumpsys telephony.registry命令,该命令提供了关于电话状态的信息。

代码语言:javascript
复制
last known state:
  Phone Id=0
    mCallState=1
    mRingingCallState=5
    mForegroundCallState=0
    mBackgroundCallState=0
    mPreciseCallState=Ringing call state: 5, Foreground call state: 0, Background call state: 0, Disconnect cause: -1, Precise disconnect cause: -1
    mCallDisconnectCause=-1
    mCallIncomingNumber=17000724942
    mServiceState={mVoiceRegState=0(IN_SERVICE), mDataRegState=0(IN_SERVICE), mChannelNumber=1825, duplexMode()=1, mCellBandwidths=[15000], mOperatorAlphaLong=中国电信, mOperatorAlphaShort=CT, isManualNetworkSelection=false(automatic), getRilVoiceRadioTechnology=14(LTE), getRilDataRadioTechnology=14(LTE), mCssIndicator=unsupported, mNetworkId=-1, mSystemId=-1, mCdmaRoamingIndicator=-1, mCdmaDefaultRoamingIndicator=-1, mIsEmergencyOnly=false, isUsingCarrierAggregation=false, mArfcnRsrpBoost=0, mNetworkRegistrationInfos=[NetworkRegistrationInfo{ domain=PS transportType=WLAN registrationState=UNKNOWN roamingType=NOT_ROAMING accessNetworkTechnology=UNKNOWN rejectCause=0 emergencyEnabled=false availableServices=[] cellIdentity=null voiceSpecificInfo=null dataSpecificInfo=null nrState=**** rRplmn= isUsingCarrierAggregation=false nsaState=0 mConfigRadioTech=0}, NetworkRegistrationInfo{ domain=CS transportType=WWAN registrationState=HOME roamingType=NOT_ROAMING accessNetworkTechnology=LTE rejectCause=0 emergencyEnabled=false availableServices=[VOICE,SMS,VIDEO] cellIdentity=CellIdentityLte:{ mPci=50 mEarfcn=1825 mBands=[3] mBandwidth=15000 mMcc=460 mMnc=11 mAlphaLong=CHN-CT mAlphaShort=CT mAdditionalPlmns={} mCsgInfo=null} voiceSpecificInfo=VoiceSpecificRegistrationInfo { mCssSupported=false mRoamingIndicator=0 mSystemIsInPrl=0 mDefaultRoamingIndicator=0} dataSpecificInfo=null nrState=**** rRplmn=46011 isUsingCarrierAggregation=false nsaState=0 mConfigRadioTech=0}, NetworkRegistrationInfo{ domain=PS transportType=WWAN registrationState=HOME roamingType=NOT_ROAMING accessNetworkTechnology=LTE rejectCause=0 emergencyEnabled=false availableServices=[DATA] cellIdentity=CellIdentityLte:{ mPci=50 mEarfcn=1825 mBands=[3] mBandwidth=15000 mMcc=460 mMnc=11 mAlphaLong=CHN-CT mAlphaShort=CT mAdditionalPlmns={} mCsgInfo=null} voiceSpecificInfo=null dataSpecificInfo=android.telephony.DataSpecificRegistrationInfo :{ maxDataCalls = 16 isDcNrRestricted = false isNrAvailable = false isEnDcAvailable = false LteVopsSupportInfo :  mVopsSupport = 2 mEmcBearerSupport = 2 } nrState=**** rRplmn=46011 isUsingCarrierAggregation=false nsaState=0 mConfigRadioTech=0}], mNrFrequencyRange=0, mOperatorAlphaLongRaw=CHN-CT, mOperatorAlphaShortRaw=CT, mIsDataRoamingFromRegistration=false, mIsIwlanPreferred=false}
    mVoiceActivationState= 0
    mDataActivationState= 0
    mUserMobileDataState= false

上面是 adb shell dumpsys telephony.registry 输出的一部分,提供了关于手机通话状态的信息。以下是这些信息的解释:

代码语言:javascript
复制
Phone Id=0: 表示手机上的电话 ID。通常,手机上可以有多个电话,每个电话都有一个唯一的 ID。在此示例中,ID 为 0,表示手机上的第一个电话。

mCallState=1: 表示来电状态。在这里,1 表示电话的状态是 CALL_STATE_RINGING,即正在响铃,表示当前有来电。

mRingingCallState=5: 表示正在响铃的来电状态。在这里,5 表示来电状态是 CALL_STATE_ALERTING,表示来电正在呼叫。

mForegroundCallState=0: 表示前台通话的状态。在这里,0 表示前台没有活动通话。

mBackgroundCallState=0: 表示后台通话的状态。在这里,0 表示后台没有活动通话。

mPreciseCallState=Ringing call state: 5, Foreground call state: 0, Background call state: 0, Disconnect cause: -1, Precise disconnect cause: -1: 提供了更详细的通话状态信息,包括来电状态、前台通话状态、后台通话状态以及断开原因等。

mCallDisconnectCause=-1: 表示通话断开原因,-1 表示未提供断开原因的信息。

mCallIncomingNumber=17000724942: 表示来电的号码。在这里,来电号码是 17000724942。

根据上述信息,手机正在响铃,当前有来电,来电状态为 CALL_STATE_ALERTING,来电号码是 17000724942。这是 telephony.registry 输出的一部分,用于提供电话状态和通话信息。

下面是一个Python示例,用于获取来电状态:

代码语言:javascript
复制

import subprocess

def get_call_state():
    try:
        output = subprocess.check_output(["adb", "shell", "dumpsys", "telephony.registry"], universal_newlines=True)
        lines = output.splitlines()
        
        for line in lines:
            if "mCallState" in line:
                call_state = line.split("=")[1].strip()
                return int(call_state)

    except subprocess.CalledProcessError as e:
        print(f"Error executing adb command: {e}")
    
    return None

3. 自动接听来电

一旦你获取到了来电状态,你可以根据需要执行接听电话的操作。通常,来电状态为1表示来电正在响铃,此时我们可以模拟按下接听电话的按钮,使用以下代码:

代码语言:javascript
复制
def answer_call():
    subprocess.call('adb shell input keyevent 5', shell=True)
  1. 建立自动化测试 在自动化测试中,你可以集成上述功能,以便在需要时自动接听来电。例如,你可以在特定测试用例中添加接听来电的逻辑,以确保应用程序在接听电话的情况下正常工作。

以下是一个示例,演示如何在自动化测试中使用ADB来监听来电和自动接听:

代码语言:javascript
复制
if __name__ == "__main__":
    call_state = get_call_state()
    if call_state is not None:
        print(f"来电状态: {call_state}")
        if call_state == 1:  # 当来电状态为 CALL_STATE_RINGING 时
            print("接听电话中...")
            answer_call()
    else:
        print("无法获取来电状态")

完整代码

创建一个循环来定期检查来电状态,并在检测到来电时执行相关操作。以下是一个示例,用于不断检测来电状态:

代码语言:javascript
复制
import subprocess
import time

def get_call_state():
    try:
        output = subprocess.check_output(["adb", "shell", "dumpsys", "telephony.registry"], universal_newlines=True)
        lines = output.splitlines()
        
        for line in lines:
            if "mCallState" in line:
                call_state = line.split("=")[1].strip()
                return int(call_state)

    except subprocess.CalledProcessError as e:
        print(f"Error executing adb command: {e}")
    
    return None

def answer_call():
    subprocess.call('adb shell input keyevent 5', shell=True)

if __name__ == "__main__":
    while True:
        call_state = get_call_state()
        if call_state is not None:
            print(f"来电状态: {call_state}")
            if call_state == 1:  # 当来电状态为 CALL_STATE_RINGING 时
                print("接听电话中...")
                answer_call()
        else:
            print("无法获取来电状态")
        
        # 休眠一段时间后再次检测
        time.sleep(5)  # 5秒,你可以根据需要调整休眠时间

5. 注意事项

设备和制造商差异:不同的Android设备和制造商可能会有不同的实现方式,因此需要根据具体情况进行适配。

通过使用ADB来监听来电状态并自动接听电话,你可以有效地集成电话相关的测试用例,确保应用程序在各种情况下都能正常工作,从而提高移动应用的质量和稳定性。这在自动化测试中是一个重要的任务,特别是对于需要与电话通信的应用程序。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发囤货 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 准备工作
  • 2. 监听来电状态
  • 3. 自动接听来电
  • 完整代码
  • 5. 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档