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

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

相关文章

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS