系统应用篇(八)--Dialer篇

news/2024/11/29 13:45:18/

目录

一、Dialer应用的作用和重要性

二、Dialer应用的类型和功能

三、Dialer应用的架构和组件

四、Dialer应用的定制和扩展


一、Dialer应用的作用和重要性

下表是Android开发中Dialer应用的作用和重要性:

作用和重要性说明
拨号功能Dialer应用提供了拨打电话的功能,用户可以通过拨号界面输入电话号码并拨打电话。它是Android设备上常用的功能之一。
通话管理Dialer应用提供了对当前通话的管理功能,包括挂断电话、保持通话、切换通话等。用户可以通过Dialer应用进行通话的控制和管理。
通讯录集成Dialer应用通常与系统的通讯录功能进行集成,用户可以通过Dialer应用访问和管理通讯录中的联系人信息。这样用户可以方便地从通讯录中选择联系人进行拨号。
来电界面Dialer应用提供了来电界面,当有来电时会显示来电界面,用户可以接听或拒接来电。来电界面还可以显示来电号码、联系人信息等。
通话记录Dialer应用记录了拨出、接入以及未接的电话,用户可以查看通话记录并进行拨号、发送短信等操作。
号码识别Dialer应用可以进行号码识别,例如识别陌生号码或来自通讯录的号码,并在来电界面显示对应的联系人信息。这样用户可以更方便地辨识来电的来源。
阻止垃圾电话Dialer应用还提供了阻止垃圾电话的功能,可以根据用户的设置和黑名单来过滤和阻止骚扰电话和垃圾短信。
多功能界面Dialer应用通常提供了一个功能齐全的用户界面,用户可以通过界面中的各种按钮和选项进行各种电话相关操作,如拨号、通话管理、联系人查找等。

        Dialer应用提供了拨号功能、通话管理、通讯录集成等功能,使用户可以方便地拨打电话、管理通话和查看通话记录。此外,Dialer应用还提供了来电界面和号码识别功能,提升了用户体验和通话的便利性。


二、Dialer应用的类型和功能

下表是Android开发中Dialer应用的类型和功能:

类型和功能说明
基本拨号应用基本拨号应用是最常见的Dialer应用类型,它提供了基本的拨号功能,包括手动输入号码、从联系人列表选择号码、呼叫等。
来电显示应用来电显示应用主要负责来电时的显示功能,它会显示来电号码或联系人信息,并提供接听和拒接的选项。
通话记录应用通话记录应用用于记录和管理用户的通话记录,包括呼入、呼出和未接来电的信息。它提供了通话时间、通话时长、联系人名称等信息的显示和管理。
通话管理应用通话管理应用提供了更多的通话控制功能,如静音、免提、保持通话、切换通话等。它允许用户在通话过程中进行各种操作,以满足不同的通话需求。
呼叫转移应用呼叫转移应用允许用户将呼入的电话转移到其他号码,如转移到语音信箱、其他电话号码等。它提供了方便的呼叫转移设置和管理功能。
黑名单应用黑名单应用用于阻止垃圾电话和骚扰电话,它可以根据用户的设置和黑名单过滤和阻止特定的电话号码。
视频通话应用视频通话应用扩展了Dialer应用的功能,允许用户进行音频和视频通话。它提供了视频通话界面、摄像头切换、静音、免提等功能。
VoIP应用VoIP(Voice over IP)应用使用互联网协议进行语音通信,允许用户通过数据网络进行语音通话。它提供了与传统电话类似的拨号和通话功能,但使用的是互联网连接。

        不同类型的Dialer应用可以根据需求提供不同的功能和扩展,满足用户在通话方面的不同需求和偏好。


三、Dialer应用的架构和组件

下表是Android开发中Dialer应用的架构和组件:

架构和组件说明
拨号界面拨号界面是Dialer应用的主要界面,它提供了拨号盘、联系人列表、通话记录等功能,用户可以通过拨号界面进行号码输入和呼叫操作。
通话管理模块通话管理模块负责处理呼叫状态和通话控制,它包括呼叫状态的监测、呼叫的建立和结束、通话控制功能等。
通话记录管理模块通话记录管理模块负责记录和管理用户的通话记录,包括呼入、呼出和未接来电的信息。它提供了通话记录的存储、查询和展示功能。
联系人管理模块联系人管理模块用于管理用户的联系人信息,包括联系人的增删改查、联系人列表的展示和搜索功能等。它与系统联系人数据库进行交互,提供联系人的数据操作和展示接口。
来电显示模块来电显示模块负责在来电时显示来电号码或联系人信息,并提供接听和拒接的选项。它与电话服务进行交互,获取来电信息并进行展示。
呼叫转移模块呼叫转移模块负责处理呼叫转移功能,包括设置呼叫转移规则、转移呼入电话到指定号码等。它与电话服务和运营商网络进行交互,实现呼叫转移功能。
电话服务电话服务是Android系统提供的底层服务,负责处理与底层通信模块的交互和呼叫功能的实现。它提供了与电话模块的通信接口,用于拨号、接听、挂断等电话操作。
数据存储模块数据存储模块负责Dialer应用的数据存储和管理,包括通话记录、联系人信息等的存储和查询。它与数据库进行交互,提供数据的增删改查功能。
权限管理模块权限管理模块负责处理Dialer应用需要的权限请求和权限管理,确保应用在访问敏感数据和执行敏感操作时具备必要的权限。

        不同的Dialer应用可能会根据具体需求和设计选择不同的架构和组件来实现相关功能和业务逻辑。


四、Dialer应用的定制和扩展

以高通平台的Dialer应用为例:

  1. 使用户能拨号
  2. Dialer:定制紧急号码的显示名称
  3. 打开MMI,内部软件版本指令
  4. 设置拨号输入框需要光标显示
  5. 解决在拨号器中移动方向键后,输入 DEL 键时,输入的号码无法删除的bug

解决方案:

1.1 在Dialer的DialtactsActivity类中重写onkeyDown()方法,判断fragment未获取焦点时,设置默认可以获取焦点,并定义一个Boolean属性的callKey来作为判断条件:

    @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubLog.e(TAG, "onKeyDown-keyCode->"+keyCode+",mIsDialpadShown->"+mIsDialpadShown);if(mIsDialpadShown && !mDialpadFragment.getDigitsWidget().hasFocus()){mDialpadFragment.getDigitsWidget().requestFocus();mDialpadFragment.getDigitsWidget().onKeyDown(keyCode, event);}return super.onKeyDown(keyCode, event);}/*** Sets the current tab based on the intent's request type** @param intent Intent that contains information about which tab should be selected*/private void displayFragment(Intent intent) {// If we got here by hitting send and we're in call forward along to the in-call activityif (isSendKeyWhileInCall(intent)) {finish();return;}boolean showDialpadChooser =!ACTION_SHOW_TAB.equals(intent.getAction())&& phoneIsInUse()&& !DialpadFragment.isAddCallMode(intent);//add beginfinal boolean callKey = Intent.ACTION_CALL_BUTTON.equals(intent.getAction());if(callKey){showDialpadChooser = true;}//add endif (showDialpadChooser || (intent.getData() != null && isDialIntent(intent))) {showDialpadFragment(false);mDialpadFragment.setStartedFromNewIntent(true);if (showDialpadChooser && !mDialpadFragment.isVisible()) {mInCallDialpadUp = true;}} else if (isLastTabEnabled) {@TabIndexint tabIndex =DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(this).getInt(KEY_LAST_TAB, DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);// If voicemail tab is saved and its availability changes, we still move to the voicemail tab// but it is quickly removed and shown the contacts tab.if (mListsFragment != null) {mListsFragment.showTab(tabIndex);PerformanceReport.setStartingTabIndex(tabIndex);} else {PerformanceReport.setStartingTabIndex(DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);}}}

 1.2 在DialpadFragment类重写的onKey()方法中添加一个键值,拨号键的键值KeyEvent.KEYCODE_CALL:

  @Overridepublic boolean onKey(View view, int keyCode, KeyEvent event) {if (view.getId() == R.id.digits) {if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_CALL) {handleDialButtonPressed();return true;}}return false;}

2.在ContactGridManager类中自定义一个返回bool值的setEccName()方法,并在updatePrimaryNameAndPhoto()中调用,用于定制紧急号码为韩文:

 /*** Updates row 1. For example:** <ul>*   <li>Jake Peralta [Contact photo]*   <li>Walgreens*   <li>+1 (650) 253-0000* </ul>*/private void updatePrimaryNameAndPhoto() {if (TextUtils.isEmpty(primaryInfo.name)) {contactNameTextView.setText(null);} else {//add beginandroid.util.Log.e(TAG,"primaryInfo.nameIsNumber->"+primaryInfo.nameIsNumber+",primaryInfo.name->"+primaryInfo.name+",number->"+primaryInfo.number);boolean isSetEcc = false;if(!primaryInfo.nameIsNumber){isSetEcc = setEccName(primaryInfo.number);}if(!isSetEcc){contactNameTextView.setText(primaryInfo.nameIsNumber? PhoneNumberUtilsCompat.createTtsSpannable(primaryInfo.name): primaryInfo.name);}//add end// Set direction of the name fieldint nameDirection = View.TEXT_DIRECTION_INHERIT;if (primaryInfo.nameIsNumber) {nameDirection = View.TEXT_DIRECTION_LTR;}contactNameTextView.setTextDirection(nameDirection);}if (avatarImageView != null) {if (hideAvatar) {avatarImageView.setVisibility(View.GONE);} else if (avatarSize > 0 && updateAvatarVisibility()) {boolean hasPhoto =primaryInfo.photo != null && primaryInfo.photoType == ContactPhotoType.CONTACT;// Contact has a photo, don't render a letter tile.if (hasPhoto) {avatarImageView.setBackground(DrawableConverter.getRoundedDrawable(context, primaryInfo.photo, avatarSize, avatarSize));// Contact has a name, that isn't a number.} else {letterTile.setCanonicalDialerLetterTileDetails(primaryInfo.name,primaryInfo.contactInfoLookupKey,LetterTileDrawable.SHAPE_CIRCLE,LetterTileDrawable.getContactTypeFromPrimitives(primaryCallState.isVoiceMailNumber,primaryInfo.isSpam,primaryCallState.isBusinessNumber,primaryInfo.numberPresentation,primaryCallState.isConference));// By invalidating the avatarImageView we force a redraw of the letter tile.// This is required to properly display the updated letter tile iconography based on the// contact type, because the background drawable reference cached in the view, and the// view is not aware of the mutations made to the background.avatarImageView.invalidate();avatarImageView.setBackground(letterTile);}}}}//add beginprivate boolean setEccName(String num){if("111".equals(num)){contactNameTextView.setText("국정원");}else if("112".equals(num)){contactNameTextView.setText("경찰서");}else if("113".equals(num)){contactNameTextView.setText("간첩신고");}else if("117".equals(num)){contactNameTextView.setText("학교폭력 신고/상담");}else if("118".equals(num)){contactNameTextView.setText("사이버테러신고");}else if("119".equals(num)){contactNameTextView.setText("화재구조구급");}else if("122".equals(num)){contactNameTextView.setText("해양경찰청");}else if("125".equals(num)){contactNameTextView.setText("밀수신고");}else if("127".equals(num)){contactNameTextView.setText("마약사범신고");}else{return false;}return true;}//add end

3. 在SpecialCharSequenceMgr类中自定义一个handleFreetelEngineerCodeLocal()方法用于处理内部软件版本指令:

    private static String sSoftVersion = "*#458#";private static boolean handleFreetelEngineerCodeLocal(Context context, String input) {if (input.equals(sSoftVersion)) {String title = context.getResources().getString(R.string.sw_version_title);String message = SystemProperties.get("ro.build.display.id");showDialog(context, title, message);return true;}return false;}private static void showDialog(Context context, String title, String message) {new AlertDialog.Builder(context).setTitle(title).setMessage(message).setPositiveButton(android.R.string.ok, null).setCancelable(false).show();}

4.在DialpadFragment类中设置setCursorVisible()的值为true,这样即可在输入框显示光标:

digits.setCursorVisible(true);

5.在MainSearchController类的onKeyDown()方法中添加判断删除键的逻辑:

public boolean onKeyDown(int keyCode, KeyEvent event) {if (dialpadFragment != null) {if(isDialpadVisible() && isNumberKey(keyCode) && !dialpadFragment.getDigitsWidget().hasFocus() ){dialpadFragment.getDigitsWidget().requestFocus();return dialpadFragment.getDigitsWidget().onKeyDown(keyCode, event);} else if (isDialpadVisible() && keyCode == KeyEvent.KEYCODE_CALL && event.getRepeatCount() == 0) {dialpadFragment.callNumber();return true;}//add beginelse if(isDialpadVisible() && keyCode == KeyEvent.KEYCODE_DEL && !dialpadFragment.getDigitsWidget().hasFocus() ){dialpadFragment.getDigitsWidget().requestFocus();return dialpadFragment.getDigitsWidget().onKeyDown(keyCode, event);}//add end}return false;}

本文仅代表个人观点和经验,难免存在不足之处。如果有任何错误或改进的建议,欢迎指正和交流,共同进步。


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

相关文章

React入门(一)——React介绍、项目创建、JSX语法

自学react&#xff0c;本文为b站千锋教育2022版React全家桶教程_react零基础入门到项目实战完整版课程笔记 补充部分React 18 特性 b站千锋教育2022版React全家桶教程_react零基础入门到项目实战完整版 一、React介绍 1、React 的起源与发展 Fcabook内部项目&#xff0c;由于…

商城商品的知识图谱构建

知识图谱构建 下面重点介绍阿里数字商业知识图谱的升级和相关工作。 1. 数字商业知识图谱升级 在这样大的机制和模型设计之下&#xff0c;数字商业知识图谱大致如上图所示。通过知识图谱去管理和组织庞大的商业要素。大概会分成四层&#xff1a; ① 第一层本体层&#xff0c…

卖鞋月入5万、玩抖音买“大奔”:有些程序员收入靠副业,上班只为自律

本文转载自 InfoQ&#xff0c;作者 罗燕珊 “做一个副业&#xff0c;我就希望能把它做成主业&#xff0c;然后把上班变成副业。” 副业一直都是个热门话题&#xff0c;几乎每个“打工人”都考虑过开展自己的副业。有些人是由于收入焦虑而主动探索&#xff0c;有些人则是在不知…

如何基于深度学习实现图像的智能审核

美团每天有百万级的图片产生量&#xff0c;运营人员负责相关图片的内容审核&#xff0c;对涉及法律风险及不符合平台规定的图片进行删除操作。由于图片数量巨大&#xff0c;人工审核耗时耗力且审核能力有限。另外对于不同审核人员来讲&#xff0c;审核标准难以统一且实时变化。…

trans系列模型

1…trans系列模型 模型比较 必看(以下模型描述均摘自此篇文章) 2.transE Translating Embeddings for Modeling Multi-relational Data link transE假设关系是向量而不是距离 TransE的直观含义&#xff0c;就是TransE基于实体和关系的分布式向量表示&#xff0c;将每个三元组…

MATLAB算法实战应用案例精讲-【图像处理】小目标检测(补充篇)(附python代码实现)

目录 前言 常用数据集及性能评估 数据集 性能评估 改进方向 小目标检测分类

从0到1精通自动化测试,pytest自动化测试框架,配置文件pytest.ini(十三)

一、前言 pytest配置文件可以改变pytest的运行方式&#xff0c;它是一个固定的文件pytest.ini文件&#xff0c;读取配置信息&#xff0c;按指定的方式去运行 二、ini配置文件 pytest里面有些文件是非test文件pytest.ini pytest的主配置文件&#xff0c;可以改变pytest的默认…

小小爬虫 python实现

python 实现简单爬虫 # 爬虫&#xff1a;爬去信息----模拟浏览 # 需求&#xff1a;用程序模拟浏览器&#xff0c;输入一个网址&#xff0c;从该网址获取到资源或者内容 # 用python特别简单""" 1.from urllib.request import urlopen """from ur…