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

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

相关文章

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

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

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |