`
runfeel
  • 浏览: 936122 次
文章分类
社区版块
存档分类
最新评论

android拨号的源码分析

 
阅读更多

1OutgoingCallBroadcaster.java
点击拨号盘拨打按钮后,进入通话的Phone包。此时首先进入的函数是OutgoingCallBroadcaster.java,该类是一个Activity。
由activity的生命周期可知,第一次进入时应调用onCreate()函数。(在该类中也只实现了这个函数。)解析一下这个函数:
1.1)首先获取Intent对象,获取拨出的号码。
1.2)接着判断号码是否为紧急号码,如果是紧急号码,将callNow变量赋值为true,启动InCallScreen,并发送广播。而在receiver里面判断callNow为ture就直接finish,而不再重复启动InCallScreen;如果不是紧急号码,将callNow变量赋值为false,发送广播“Intent.ACTION_NEW_OUTGOING_CALL”。

2OutgoingCallReceiver.java
广播发送后OutgoingCallReceiver将会收到该息。该类是一个内部类,在类OutgoingCallBroadcaster里面,作用是接收OutgoingCallBroadcaster发送的广播,判断是否已经启动InCallScreen。没有启动的话就进行一些初始化,如:对OTA进行初始化。接收到广播之后,从Intent里面取出电话号码及其URi。然后,设置Intent为ACTION_CALL,并带上号码和uri。启动InCallScreen。关闭该Activity。
OTA:Over-the-Air Technology空中下载技术,是通过移动通信(GSM或CDMA)的空中接口对SIM卡数据及应用进行远程管理的技术。空中接口可以采用WAP、GPRS、CDMA1X及短消息技术。OTA技术的应用,使得移动通信不仅可以提供语音和数据服务,而且还能提供新业务下载。
GSM:Global System for Mobile Communications,中文为全球移动通讯系统,俗称"全球通"。
CDMA:Code Division Multiple Access,又称码分多址,是在无线通讯上使用的技术,CDMA允许所有的使用者同时使用全部频带(1.2288Mhz),并且把其他使用者发出的讯号视为杂讯,完全不必考虑到讯号碰撞 (collision) 的问题。CDMA的优点包括:CDMA中所提供的语音编码技术,其通话品质比目前的GSM好,而且可以把用户对话时周围环境的噪音降低,使通话更为清晰。

3InCallScreen.java
该类extends了Acitivity,并且implements了OnClickListener,OnTouchListener和OnQueryCompleteListener。该类主要是负责通话的那一个界面,并且还负责菜单项各种按键事件和触摸时间的处理。同时本类还复写的finish()方法,所以一般不会被finish掉,调用这个方法时它又把自己放回栈中。InCallScreen可以接收这个Intent并启动。
3.1)onCreate(第一次)
3.1.1)callScreenOnCreate获得通话界面被创建的时间。
3.1.2)PhoneApp唤醒后台的服务程序。
3.1.3)判断当前的通话状态(IDLE =没有通话行为,RINGING =正在通话或呼叫等待,OFFHOOK = The phone is off hook. At least one call exists that is dialing, active or holding and no calls are ringing or waiting.),如果正在通话,不会出现键盘锁。接着设置mPhone and mForegroundCall/mBackgroundCall/mRingingCall。
3.1.4)getBluetoothHandsfree设置蓝牙耳机,如果存在蓝牙耳机,则安装该设备。
3.1.5)initInCallScreen加载各种view组建。
3.1.6)对通话的各种状态进行广播。(registerForPreciseCallStateChanged,registerForDisconnect,registerForMmiInitiateregisterForMmiComplete,registerForCallWaiting,registerForSuppServiceFailed,registerForCdmaOtaStatusChange)
3.1.7)internalResolveIntent判断是否使用了OTA技术,通过该判断设置通话界面的样式。
3.1.8)callScreenCreated记录通话界面创建完成后的时间
3.2)onNewIntent(非第一次)。
我们重新启动一个Intent时调用该函数。由于我们围绕唯一的一个InCallScreen实例来完成通过的这个过程,那么除了第一次被创建的InCallScreen,只要有来电或者去电,该程序就会发生。如果InCallScreen已经在前台,该程序也会发生。
3.2.1)setIntent保存该Intent,以至于将来我们可以获得该intent。
3.2.2)internalResolveIntent
3.3)onResume
进行一些初始化操作,如:获取一个PhoneApp对象,解开Keyguard Notification的statusBar给Disable。还内置了一个Handler可以回调处理一些事件,比如:PHONE_STATE_CHANGED,PHONE_DISCONNECT,EVENT_HEADSET_PLUG_STATE_CHANGED。同时有一个独立的BroadcastReceiver处理ACTION_HEADSET_PLUG,比如插入耳机等。
3.3.1)首先对锁屏情况下的来电除了处理。
3.3.2)disableStatusBar当正在通话界面时,使得状态栏可用。
3.3.3)setIgnoreTouchUserActivity忽略通话过程中无意的触碰事件,使得这些无意的触碰不会阻止设备进入休眠。
3.3.4)registerReceiver监听广播
3.3.5)startDialerSession当在前台是,保持一个dialer session。首先判断时候需要播放本地铃声,如果需要,则判断双音多频是否可用,如果可用,则创建一个声音播放器。
3.3.6)isBluetoothAudioConnected做一个是否蓝牙连接的判断。
3.3.7)如果是cdma通话,则初始化OTA状态,进而如果是采用了OTA,则设置InCallScreenMode为OTA通话模型。
3.3.8)clearDisconnected在检查该通话状态之前,切断其他网络连接。
3.3.9)syncWithPhoneState同步通话界面与Phone的当前状态。如果没有同步成功,则dismissAllDialogs();结束当前的所以通话,endInCallScreenSession();关闭通话界面的显示。
3.3.10)updateWakeState设置基于当前Phone的唤醒状态和屏幕超时,以及通话界面的当前状态。
3.3.11)enableTouchLock当onresume时“触摸锁“叠加是不可见的,尤其是这个检查可确保用户通话按MUNU来唤醒屏幕后将不会被锁。但如果拨号盘是打开的,而又需要通话计时,则造就了“触摸锁“覆盖。

4Profiler.java
该类对通话各个时间点进行记录。
static long sTimeCallScreenRequested;//通话界面被请求的时间
static long sTimeCallScreenOnCreate;//通话界面被创建的时间
static long sTimeCallScreenCreated;//通话界面创建完成后的时间
static long sTimeIncomingCallPanelRequested;//正在通话时,通话界面被请求的时间
static long sTimeIncomingCallPanelOnCreate;//正在通话时,通话界面被创建的时间
static long sTimeIncomingCallPanelCreated;//正在通话时,通话界面创建完成后的时间

5PhoneUtils.java
负责Phone对象的生成,主要调用phone.getForegroundCall(),phone.getBackgroundCall(),phone.getRingingCall(),phone.dial()。
5.1)placeCall(Phone phone, String number, Uri contactRef)
拨打传入的电话号码,该函数被InCallScreen中的placeCall调用。
参数phone手机对象;参数number用户要拨打的号码;参数contactRef要么是“tel:”,要么是“content://contacts”,取决于通话初始化,该参数引发呼叫;返回CALL_STATUS_DIALED,CALL_STATUS_DIALED_MMI,或CALL_STATUS_FAILED。
5.2)placeCallVia(Context context,Phone phone,String number,Uri contactRef,Uri gatewayUri)
使用第三方提供的网关拨打号码,该函数被InCallScreen中的placeCall调用。如果电话号码是紧急号码,GSM MMI码或者CDMA码则不能被呼叫。如果连接成立,这个方法发出一个同步调用阻止查询来电信息,使本地采用异步查询。
参数phone手机对象;参数context执行CallerInfo查询;参数number用户要拨打的号码,如果号码不能建立连接,则仅被用于建立电话卡,并更新通话记录;参数contactRef要么是“tel:”,要么是“content://contacts”,该参数引发呼叫;参数gatewayUri用于设置连接的地址;返回CALL_STATUS_DIALED或CALL_STATUS_FAILED。

6PhoneApp.java
该类是一个普通的java类,主要负责Phone对象顶层应用的生成。这是一个虚拟的Phone对象,它从framework层取得一个Phone对象。该类继承自Application,同时能常驻内存,他和PhoneUtils一起处理电话操作。在oncreate方法里面进行各种全局的初始化:获取Phone对象 NotificationMgr对象,PowerManager对象,SimCard对象等。同时内置的Handler可以回调处理各种事件,如:EVENT_SIM_ABSENT,EVENT_SIM_NETWORK_LOCKED,EVENT_UPDATE_INCALL_NOTIFICATION等。

7CallNotifier.java
监听Phone状态的改变和来自telephony层各种事件,并触发任何有关的UI行为(如开始的铃声和来电的用户界面,打在通话音,更新通知,写呼叫记录条目等)。
7.1)在构造函数中,实现
mPhone.registerForNewRingingConnection(this, PHONE_NEW_RINGING_CONNECTION, null);/*当有新来电或等待连接时Notifies。收到的讯息是:Message.obj将是一个AsyncResult,AsyncResult.userObj=obj,AsyncResult.result=a Connection。因为这个消息已经过时,所以通过检测Connection.isRinging()以确保连接有效。如果Connection.isRinging()为true,那么Connection.getCall()==Phone.getRingingCall()*/
mPhone.registerForPreciseCallStateChanged(this, PHONE_STATE_CHANGED, null);/*为通话状态的改变注册notification。通过调用PreciseCallState以获取更准确的通话状态。*/
mPhone.registerForDisconnect(this, PHONE_DISCONNECT, null);/*当由于本地或远程电话挂断或者出现错误挂断通话时Notifies。收到的讯息是:Message.obj will be an AsyncResult,AsyncResult.userObj = obj,AsyncResult.result = a Connection object that is no longer connected.*/
mPhone.registerForUnknownConnection(this, PHONE_UNKNOWN_CONNECTION_APPEARED, null);/*当以前未跟踪non-ringing/waiting连接时Notifies。这可能是由于一些其他实体(如SIM卡应用)发起呼叫。*/
mPhone.registerForIncomingRing(this, PHONE_INCOMING_RING, null);/*当有来电话响铃时Notifies。收到的讯息是:Message.obj will be an AsyncResult,AsyncResult.userObj = obj,AsyncResult.result = a Connection.*/
另外如果是CDMA通讯类型,还执行:
mPhone.registerForCdmaOtaStatusChange(this, EVENT_OTA_PROVISION_CHANGE, null);/*当CDMA OTA提供者位置改变时注册notification*/
mPhone.registerForCallWaiting(this, PHONE_CDMA_CALL_WAITING, null);/*当CDMA呼叫等待时注册notification*/
mPhone.registerForDisplayInfo(this, PHONE_STATE_DISPLAYINFO, null);/*为来自网络显示信息通知注册。Message.obj将包含一个AsyncResult。AsyncResult.result将是一个SuppServiceNotification实例。*/
mPhone.registerForSignalInfo(this, PHONE_STATE_SIGNALINFO, null);/*为来自网络的信号信息通知注册。Message.obj将包含一个AsyncResult。AsyncResult.result将是一个SuppServiceNotification实例。*/
mPhone.registerForInCallVoicePrivacyOn(this, PHONE_ENHANCED_VP_ON, null);/*当sInCall VoicePrivacy可用时注册notification*/
mPhone.registerForInCallVoicePrivacyOff(this, PHONE_ENHANCED_VP_OFF, null);/*当sInCall VoicePrivacy不可用时注册notification*/
mPhone.registerForCdmaFwdBurstDtmf(this, PHONE_CDMA_FWD_BURST_DTMF, null);/*为 CDMA Forward Burst DTMF的事件通知设置处理程序*/
mPhone.registerForCdmaFwdContDtmfStart(this, PHONE_CDMA_FWD_CONT_DTMF_START, null);/*为 CDMA Forward Burst DTMF启动的事件通知设置处理程序*/
mPhone.registerForCdmaFwdContDtmfStop(this, PHONE_CDMA_FWD_CONT_DTMF_STOP, null);/*为 CDMA Forward Burst DTMF停止的事件通知设置处理程序*/
如果是GSM类型,则执行:
mPhone.registerForRingbackTone(this, PHONE_RINGBACK_TONE, null);/*当带外回铃音(专业术语CRBT:COLOR RING BACK TONE,回铃音定义:当别人打电话给您时,他(她)听到的声音叫做回铃音。回铃音是指拨打电话的呼叫方所听到的对方电话的声音,当拨通电话时听到通话音,通常是长音;而当对方占线时则听到忙音,声音短促,有时,忙音会变成人声语音提示。)时Notifies。收到的讯息是:Message.obj将是一个AsyncResult,AsyncResult.userObj=obj,AsyncResult.result=true表示开始播放回铃音;=false表示停止。*/
mPhone.registerForResendIncallMute(this, PHONE_RESEND_MUTE, null);/*为复位上行静音状态成上行音频注册处理程序。*/
7.2)整个类由函数handleMessage串起来。

分享到:
评论

相关推荐

    Android 源码分析-打电话和发短信

    "Android 源码分析-打电话和发短信" Android 源码分析-打电话和发短信是 Android 开发者中的一项重要内容。本文将对 Android 源码中的打电话和发短信机制进行深入分析,并对相关知识点进行总结。 一、ITelephony ...

    android电话拨号源码

    这里我们将深入探讨“android电话拨号源码”所涵盖的关键知识点,包括电话管理、拨号器UI设计、通话流程以及源码分析。 首先,电话管理是Android系统中的重要部分,它主要由TelephonyManager类负责。...

    Android 多功能拨号盘源码.zip

    通过分析和学习这个源码,开发者可以了解到Android应用的生命周期管理、UI设计、数据访问、权限控制以及事件处理等多个方面的知识。同时,对于想要开发自己的拨号盘应用或者增强现有拨号功能的开发者来说,这是一个...

    Android的电话拨号器源码.zip

    通过分析这个电话拨号器的源码,开发者不仅可以了解Android应用的基本架构,还能深入理解系统服务的交互、权限管理以及性能优化等关键知识点。这对于想要开发自己的拨号应用或者进行系统级开发的开发者来说,是一份...

    Android例子源码实现定时拨号功能

    在Android平台上,开发一个能够定时拨打电话的功能是一个实用且有趣的实践。这个例子源码的实现主要涉及以下几个关键知识点: 1. **BroadcastReceiver**...同时,理解和分析源码也能提升对Android系统工作原理的理解。

    Android 多功能拨号盘源码.rar

    通过分析和学习这个Android多功能拨号盘源码,开发者可以深入了解Android应用开发的多个方面,包括UI设计、数据访问、事件处理、系统服务的利用等,这对于提升Android开发技能大有裨益。同时,源码中还可能包含了...

    Android源码 phone 拨号器 调用android内置拨号功能的简单实现

    3. **源码分析**: Android源码中,拨号器的实现主要在`com.android.phone`包下。`DialerActivity`是拨号器的主要入口,它处理用户的输入并调用电话服务。在源码中,你会看到`DialerActivity`如何响应Intent事件,...

    android 3G拨号chat源码文件

    4. **源码分析**: - 分析Chat源码可以帮助我们理解拨号流程的底层实现,包括如何构造和发送AT命令,如何处理响应,以及如何管理PPP连接的建立和断开。 - 源码中可能包含错误处理机制,网络状态检测,以及与其他...

    android电话拨号器源代码

    这份"android电话拨号器源代码"提供了深入理解Android拨号器工作原理的机会,对于Android开发者,尤其是那些对系统级应用开发感兴趣的开发者来说,是一个宝贵的参考资料。 首先,我们要了解Android拨号器的基本结构...

    android开发发送短信与后台拨号源码程序案例及apk程序

    在Android开发中,发送短信和后台拨号是两个重要的功能,常常被用于...通过分析和运行提供的源码,开发者可以更深入地理解Android系统的API使用,以及如何处理权限请求,这对于任何Android开发者的成长都是极其宝贵的。

    android PPOE拨号实现

    4. **源码分析**: 压缩包中的`pppoe-android-app-master`很可能是该项目的源代码仓库。通常,这样的项目会包含以下部分: - 主应用界面:用于输入用户名和密码,以及启动/停止拨号操作。 - PPOE服务:处理实际的...

    电话拨号器源码

    在`06_电话拔号器.avi`这个视频文件中,可能涵盖了以上概念的实际演示和详细解释,包括源码分析、关键函数的调用流程,以及如何在Android Studio环境中运行和调试电话拨号器应用。通过观看和实践,学习者能够更直观...

    [Android]电话拨号器

    此外,源码分析可以帮助我们更深入地理解电话拨号器的工作原理。例如,查看AOSP(Android Open Source Project)中的电话服务和拨号器应用代码,可以了解Android系统是如何处理拨号请求、建立通话以及管理通话状态的...

    android_8.1 Dialer源码

    这个源码分析将深入探讨Dialer的内部机制,包括拨打、接听、挂断电话,联系人管理,以及与系统服务如通话状态监听、电话簿集成等方面的知识。 首先,Android 8.1的Dialer应用主要由以下几个组件构成: 1. **...

    Android 5.0拨号盘 Dialer源码

    在Android系统中,拨号盘(Dialer)是用户与...通过分析Android 5.0拨号盘Dialer的源码,我们可以了解到Android系统中电话功能的实现细节,这对于开发者来说,无论是进行应用开发还是系统级优化,都是非常宝贵的知识。

    Android应用源码九宫格手势快速拨号项目

    3. **Android源码分析**: 分析源码对于理解应用的工作原理和优化性能至关重要。开发者可能需要查看`MainActivity`、`Adapter`、`GestureDetector`相关类以及XML布局文件等,理解它们之间的交互。源码中可能包含了...

    Android5.0 Dialer拨号盘源码

    这三个文件夹分别代表了Android拨号应用的不同模块: 1. **ContactsCommon**: 这个模块主要处理与联系人相关的通用功能,如联系人数据的加载、查询和显示。在Android 5.0中,联系人界面被设计得更加友好,支持...

    Android源码——多功能拨号盘源码.zip

    本资源"Android源码——多功能拨号盘源码.zip"提供了一个完整的多功能拨号盘的源代码实现,适用于学习和理解Android拨号盘的构建过程以及相关功能的扩展。通过分析这个源码,我们可以深入探讨以下几个关键知识点: ...

    Android多功能拨号盘源码.zip

    总的来说,“Android多功能拨号盘源码”为我们提供了一个深入学习Android拨号盘实现的实例。通过对源码的分析,我们可以掌握Android UI设计、事件处理、数据库操作、服务调用等多个方面的知识,进一步提升自己的开发...

Global site tag (gtag.js) - Google Analytics