• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android 6.0 Phone"通话显示"查询流程

Android 6.0 Phone"通话显示"查询流程

作者:yaoming168的专栏 字体:[增加 减小] 来源:互联网 时间:2017-07-22

yaoming168的专栏通过本文主要向大家介绍了android,incallui等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、概要

无论是在MT (Mobile Termination Call被叫——来电),还是MO (Mobile Origination Call主叫——去电) 流程中,通话界面上都会显示当前通话的名称( 后文以displayName指代 )。通常情况下,如果是一个陌生号码,则会显示为该陌生号码。如果是已知联系人,则会显示该联系人的名称。当然,在会议电话( Conference Call )的情况下则直接显示”会议电话”。但是,在某些特殊情况下,displayName还会显示诸如”私人号码”、”公用电话”、”未知号码”等。

本文主要分析displayName的获取显示流程及显示”未知号码”的原因

二、查询流程

1、开始查询——CallCardPresenter
displayName是隶属于CallCardFragment的控件,当通话MO/MT流程发起时InCallActivity会显示,此时将会触发CallCardFragment界面更新,在CallCardPresenter的init方法中查询displayName,关键代码如下:
CallCardPresenter.java (\packages\apps\incallui\src\com\android\incallui)

 public void init(Context context, Call call) {
        // Call may be null if disconnect happened already.
        if (call != null) {
            mPrimary = call;
            // start processing lookups right away.
            if (!call.isConferenceCall()) {
                startContactInfoSearch(call, CallEnum.PRIMARY, call.getState() == Call.State.INCOMING);
            } else {
                /// M: Modified this for MTK DSDA feature. @{
                /* Google Code:
                updateContactEntry(null, true);
                */
                updateContactEntry(null, CallEnum.PRIMARY, true);
                /// @}
            }
        }
    }

startContactInfoSearch的具体代码如下:

    /**
     * Starts a query for more contact data for the save primary and secondary calls.
     */
    private void startContactInfoSearch(final Call call, CallEnum type,
            boolean isIncoming) {
        final ContactInfoCache cache = ContactInfoCache.getInstance(mContext);
// ContactInfoCache中开始查找 
        cache.findInfo(call, isIncoming, new ContactLookupCallback(this, type));
    }

2、异步查询——ContactInfoCache
在CallCardPresenter中发起查询之后会跳转到ContactInfoCache.findInfo()方法中,ContactInfoCache不仅用于查询当前通话的相关信息,还可以将这些信息缓存以备下次查询相同信息时快速返回。findInfo关键代码如下:

    /**
     * Requests contact data for the Call object passed in.
     * Returns the data through callback.  If callback is null, no response is made, however the
     * query is still performed and cached.
     *
     * @param callback The function to call back when the call is found. Can be null.
     */
    public void findInfo(final Call call, final boolean isIncoming,
            ContactInfoCacheCallback callback) {
// 查询caller信息,完成之后会回调到FindInfoCallback中,会调用findInfoQueryComplete 
        final CallerInfo callerInfo = CallerInfoUtils.getCallerInfoForCall(
                mContext, call, new FindInfoCallback(isIncoming));
// 当查询完毕之后回调并更新ContactEntry,这里最终会去更新界面显示  
        findInfoQueryComplete(call, callerInfo, isIncoming, false);
    }

CallerInfo中包含了当前call的基本信息,比如号码、类型、特殊相关服务等,在获取到这些信息之后再进行进一步的联系人数据库查询。

3、获取CallerInfo——CallerInfoUtils
在getCallerInfoForCall()方法中,除了获取当前Call的基本信息之外,还会根据当前Call的phoneNumber去数据库中查询,关键代码如下:

ContactInfoCache.java (\packages\apps\incallui\src\com\android\incallui)

    /**
     * This is called to get caller info for a call. This will return a CallerInfo
     * object immediately based off information in the call, but
     * more information is returned to the OnQueryCompleteListener (which contains
     * information about the phone number label, user's name, etc).
     */
    public static CallerInfo getCallerInfoForCall(Context context, Call call,
            CallerInfoAsyncQuery.OnQueryCompleteListener listener) {
// 获取当前Call的基本信息并创建CallerInfo对象 
        CallerInfo info = buildCallerInfo(context, call);
    // 根据phoneNumber在CallerInfoAsyncQuery中开启具体查询  
        if (info.numberPresentation == TelecomManager.PRESENTATION_ALLOWED) {
            // Start the query with the number provided from the call.
            Log.d(TAG, "==> Actually starting CallerInfoAsyncQuery.startQuery()...");
            CallerInfoAsyncQuery.startQuery(QUERY_TOKEN, context, info, listener, call);
        }
        return info;
    }

在以上代码中,有两个重要的方法,即buildCallerInfo()和CallerInfoAsyncQuery.startQuery(),先查询看buildCallerInfo()的关键代码:

   public static CallerInfo buildCallerInfo(Context context, Call call) {
        CallerInfo info = new CallerInfo();
        // Store CNAP information retrieved from the Connection (we want to do this
        // here regardless of whether the number is empty or not).
// 获取当前Call的CNAP name 
        info.cnapName = call.getCnapName();
        info.name = info.cnapName;
        info.numberPresentation = call.getNumberPresentation();
        info.namePresentation = call.getCnapNamePresentation();
        String numbe
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android:手把手教你 实现Activity 与 Fragment 相互通信(含Demo)
  • android自定义圆角背景实现富文本标题展示
  • 自定义收集用户行为统计库 (非常方便 可以自己拓展)
  • Android 6.0 Phone"通话显示"查询流程
  • Android缓存处理
  • 自定义进度条PictureProgressBar——从开发到开源发布全过程
  • 详解Android中的SQLite数据库存储
  • Android设备上获取照片、裁剪图片、压缩图片
  • Android触摸事件分发机制完全解析《一》
  • Android-SQLite和SQLiteOpenHelper

相关文章

  • 2017-05-26Weex 环境搭建(win7),weex环境搭建win7
  • 2017-05-26Android ExpandableListView相关介绍
  • 2017-05-26Android客户端性能优化(魅族资深工程师毫无保留奉献)
  • 2017-05-26一起来学习Android自定义控件
  • 2017-05-26Android自定义控件
  • 2017-05-26Android源码之陌陌源码,android源码
  • 2017-05-26把一张图缩小放到另一张背景图上。,一张背景图
  • 2017-05-26Android中的LinearLayout布局,linearlayout垂直布局
  • 2017-05-26ubuntu下ssh的应用
  • 2017-05-26Android系统的五种数据存储形式(一),android数据存储

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Smack+OpenFire搭建IM通信,包含心跳和自动重连(Android实现),smackopenfire
    • 仿拉手团购App9-- 产品详情界面,团购app9--
    • android的消息提示(震动与提示音),android
    • Winform突然不响应KeyEvent了
    • android MediaPlayer 错误代码(error code)总结 转载,androidmediaplayer
    • Android 蓝牙操作详解,android蓝牙详解
    • Stack Overflow 排错翻译,stackoverflow
    • 【React Native开发】React Native控件之ToolbarAndroid工具栏控件讲解以及使用(15)
    • Android开发学习——android反编译,开发android反编译
    • 在Linux上分析死锁问题的简单方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有