Python + adb 实现打电话功能

前言

其实很多年前写过一篇python打电话的功能,链接如下:

Python + twilio 实现打电话和发短信功能_自动发短信代码-CSDN博客

今天由于工作需要,又用python写了个关于打电话的小工具,主要是通过ADB方式实现的

实现过程

1.先利用adb指令封装几个常用的方法

具体的含义可以看注释,注释写的很清楚

	def make_a_call(self, phoneNumber):# 拨打电话,只需传入目标电话号码即可phoneNumber = int(phoneNumber)# 执行adb指令去拨打电话proc = Utils.execute_adb_command('adb shell am start -a android.intent.action.CALL -d tel:{:d}'.format(int(phoneNumber)))resp = proc.stdout.read()logging.info('Calling {:d} ...'.format(phoneNumber))def answer_a_call(self):# 接听电话的函数# 先获取一下当前通话状态state = self.get_call_state()# 如果状态时振铃,那么接听if state == CallState.RING:Utils.execute_adb_command('adb shell am start -a android.intent.action.ANSWER')logging.info('Have answered a call')else:logging.info('No call incoming')def get_call_state(self):# adb shell 后的命令用双引号,否则执行出错!!!!proc = Utils.execute_adb_command('adb shell "dumpsys telephony.registry|grep \"mCallState\""')resp = proc.stdout.read()  # 读取命令执行的结果state = str(resp).splitlines()[-1].split('=')[-1]  # 从返回内容中取出状态字符串# 返回通话状态return Utils.to_enum(int(state), CallState)def hang_up_a_call(self):# 执行adb 指令去挂掉电话# 先查询一下当前的状态state = self.get_call_state()# 如果状态时振铃,正在通话中,那么执行挂断,否则log提示if state in [CallState.RING, CallState.CALLING]:proc = Utils.execute_adb_command('adb shell input keyevent 6')logging.info('Have hang up a call')else:logging.info('No call to be hang up')

2.再使用pysimpleGUI库写一个简单的工具界面即可

# 这是绘制界面的函数
def make_window():"""Build a GUI page:return: window"""NetworkType = ['2G', '4G', '5G']def name(name, NAME_SIZE=11):dots = NAME_SIZE - len(name) - 2return sg.Text(name + ' ' + ' ' * dots, size=(NAME_SIZE, 1), justification='r', pad=(0, 0), font='Courier 11')# 绘制设置选项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('@Copyright xxxx.', font='楷体 12'), sg.Push()]]# 绘制工具的标题栏window = sg.Window('Make call V1.0.0', layout, auto_size_text=True, size=(1000, 300), finalize=True, enable_close_attempted_event=True)return window

3.呈现的结果如下

1.可以根据需要设置网络类型,比如2G,3G,4G,5G等等

2.可以自定义呼叫的号码,且支持多个号码

3.支持呼叫时间的自定义

4.支持循环次数的自定义

 遇到的问题

一开始通过adb命令去切换网络时,无论如何都切换不成功;即使切换后开关飞行模式也无法生效,最后发现需要重启设备方可生效。这里贴一下ADB切换网络类型的命令,供参考:

设置网络类型:settings put global preferred_network_mode + 网络类型枚举值

获取网络类型:settings get global preferred_network_mode

各个制式的网络类型枚举值如下:
 


/* NETWORK_MODE_* See ril.h RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE */
int NETWORK_MODE_WCDMA_PREF = 0; /* GSM/WCDMA (WCDMA preferred) */
int NETWORK_MODE_GSM_ONLY   = 1; /* GSM only */
int NETWORK_MODE_WCDMA_ONLY  = 2; /* WCDMA only */
int NETWORK_MODE_GSM_UMTS   = 3; /* GSM/WCDMA (auto mode, according to PRL)
int NETWORK_MODE_CDMA       = 4; /* CDMA and EvDo (auto mode, according to PRL)
int NETWORK_MODE_CDMA_NO_EVDO   = 5; /* CDMA only */
int NETWORK_MODE_EVDO_NO_CDMA   = 6; /* EvDo only */
int NETWORK_MODE_GLOBAL   = 7; /* GSM/WCDMA, CDMA, and EvDo*/                                            
int NETWORK_MODE_LTE_CDMA_EVDO  = 8; /* LTE, CDMA and EvDo */
int NETWORK_MODE_LTE_GSM_WCDMA  = 9; /* LTE, GSM/WCDMA */
int NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = 10;
/* LTE, CDMA, EvDo, GSM/WCDMA */
int NETWORK_MODE_LTE_ONLY     = 11; /* LTE Only mode. */
int NETWORK_MODE_LTE_WCDMA  = 12; /* LTE/WCDMA */

总结

总结下来就是ADB命令可以做很多事情,前提是需要找到相应的ADB指令,这就需要对Android有一定的了解!

有问题的伙伴可以直接加我WX:xgh321324  进行技术讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机图形学入门02:线性代数基础

