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

2023-10-31 13:51

本文主要是介绍Android自动化测试中使用ADB监听电话并自动接听!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

图片

1. 准备工作

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

  1. 安装ADB:确保你已经安装了ADB工具,并将其添加到系统的PATH变量中。

  2. USB调试模式:连接你的Android设备到计算机,并在设备上启用USB调试模式。这允许你使用ADB命令与设备通信。

2. 监听来电状态

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

last known state:Phone Id=0mCallState=1mRingingCallState=5mForegroundCallState=0mBackgroundCallState=0mPreciseCallState=Ringing call state: 5, Foreground call state: 0, Background call state: 0, Disconnect cause: -1, Precise disconnect cause: -1mCallDisconnectCause=-1mCallIncomingNumber=17000724942mServiceState={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= 0mDataActivationState= 0mUserMobileDataState= false

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

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示例,用于获取来电状态:

import subprocessdef 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
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

3. 自动接听来电

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

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

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

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("无法获取来电状态")

完整代码

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

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

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

在这里插入图片描述

这篇关于Android自动化测试中使用ADB监听电话并自动接听!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/315810

相关文章

Java中的Cursor使用详解

《Java中的Cursor使用详解》本文介绍了Java中的Cursor接口及其在大数据集处理中的优势,包括逐行读取、分页处理、流控制、动态改变查询、并发控制和减少网络流量等,感兴趣的朋友一起看看吧... 最近看代码,有一段代码涉及到Cursor,感觉写法挺有意思的。注意是Cursor,而不是Consumer

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

Python自动化处理手机验证码

《Python自动化处理手机验证码》手机验证码是一种常见的身份验证手段,广泛应用于用户注册、登录、交易确认等场景,下面我们来看看如何使用Python自动化处理手机验证码吧... 目录一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取

Rust中的注释使用解读

《Rust中的注释使用解读》本文介绍了Rust中的行注释、块注释和文档注释的使用方法,通过示例展示了如何在实际代码中应用这些注释,以提高代码的可读性和可维护性... 目录Rust 中的注释使用指南1. 行注释示例:行注释2. 块注释示例:块注释3. 文档注释示例:文档注释4. 综合示例总结Rust 中的注释

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (