Android 5.0 Phone 模块介绍

ndroid 5.0 Phone 模块代码结构较上个版本发生了很大变化,这样做的好处是代码易于管理和阅读,脱藕,InCallUI可实现客制化。

本篇主要介绍的内容有以下部分:

1:Android 5.0 Phone 模块代码结构基于上一个版本的改变;

2:Android 5.0 Phone 模块拨号流程与来电流程

3:Android 5.0 Phone 模块主要功能类介绍。

Android 5.0 Phone 模块代码结构基于上一个版本的改变

Android 4.4中Telephony和InCallUI直接通过adil方式进行交互


Android 5.0 中增加了两部分代码 frameworks/base/telecomm和packages/servi
ces/Telecomm,前者负责Phone模块中InCallUI,Telecomm,Telephony三者的交互处理,后者负责Phone模块主要业务的处理,如拨号的预处理,来电的处理,以及与蓝牙设备,有线耳机交互

Android 5.0 Phone 模块拨号流程与来电流程


图形分析:

1:在DialpadFragment.java中使用Intent启动activity:包含信息有Intent.ACTIO

N_CALL,Uri(处理过的号码格式),TelecomManager.EXTRA_START_CALL_WITH_VIDEO_

STATE(通话模式:视频or音频),PhoneConstants.EXTRA_CALL_ORIGIN(表示拨出号码的

activity,DialtactsActivity之外的都为null),TelecomManager.EXTRA_PHONE_

ACCOUNT_HANDLE(注册的账户)。

2:packages/services/Telecomm:CallActivity.java被启动,在其成员方法中

processOutgoingCallIntent(),sendBroadcastToReceiver()主要判断了ip拨号是否符合规则,是否具有拨号的权限。符合要求的会继续发出广播

3:CallReceiver是个BroadcastReceiver,收到广播后使用Intent中包含的数据信息(号码,账户)作为参数,调用:


创建了Call对象。该类存储了建立一个call时相关的数据,如CallState,GatewayInfo,Pho

neAccountHandle等。如果创建的Call对象不为null,则进一步在NewOutgoingCallIntent

Broadcaster中处理。

4:NewOutgoingCallIntentBroadcaster的processIntent()中主要对号码进行了判断处理,语音信箱,紧急号码。在其方法broadcastIntent()中发出

Intent.ACTION_NEW_OUTGOING_CALL 这样的广播,由NewOutgoingCallBroadcas

tIntentReceiver接着处理。

5-6:CallsManager的placeOutgoingCall()方法中处理是否打开speaker,把call对象添加到mCalls列表中,调用Call中方法startCreateConnection()创建连接。

7-9:在CreateConnectionProcessor的方法attemptNextPhoneAccount()中获取了ConnectionServiceWrapper对象,调用:

service.createConnection(mCall, new Response(service));进一步创建连接,在

createConnection中有:
mServiceInterface.createConnection(call.getConnectionManagerPhoneAccount(),callId,new ConnectionRequest(call.getTargetPhoneAccount(),
call.getHandle(),extras,call.getVideoState()),call.isIncoming());
mServiceInterface 对象类方法在frameworks/base/Telecomm中实现,这里使用aidl方式实现通信

10-11:frameworks/base/Telecomm:ConnectionService内部实现了IConnectionService.Stub(),这里会调用其实现的方法createConnection(),在该方法内部,调用onCreateOutgoingConnection()会进一步调用到packages/services/Telephony中的方法进行向RIL.java中进行拨号,同时返回一个Connection,创建完毕后调用mAdapter.handleCreateConnectionComplete()对Connection进行处理。
12:ConnectionServiceAdapter与ConnectionServiceWrapper的交互通过aidl方式进行,ConnectionServiceWrapper内部实现了 IconnectionServiceAdapter.Stub()
在ConnectionServiceWrapper中运行handleCreateConnectionComplete()方法。
13-16:对创建的Connection进行一系列的处理,主要运用到接口的实现调用,在类Call中handleCreateConnectionSuccess()方法使用Connetion对象的信息对Call相关状态进行设置。同时通知监听者CallsManager
17-18:在CallsManager中调用 addCall(call),进一步调用监听者InCallController的onCallAdded().在onCallAdded()中调用IInCallService.stub对象,这里使用aidl方式,在frameworks/base/telecomm:中InCallService内部实现了IInCallserice.stub

19:在InCallService中会调用Phone对象的internalAddCall()方法,在Phone中会调用内部接口实现者的实现的方法:onCallAdded(this, call);在Packages/apps/InCallUI:
中CallList实现了该接口,这里会启动通话界面。

来电流程:

:packages/services/Telephony:在PstnIncomingCallNotifier.java中注册了对来电的监听:

mPhoneBase.registerForNewRingingConnection(mHandler,EVENT_NEW_RINGING_CONNECTION, null);

来电时,从收到的数据中获取frameworks/opt/.../Connection对象,进一步Connection中获取frameworks/opt/..../Call,判断Call对象不为null,state为ringing时,进一步调用方法sendIncomingCallIntent(),对Connection中数据进行解析封装,使用Bundle

对象extras.putParcelable(TelephonyManager.EXTRA_INCOMING_NUMBER, uri);

调用TelecommManager方法:addNewIncomingCall(),将extras作为参数传入。

2:在TelecommManager中,判断服务当前是否处于连接状态,如果一连接则调用

ItelecomService.Stub的实现对象,即TelecomServiceImpl的方法:

addNewIncomingCall(),传入参数为:PhoneAccountHandle对象,Bundle 对象。

3:在TelecomServiceImpl的方法addNewIncomingCall()中所做处理如下:

  

4-6:4-6:CallActivity被启动后,通过判断Intent中action,发广播给CallReceiver。

在CallReceiver中对Intent进行简单的处理(判断PhoneAccountHandle是否为null)后调用CallsManager().processIncomingCallIntent(),在该方法中创建Call对象,然后使用Call对象建立连接。

7-8:在Call的startCreateConnection方法中创建CreateConnectionProcessor对象后,调用该对象的process()方法,在process()方法中进一步调用attemptNextPh

oneAccount()方法。在attemptNextPhoneAccount()方法中使用ConnectionSer

viceWrapper的成员方法createConnection()。

9-11:ConnectionServiceWrapper中createConnection()方法实现了接口BindCallback()

在实现的接口方法中调用IConnectionService对象来创建连接。这里使用adil的方式,最终会在ConnectionService创建连接,在createConnection()方法中,根据来电标志执行:onCreateIncomingConnection,创建了一个android.telecom.Connection对象。接着调用ConnectionServiceAdapter的handleCreateConnectionComplete()方法对创建好的Connection对象进行数据处理。这里使用adil方式,实际的处理交给了IConnectionServiceAdapter的实现者,ConnectionServiceWrapper的内部类Adapter。

12-15:经过一系列的接口方法调用后在Call的方法handleCreateConnectionSuccess()获取Connection的成员变量,设置phone当前的相关状态。然后启动一个延时线程,在该线程中调用接口方法onSuccessfulIncomingCall(),CallsManager实现了该接口方法。

16-17:在CallsManager的方法onSuccessfulIncomingCall()中有addCall(),在addCa

ll()中调用接口方法onCallAdded(),InCallController中实现了该接口方法。onCallAdde

d()中继续使用adil方式调用IInCallService的方法addCall()。

18:InCallService内部类实现了接口IInCallService.Stub,在addCall()中直接调用了Phone类的方法internalAddCall(),在该方法中创建了android.telecom.Call对象,调用接口方法onCallAdded(),将android.telecom.Call对象交给接偶实现者处理。CallList内部实现了该接口,处理过程中加载来电界面。

Android 5.0 Phone 模块主要功能类介绍


该图大致概括了Phone模块内部交互的关系,包括InCallUI,services/Telephony,service

s/Telecomm,frameworks/base/telecomm。

1:InCallUI部分:

上图中CallList,TelecomAdapter这两个类在InCallUI中,CallList内部实现了android.telecomm.Phone.Listener接口,负责与 frameworks/base/teleco

mm的交互,即负责通话界面的处理。TelecomAdapter负责通话中一些操作的处理,调用frameworks/base/telecomm中的类方法进行处理,如录音,合并通话,保持通话等。

2:services/Telephony部分:

TelephonyConnectionService,PstnIncomingCallNotifier 这两个类在services/Tel

ephony中,TelephonyConnectionService继承了ConnectionService,在拨号和来电是用来处理与frameworks/opt/telephony交互部分, PstnIncomingCallNotifier注册了对来电的监听,来电时负责和frameworks/base/telecomm交互。

3:services/Telecomm部分:

该部分负责了Phone模块主要业务的处理,CallsManager管理与Call相关的业务处理,其构造方法中创建了铃声,有线耳机,蓝牙等相关的类对象,在处理Phone模块业务时起到了桥梁的作用。

CallActivity,在拨号和来电时会被创建,主要用来对Intent进行简单的处理判断。

TelecomServiceImpl,开机自动加载的一个服务,实现ITelecomService.Stub接口,来电时被TelecomManager调用,与frameworks/base/telecomm交互。

ConnectionServiceWrapper,负责services/Telecomm与frameworks/base/telecomm

交互,实现了IConnectionServiceAdapter.Stub,提供代理给frameworks/base/teleco

mm,同时绑定IConnectionService.Stub实现者ConnectionService,用来和framework

s/base/telecomm交互。

4:frameworks/base/telcomm部分:
ConnectionService继承了Service,内部实现IConnectionService.Stub接口,是fram

eworks/base/telcomm部分的核心类,在来电或拨号时创建android.telecom.Connect

ion对象用来保存通话相关信息,随后将信息写进ParcelableConnection对象中交给Conne

ctionServiceWrapper处理。

InCallService同样继承了Service,其内部实现了IInCallService.Stub,用来处理通话界面相关事务,IncallController调用IInCallService.Stub代理完成对InCallUI的更新。

android.telecom.Phone,内部接口在InCallUI中被实现,在Phone状态发生变化时用于和InCallUI交互。

android.telecom.Call:在InCallUI中使用该对象对某个通话进行操作,如接听,挂断,拒接,合并通话,保持通话等。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值