1.向量(Vetors) 向量表示一个方向,还能表示长度(向量的摸)。一般使用单位向量表示方向。 向量加减:平行四边形法则、三角形法则。比卡尔坐标系描述向量,坐标直接相加。 1.1向量点乘(…

图片怎么批量重命名从1到50?这3个方法一键改名

图片怎么批量重命名从1到50?图片批量重命名从1到50的过程不仅提高了我们处理大量图片文件的效率,还大大简化了命名过程,让我们能更加有条理地管理和存储图片。通过使用各种专业的工具和方法,我们可以轻松实现图片文件的自动化命名…

光纤网络发展(光缆主动监测系统解决方案)

随着光缆网络规模的迅速扩大,如何提高网络运营效益就显得尤为重要。一方面需要及时掌握网络的运行状况,在发生劣化或故障时,能够准确定位,缩短排障历时;同时,一条光缆从设计、施工到维护,积累了…

聊聊异常处理及try-catch-finally块的作用

异常处理(Exceptional Handling),又称为错误处理,是编程语言或计算机硬件中用于处理软件或信息系统中出现的异常状况的一种机制。这些异常状况通常指的是超出程序正常执行流程的某些特殊条件。异常处理提供了处理程序运行时出现的…

服务器上创建搭建gitlab

一、下载与安装 在主目录操作~ 1.使用wget下载 wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-14.0.1-ce.0.el7.x86_64.rpm 可以在开源软件镜像站选择合适的版本,版本不同页面菜单会稍有差异,此次选…

新人学习笔记之(函数1)

一、函数的概念 1.在JS里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用 2.虽然for循环语句也能实现一些简单的重复操作,但是比较有局限性,此时我们就可以使用JS中的函数 3.函数:就是…

MongoDB CRUD操作:投影Project详解

MongoDB CRUD操作:投影Project详解 文章目录 MongoDB CRUD操作:投影Project详解返回文档的全部字段返回指定的字段和_id字段不输出_id字段指定排除的字段返回内嵌文档中的指定字段禁止内嵌文档中的特定字段数组中内嵌文档的投影聚合表达式的投影字段 默认…

拉取代码报错: SSL certificate problem: self signed certificate

问题描述: 使用SmartGit工具clone项目时,弹出框提示信息为“XXXX,SSL certificate problem: self signed certificate” 问题分析: 提示信息为SSL认证失败,可以关闭SSL的认证 解决方案: 在windows的命…

【Git】Git命令

原文链接:https://github.com/Wscats/CV/issues/31 新建 创建一个新的 git 版本库。这个版本库的配置、存储等信息会被保存到.git 文件夹中 # 初始化当前项目 $ git init# 新建一个目录,将其初始化为Git代码库 $ git init [project-name]# 在指定目录创…

go mod包管理与应用,常见错误排查方法

go mod包管理 go 中 包管理使用go mod 进行包管理 go mod init 项目名称 go mod init myproject_go生成的go.mod中有 module myproject_go 创建目录go_service 其下有两个go文件,go_request.go go_write.go . 根目录下有main.go入口文件。于是项目结构类似于&…

10.时间片调度

一、简介 时间片调度主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每 一次系统时钟节拍到的时候切换任务,也就是说 CPU 轮流运行优先级相同的任务,每个任务运 行的时间就是一个系统时钟节拍。 二、相关实…

Percona Toolkit 神器全攻略(实用类)

Percona Toolkit 神器全攻略(实用类) Percona Toolkit 神器全攻略系列共八篇,前文回顾: 前文回顾Percona Toolkit 神器全攻略 全文约定:$为命令提示符、greatsql>为GreatSQL数据库提示符。在后续阅读中,…

Linux完整版命令大全(十四)

od(octal dump) 功能说明&#xff1a;输出文件内容。语  法&#xff1a;od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]补充说明&…

【吊打面试官系列】Java高并发篇 - 怎么唤醒一个阻塞的线程?

大家好&#xff0c;我是锋哥。今天分享关于 【怎么唤醒一个阻塞的线程&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 怎么唤醒一个阻塞的线程&#xff1f; 如果线程是因为调用了 wait()、sleep()或者 join()方法而导致的阻塞&#xff0c;可以中断线程&#xf…

2024年618网购节各大电商超级红包二维码集合

一年一度的电商618网购节又要来了&#xff0c;下面收集了淘宝/京东/拼多多的618红包二维码&#xff0c;手机扫描或识别即可每天领红包&#xff0c;可参考好物分享中的商品下单&#xff1a; 淘宝618超级红包&#xff1a;即日起至2024.6.10&#xff0c;每天可领一次 京东618无门…

【强化学习05】从Q学习到深度Q学习

深度Q学习&#xff08;Deep Q-Learning, DQN&#xff09;是将深度学习与Q学习结合起来的一种强化学习方法&#xff0c;利用神经网络来近似Q值函数&#xff0c;解决传统Q学习在大规模或连续状态空间中的局限性。下面详细解释DQN的机理。 背景知识 Q学习 Q学习是一种值函数法&…

数据分析 - 合并查询

在数据分析中&#xff0c;合并查询&#xff08;Merge Query&#xff09;是一个重要的操作&#xff0c;它允许用户将两个或多个数据集&#xff08;通常是表格&#xff09;基于某些共同属性&#xff08;如ID&#xff09;进行合并&#xff0c;从而获取更丰富的数据视图。以下是关于…

vue+springboot实现echarts数据图统计

①vue项目修改配置 安装依赖&#xff1a; npm i echarts -S 修改路由index.js&#xff1a; import Vue from vue import VueRouter from vue-router import Manager from ../views/Manager.vue // 解决导航栏或者底部导航tabBar中的vue-router在3.0版本以上频繁点击菜单报错…

STL详解(五)——list的使用

文章目录 list的介绍list的使用list的定义方式list的插入和删除push_front和pop_frontpush_back和pop_backinserterase list的迭代器使用begin和endrbegin和rend list的元素获取front和back list的大小控制sizeresizeemptyclear list的操作函数sortspliceremoveremove_ifunique…

「光储充放」一体充电站-一文读懂光储充放充电站

“光储充放”一体充电站作为一种储能充电的新形式渐渐走进人们的生活&#xff0c;全国很多地区都开始陆续投放运营“光储充放”一体充电站&#xff0c;今天的这篇文章&#xff0c;就带大家全面了解“光储充放”这一新型充电站。 头图来源 | 视觉中国 01 政策背景 早在2020年…