安卓通话状态监控之挂电话部分

2024-09-04 01:32

本文主要是介绍安卓通话状态监控之挂电话部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

挂电话部分

在app/phone下

<span style="font-size:18px;"> void handleOnscreenButtonClick(int id) {if (DBG) log("handleOnscreenButtonClick(id " + id + ")...");switch (id) {// Actions while an incoming call is ringing:case R.id.endAllCallsButton:PhoneUtils.hangupAll(mPhone);break;default:Log.w(LOG_TAG, "handleOnscreenButtonClick: unexpected ID " + id);break;}mApp.pokeUserActivity();
</span></span>

这里的case R.id.endAllCallsButton:就是挂掉所有电话

PhoneUtils.hangupAll(mPhone);关键之一就在于找这个mphone从哪来的

<span style="font-size:18px;">void setPhone(Phone phone, CallManager cm) {if (phone != mPhone || mCM != cm) {mCM = cm;mPhone = phone;if (DBG) log("switching to phone: " + phone.getPhoneName());if (mInCallControlState != null) {mInCallControlState.setCM(cm);}if (mManageConferenceUtils != null) {mManageConferenceUtils.setCM(cm);}}}</span>

整个class里就这个地方初始化了mphone,查找哪里调用了InCallScreen.java

<span style="font-size:18px;"> setPhone(DualPhoneController.getInstance().getActivePhone(), DualPhoneController.getInstance().getActiveCM());</span>


查找getActivePhone()
<span style="font-size:18px;">    Phone getActivePhone() {if (isPrimaryOnSim1()) {return mActiveSimId == ID_SIM_1 ? mApp.phone : mApp.phone2;}return mActiveSimId == ID_SIM_1 ? mApp.phone2 : mApp.phone;}
</span>
查找mApp

<span style="font-size:18px;">private DualPhoneController(PhoneGlobals app) {mApp = app;mCM = app.mCM;mCM2 = app.mCM2;mPrimaryId = Settings.Global.getInt(PhoneGlobals.getInstance().getContentResolver(),Settings.Global.MOBILE_DATA_SIM,TelephonyConstants.DSDS_SLOT_1_ID);}
</span>

查找这个函数被调用的地方
<span style="font-size:18px;"> /* package */ static DualPhoneController init(PhoneGlobals app) {synchronized (NotificationMgr.class) {if (sInstance == null) {sInstance = new DualPhoneController(app);} else {Log.wtf(LOG_TAG, "init() called multiple times!  sInstance = " + sInstance);}return sInstance;}}</span>
所有的问题都在与不论是PhoneGlobals.java还是DualPhoneController.java都在phone这个app内部,而无法在service或者framework里导出

不过在PhoneGlobals.java看到

phone = PhoneFactory.getDefaultPhone();
phone2 = PhoneFactory.get2ndPhone();
最终还是用了service里的方法,所以mphone的追踪到此结束


这个

<span style="font-size:18px;"><span style="font-size:18px;">PhoneUtils的定义在package/apps/phone里</span></span>

<span style="font-size:18px;"><span style="font-size:18px;"> static void hangupAll(Phone phone) {if (phone == null)return ;String[] request = new String[1];request[0] = Integer.toString(OemTelephonyConstants.RIL_OEM_HOOK_STRING_RELEASE_ALL_CALLS);phone.invokeOemRilRequestStrings(request, null);}
</span></span>
这个phone的定义在opt/telephony目录下
这里追踪/frameworks/opt/telephony/src/java/com/android/internal/telephony目录下的ril.java

<span style="font-size:18px;"><span style="font-size:18px;">  public void invokeOemRilRequestStrings(String[] strings, Message response) {RILRequest rr= RILRequest.obtain(RIL_REQUEST_OEM_HOOK_STRINGS, response, mIs2ndRil);if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));rr.mParcel.writeStringArray(strings);send(rr);}</span></span>
从这里看来phone的这个类型非常关键,phone的定义在

/third/frameworks/opt/telephony/src/java/com/android/internal/telephony$

而在eclipse中想导入这个telephony的包,则去看opt/telephony的目录下的android.mk文件

<span style="font-size:18px;"><span style="font-size:18px;">ifeq ($(TARGET_BUILD_JAVA_SUPPORT_LEVEL),platform)LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/java
LOCAL_SRC_FILES := $(call all-java-files-under, src/java) \$(call all-Iaidl-files-under, src/java) \$(call all-logtags-files-under, src/java)LOCAL_SRC_FILES += $(call all-java-files-under, src/com/asus/dsds/base)
ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
LOCAL_SRC_FILES += $(call all-java-files-under, src/com/asus/dsds/qc)
elseifeq ($(INTEL_INGREDIENTS_VERSIONS),true)LOCAL_SRC_FILES += $(call all-java-files-under, src/com/asus/dsds/intel)elseLOCAL_SRC_FILES += $(call all-java-files-under, src/com/asus/dsds/default)endif
endifLOCAL_JAVA_LIBRARIES := voip-common
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := telephony-commoninclude $(BUILD_JAVA_LIBRARY)# Include subdirectory makefiles
# ============================================================
include $(call all-makefiles-under,$(LOCAL_PATH))endif # JAVA platform</span></span>

这里说的
<span style="font-size:18px;"><span style="font-size:18px;">LOCAL_MODULE := telephony-common</span></span>

就是生成的jar的名字

而在out目录下搜索这个包名

find . -name telephony-common*

发现./target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates这个目录下有个classes.jar,将其导入后就发现可以识别phone的类型和callmanager的类型。







<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">public boolean hangupCall() {enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null);if (mCM.hasActiveFgCall()) {return PhoneUtils.hangupActiveCall(mCM.getActiveFgCall());} else if (mCM.hasActiveRingingCall()) {return PhoneUtils.hangupRingingCall(mCM.getFirstActiveRingingCall());} else if (mCM.hasActiveBgCall()) {return PhoneUtils.hangupHoldingCall(mCM.getFirstActiveBgCall());}</span></span></span></span>

从上面的代码里看,一个PhoneUtils和mCM是需要获取,

获取mcm


<span style="font-size:18px;"><span style="font-size:18px;">mCM1 = CallManager.getInstance();
mCM2 = CallManager.getInstance2();</span></span>
获取PhoneUtils

由于并没看到PhoneUtils的定义所以这个类应该是只要包含一个jar包即可使用



这篇关于安卓通话状态监控之挂电话部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

如何在Ubuntu 24.04上部署Zabbix 7.0对服务器进行监控

《如何在Ubuntu24.04上部署Zabbix7.0对服务器进行监控》在Ubuntu24.04上部署Zabbix7.0监控阿里云ECS服务器,需配置MariaDB数据库、开放10050/1005... 目录软硬件信息部署步骤步骤 1:安装并配置mariadb步骤 2:安装Zabbix 7.0 Server

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

使用Python实现实时金价监控并自动提醒功能

《使用Python实现实时金价监控并自动提醒功能》在日常投资中,很多朋友喜欢在一些平台买点黄金,低买高卖赚点小差价,但黄金价格实时波动频繁,总是盯着手机太累了,于是我用Python写了一个实时金价监控... 目录工具能干啥?手把手教你用1、先装好这些"食材"2、代码实现讲解1. 用户输入参数2. 设置无头浏

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展