|
前言其实很多年前写过一篇python打电话的功能,链接如下:Python+twilio实现打电话和发短信功能_自动发短信代码-CSDN博客今天由于工作需要,又用python写了个关于打电话的小工具,主要是通过ADB方式实现的实现过程1.先利用adb指令封装几个常用的方法具体的含义可以看注释,注释写的很清楚 defmake_a_call(self,phoneNumber): #拨打电话,只需传入目标电话号码即可 phoneNumber=int(phoneNumber) #执行adb指令去拨打电话 proc=Utils.execute_adb_command('adbshellamstart-aandroid.intent.action.CALL-dtel:{:d}'.format(int(phoneNumber))) resp=proc.stdout.read() logging.info('Calling{:d}...'.format(phoneNumber)) defanswer_a_call(self): #接听电话的函数 #先获取一下当前通话状态 state=self.get_call_state() #如果状态时振铃,那么接听 ifstate==CallState.RING: Utils.execute_adb_command('adbshellamstart-aandroid.intent.action.ANSWER') logging.info('Haveansweredacall') else: logging.info('Nocallincoming') defget_call_state(self): #adbshell后的命令用双引号,否则执行出错!!!! proc=Utils.execute_adb_command('adbshell"dumpsystelephony.registry|grep\"mCallState\""') resp=proc.stdout.read()#读取命令执行的结果 state=str(resp).splitlines()[-1].split('=')[-1]#从返回内容中取出状态字符串 #返回通话状态 returnUtils.to_enum(int(state),CallState) defhang_up_a_call(self): #执行adb指令去挂掉电话 #先查询一下当前的状态 state=self.get_call_state() #如果状态时振铃,正在通话中,那么执行挂断,否则log提示 ifstatein[CallState.RING,CallState.CALLING]: proc=Utils.execute_adb_command('adbshellinputkeyevent6') logging.info('Havehangupacall') else: logging.info('Nocalltobehangup')2.再使用pysimpleGUI库写一个简单的工具界面即可#这是绘制界面的函数defmake_window(): """ BuildaGUIpage :return:window """ NetworkType=['2G','4G','5G'] defname(name,NAME_SIZE=11): dots=NAME_SIZE-len(name)-2 returnsg.Text(name+''+''*dots,size=(NAME_SIZE,1),justification='r',pad=(0,0),font='Courier11') #绘制设置选项 layout_basic=[ [name('网络类型:'),sg.Combo(default_value=NetworkType[2],values=NetworkType,size=(12,2),key='-NETWORK-'),sg.Button('设置',key='-SET-',enable_events=True)], [name('呼叫号码:'),sg.Input(default_text=10086,size=(12,2),key='-NUMBER1-'),sg.Input(default_text='',size=(12,2),key='-NUMBER2-'),sg.Input(default_text='',size=(12,2),key='-NUMBER3-'),sg.Input(default_text='',size=(12,2),key='-NUMBER4-'),sg.Input(default_text='',size=(12,2),key='-NUMBER5-')], [name('呼叫时间:'),sg.Input(default_text=30,size=(8,2),key='-CALL_TIME-'),sg.Text('秒')],#input代表输入框,default_text代表默认值,key代表给这输入框的起个别名 [name('循环次数:'),sg.Input(default_text=1,size=(8,2),key='-COUNT-'),sg.Text('次')], ] #绘制操作选项 layout_action=[ [sg.Button('呼叫',size=(10,2),key='-RUN-'),sg.Push(),sg.Button('挂断',size=(10,2),key='-STOP-'),sg.Push(),sg.Button('退出',size=(10,2),key='-EXIT-')] ] col1=sg.Column([[sg.Frame('设置:',layout_basic,size=(900,140))],[sg.Frame('操作:',layout_action,size=(900,80))]]) #绘制版权所有信息,xxx内容可以自定义修改 layout=[[sg.vtop(col1)],[sg.Push(),sg.Text('@Copyrightxxxx.',font='楷体12'),sg.Push()]] #绘制工具的栏 window=sg.Window('MakecallV1.0.0',layout,auto_size_text=True,size=(1000,300),finalize=True,enable_close_attempted_event=True) returnwindow3.呈现的结果如下1.可以根据需要设置网络类型,比如2G,3G,4G,5G等等2.可以自定义呼叫的号码,且支持多个号码3.支持呼叫时间的自定义4.支持循环次数的自定义 遇到的问题一开始通过adb命令去切换网络时,无论如何都切换不成功;即使切换后开关飞行模式也无法生效,最后发现需要重启设备方可生效。这里贴一下ADB切换网络类型的命令,供参考:设置网络类型:settingsputglobalpreferred_network_mode+ 网络类型枚举值获取网络类型:settings get globalpreferred_network_mode各个制式的网络类型枚举值如下: /*NETWORK_MODE_*Seeril.hRIL_REQUEST_SET_PREFERRED_NETWORK_TYPE*/intNETWORK_MODE_WCDMA_PREF=0;/*GSM/WCDMA(WCDMApreferred)*/intNETWORK_MODE_GSM_ONLY=1;/*GSMonly*/intNETWORK_MODE_WCDMA_ONLY=2;/*WCDMAonly*/intNETWORK_MODE_GSM_UMTS=3;/*GSM/WCDMA(automode,accordingtoPRL)intNETWORK_MODE_CDMA=4;/*CDMAandEvDo(automode,accordingtoPRL)intNETWORK_MODE_CDMA_NO_EVDO=5;/*CDMAonly*/intNETWORK_MODE_EVDO_NO_CDMA=6;/*EvDoonly*/intNETWORK_MODE_GLOBAL=7;/*GSM/WCDMA,CDMA,andEvDo*/intNETWORK_MODE_LTE_CDMA_EVDO=8;/*LTE,CDMAandEvDo*/intNETWORK_MODE_LTE_GSM_WCDMA=9;/*LTE,GSM/WCDMA*/intNETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA=10;/*LTE,CDMA,EvDo,GSM/WCDMA*/intNETWORK_MODE_LTE_ONLY=11;/*LTEOnlymode.*/intNETWORK_MODE_LTE_WCDMA=12;/*LTE/WCDMA*/总结总结下来就是ADB命令可以做很多事情,前提是需要找到相应的ADB指令,这就需要对Android有一定的了解!有问题的伙伴可以直接加我WX:xgh321324 进行技术讨论!
|
|