电话来电,接听解读

news/2024/11/15 3:52:13/

OutgoingCallBroadcaster将在往外拨打电话时被调用,当然执行其onCreate()方法

 

首先:

 

    mPhone = PhoneApp.getInstance().phone;

        Intent intent = getIntent();
        if (LOGV) Log.v(TAG, "onResume: Got intent " + intent + ".");

        String action = intent.getAction();
        String number = PhoneNumberUtils.getNumberFromIntent(intent, this);

//获取到PhoneApp对象,获取Intent,并且取得拨出的号码

 

然后,对号码进行处理

 

之后判断是不是紧急号码,如120。。。

如果是紧急号码,直接startActivity启动InCallScreen,同时将callNow变量赋值为true

  于是InCallScrenn启动唤醒屏幕。。。

  而在receiver里面判断callNow为ture就直接finish,而不再重复启动InCallScreen

如果不是紧急号码就发送广播“Intent.ACTION_NEW_OUTGOING_CALL”,让别人进行处理

 

  broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow);
        broadcastIntent.putExtra(EXTRA_ORIGINAL_URI, intent.getData().toString());
        if (LOGV) Log.v(TAG, "Broadcasting intent " + broadcastIntent + ".");
        sendOrderedBroadcast(broadcastIntent, PERMISSION, null, null,
                             Activity.RESULT_OK, number, null);

广播发送后OutgoingCallReceiver将会收到

**********************************OutgoingCallReceiver******************************************

本类是一个内部类,在类 OutgoingCallBroadcaster 里面,作用是接受OutgoingCallBroadcaster发送的广播,判断是否已经启动InCallScreen,

没有启动的话就进行一些初始化,如:对OTA进行初始化。然后启动InCallScreen。

接收到广播之后,从Intent里面取出电话号码及其URi

  originalUri = intent.getStringExtra(
                OutgoingCallBroadcaster.EXTRA_ORIGINAL_URI);

然后,设置Intent为ACTION_CALL,并带上号码和uri

并从Intent中取出callnow变量,

  如果为ture,表示在OutgoingCallBroadcaster中已经把InCallScrenn启动,所以不需要重复启动,而是直接把自己给finish

   如果为false,表示不是紧急号码,并且InCallScrenn没有被启动,所以需要将InCallScrenn启动,如下:

     Intent newIntent = new Intent(Intent.ACTION_CALL, uri);
        newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
        newIntent.setClass(context, InCallScreen.class);
        newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        context.startActivity(newIntent);

并且启动对应的Activity

 **************************InCallScreen**********************************

  该类extends了Acitivity,并且implements了OnClickListener和OnTouchListener,

  所以该类主要是负责打电话的那一个界面,并且还负责各种按键事件和触摸时间的处理。同时本类还复写的finish()方法,所以一般不会被finish掉,调用这个方法时它又把自己放回栈中。

   InCallScreen可以接收这个Intent并启动。。

  在onCreate里面将各个view加载。

  在onResume里面进行一些初始化操作,如:获取一个PhoneApp对象 解开Keyguard Notification的statusBar给DIsable。。。。

  还内置了一个Handler可以回调处理一些事件,比如: PHONE_STATE_CHANGED ;PHONE_DISCONNECT ;        EVENT_HEADSET_PLUG_STATE_CHANGED  

  同时有一个独立的BroadcastReceiver处理ACTION_HEADSET_PLUG,比如插入耳机等。。。。

 

**********************************PhoneApp*******************************************

该类是一个普通的java类,主要负责Phone对象的生成

 

这是一个虚拟的Phone对象,它从framework层取得一个Phone对象。该类继承自Application,同时能常驻内存

他和PhoneUtils一起处理电话操作

 

在oncreate方法里面进行各种全局的初始化:获取Phone对象 NotificationMgr对象     PowerManager对象    SimCard对象等。。。

 

同时内置的Handler可以回调处理各种事件,如:EVENT_SIM_ABSENT      EVENT_SIM_NETWORK_LOCKED      EVENT_UPDATE_INCALL_NOTIFICATION等。


/

***************************CallNotifier***************************

本类extends Handler并且implements CallerInfoAsyncQuery.OnQueryCompleteListener

   电话状态改变之后本类会接到Message,然后本Handler通过Message的不同,进入不同的case:

   然后调用不同的方法处理各种状态改变。

   同时实现了OnQueryCompleteListener接口,当来电的时候会帮助执行查询操作,比如查询并调用

   Ringer设置响铃方式。

当来电时,本类会接受到一个PHONE_NEW_RINGING_CONNECTION(Message.what),然后调用对应的方法

   onNewRingingConnection(),该方法又会调用startIncomingCallQuery()方法,该方法就查询用户

  设置的铃声(可能是系统的,也可能是用户自定义的),如果查询完成则直接调用onQueryComplete().

   假如执行超时的话,将会发送一个延时Message,延时后将默认调用系统的铃声。

   假如在延时发送Message过程中Query已经完成,由于CallNotifier实现了OnQueryCopleteListener,

   就会自动调用onQueryComplete()方法,该方法将会首先把可能存在的延时Message给Remove,以防止

   再次设置铃声。接着调用onCustomRingQueryComplete()方法。然后该方法里面会调用Ringer的ring()

   方法启动响铃。

********************************Ringer***************************

Ringer的ring()方法会启动相应的响铃方式。

响铃之后将会又Message发送,其内容为PHONE_STATE_CHANGED

*******************************InCallScreen**********************

InCallScreen将会接受到发送的PHONE_STATE_CHANGED消息,然后调用onPhoneStateChanged()方法

该方法将更新屏幕,CallNotifier的onCustomRingQueryComplete里也会通过PhoneUtils.showIncomingCallUi()

来启动InCallScreen屏幕。然后由InCallScreen处理,处理方式与前面打电话的大体一致,不过该类第一次调用时执行了

onCreate()方法,但是以后执行都是从onNewIntent()开始.



/

下面是响铃之后到接听的流程

    首先,加入是通过Touch接听

   通过Touch,首先触发的是InCallTouchUi类,当移到接听位置后,由于InCallScreen实现了OnTouchListener,

    所以将会出发InCallScreen的handleOnscreenButtonClick事件。里面将会执行internalAnswerCall()方法。

    该方法又会调用PhoneUtils类的answerCall()方法,该方法里首先让Ringer将响铃停止,stopRing(),然后再

    接听电话。

    状态改变后InCallScreen将会接受到Message,调用OnPhoneStateChage()方法

    然后更行界面。。。

    完成接听电话功能。



http://www.ppmy.cn/news/271055.html

相关文章

无人驾驶入门1:无人驾驶概览

最近给大家分享了《百度Apollo无人驾驶入门课程下载》,我也学习了一些,把我做的笔记分享给大家。 第一课:无人驾驶概览 课程主要介绍了无人驾驶车的关键部分以及Apollo的架构,带大家入门无人驾驶技术。 1.欢迎学习Apollo课程 …

Android拨打、接听、挂断电话操作

Android2.3之前的系统可以通过反射机制调用ITelephone的方法来挂断电话,因为Android2.3以后增加了对permission android.permission.MODIFY_PHONE_STATE 的限制,之前的反射的方法不能用了,我们可以通过发送广播的方式来接听电话。 示例代码…

python安装使用Flask框架(Vscode)

编译器:VsCode,python3.** 首先安装,在终端输入 pip install flask安装成功后新建文件,app.python,创建一个简单的Web应用。 from flask import Flaskapp Flask(__name__)app.route(/) def hello():return Hello, …

Android中自动接听电话的功能

最近,需要完成一个自动化测试工具,来测试一些模块的功能,其中有些功能需要接通电话后才可以使用,因为这个工具是完全自动化的,所以需要处理自动接听电话 在4.1以前Android是提供了接口可以直接调用接听电话的&#xff…

android 监听电话状态 来电 接听 挂断

如果想要监听手机的来电状态 需要接收手机的电话广播 首先是静态注册 <receiver android:name".PhoneReceiver"android:exported"true"android:enabled"true"><intent-filter><action android:name"android.intent.actio…

Android 来电自动接听

1、闲聊 今天闲来无事&#xff0c;刚好一个朋友需要做一个来电自动接听的功能&#xff0c;我一想&#xff0c;咦&#xff0c;这尼玛我还没做过&#xff0c;好吧&#xff0c;去看看&#xff01;好吧&#xff0c;看就看吧那么我提来了&#xff0c;我该从哪儿入手呢&#xff1f;算…

Android 电话的反射调用机制实现静默接听电话

首先 建一个工程 insertTel 建一个com.android.internal.telephony的包 把系统的源码里的ITelephony.aidl拷贝进来 如下 ITelephony.aidl /** Copyright (C) 2007 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License&…

无人机编程donekit及通讯(二)

后起飞无人机 1、Jetson连接飞控 vehicle connect(/dev/ttyACM0, wait_readyTrue, baud921600) 串口连接&#xff0c;波频是921600 2、socket网络通信 ssocket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.bind(("192.168.1.102",8080)) #绑定服务器的ip和端口…