andriod 自定义来电界面功能
由于近期所做一个项目需要做类似于“来电秀”的功能,所以上网搜索了一些相关资料,加上自己的一些想法,做了一个Demo。一下是我对该功能实现的一些想法,不对的地方欢迎各位指出。最后我会给出Demo 的源代码。
首先,Android系统的手机在监听到有电话呼入的时候会向系统发送电话状态改变的广播(android.intent.action.PHONE_STATE)。要想实现来电秀功能,必须在自己的程序中注册监听该广播。所以我们的程序大致功能就是通过监听该广播,当有电话呼入的时候显示自定义的界面。
以什么样的方式显示自定义的界面呢?主要有两种方式:
1 .以Activity的形式显示界面。
这种方式就是当有来电时启动自己的Activity并使其位于系统来电界面的上方,完全遮住系统界面。这种方式的好处是可以完全根据自己的需求做界面,但是主要面临着以下几个主要问题:
(1) 如何使自己的Activity遮住系统的来电界面:Android系统中系统级的应用有着最高的优先级,自己的应用不可能比系统优先级高,所以我们没办法屏蔽系统来电界面,只能等系统来电界面显示之后再启动我们自己的Activity ,暂时的处理是:在我们的应用接收到来电广播的时候延迟一秒钟启动我们自定义的Activity,这时候系统的来电界面应该已经显示了,这样基本可保证我们的Activity位于系统来电界面之上。
(2) 使用自己的Activity如何接听或挂断电话:Android SDK并没有将系统接听或挂断电话的接口开放出来,但是却以.aidl(Android Interface Definition Language,Android接口定义语言,可以使应用程序跨进程访问其他类的方法)向其他应用开放了(源码位置:frameworks/base/telephony/Java/com/android/internal/telephony),我们可以在程序中建立一个同样的.aidl文件,并在程序中以反射的方式获取所需要的方法,主要的就是endCall方法(拒接或挂断电话)和answerRingingCall方法(接听电话)。但是另外一个问题是调用answerRingingCall方法需要权限(android.permission.MODIFY_PHONE_STATE , 该权限可以使应用程序改变电话的状态) ,但是该权限在android2.3及以后的版本中被隐藏,只有系统级应用才能拿到,这样我们只能通过模拟手机插上耳机时通过耳机上的按钮接听电话的操作来接听电话(具体实现看http://yk8900.blog.163.com/blog/static/123183544201272835550952/ )。
(3) 按下接听键前实时从网络取数据:在2G网络(GSM, GPRS,EDGE)情况下,来电的时候一般会断网(没有详细测试)。在3G(CDMA2000[电信],WCDMA[移动],TD-CDMA[移动])或WIFI情况下来电的时候是不会断网的,所以如果要从网络取数据,必须是在3G或WIFI情况下使用来电秀。
(4) 兼容性问题:由于使用自定义的Activity涉及到比较多的android底层未开放的接口,而各大手机厂商为了生产有自己个性的手机都会在一定程度上修改android底层源码,所以各种ROM的情况不一样, 我们无法做到适配所有android手机(目前该方法在三星和魅族手机上测试正常)。
2.以系统级弹框形式显示界面。
这种方式是当有来电时弹出一个窗口浮于系统所有界面之上的形式。也就是和360显示来电归属地的方式一样。使用这种方式实现同样需要考虑的问题设置为全屏还是半屏:如果设置为全屏,那么需要自己实现接电话的流程,那么就和使用Activity显示界面面临同样问题。如果设置为半屏,需要面对的问题是:一般来说弹窗和主界面的焦点不能兼得,如果能够很方便地就使用户既能操作弹窗内部的控件又不影响用户点击来电主界面上的各个按钮,那么用这种方式无疑是最好的。
当然不管采用哪种方式我们都需要面对很多比较特殊的情况,比如,在接听电话过程中有另一个电话进来怎么处理;在双卡双待的情况下会不会出现问题;用耳麦上的按钮接听电话,在接听电话过程中拔出耳麦会不会有影响等等,以及一些其他的不可预见的情况。
3.Demo运行的效果:
( 程序主界面可以选择以什么方式显示来电秀,并可以自定义)。
(选择弹窗的形式显示“来电秀”,高度设置了为75%)
(选择以Activity的形式显示来电秀)。
4 。DEMO下载地址。
andriod 自定义来电界面功能的更多相关文章
- 以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转)
以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转) ; Script generated by the Inno Setup 脚本向导. ; SEE THE DOCU ...
- iOS开发——UI_swift篇&TableView自定义聊天界面
TableView自定义聊天界面 1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息 (2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小 ...
- iOS彩票项目--第五天,新特性引导页的封装、返回按钮的自定义、导航控制器的滑动返回以及自定义滑动返回功能
一.上次实现了在AppDelegate中通过判断app版本决定是否进入新特性页面,今天将AppDelegate中的一坨进行了封装.将self.window的根控制器到底应该为新特性界面,还是主页面,封 ...
- uniapp+nvue实现仿微信App界面+功能 —— uni-app实现聊天+语音+视频+图片消息
基于uniapp + nvue实现的uniapp仿微信界面功能聊天应用 txim 实例项目,实现了以下功能. 1: 聊天会话管理 2: 好友列表 3: 文字.语音.视频.表情.位置等聊天消息收发 4: ...
- sql server实现自定义分割月功能
本文目录列表: 1.为何出现自定义分割月需求 2.sql server实现自定义分割月功能 3.测试验证效果 4.总结语 5.参考清单列表 1.为何出现自定义分割月的需求 今天梳理一个平台的所 ...
- Wix 安装部署教程(三)自定义安装界面和行为
接上一篇自定义安装界面,这篇继续探索,首先介绍下,Wix为我们定义了五种风格,每种风格的UI都是有一定顺序的.我们可以改变安装顺序,也可以完全自定义一个Dialog插入其中.比如Wix_Mondo 风 ...
- linux启动后自动登录并运行自定义图形界面程序
在<Ubuntu CTRL+ALT+F1~F6 进入命令模式后不支持中文显示的解决办法>一文中提到linux启动在以后运行一个独占显示器的图形程序的两种办法. 1.不启动xserver,使 ...
- InstallShield自定义安装界面
原文:InstallShield自定义安装界面 版权声明: 可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息. 前言: 对于一些InstallShield用户或企业,对于安装包界面除了 ...
- 如何使用XE2及更高版本中提供的自定义皮肤(样式)功能
源:如何使用XE2及更高版本中提供的自定义皮肤(样式)功能 1. 制作样式文件: 点击 XE2+ 的 IDE 菜单上的 Tools-->Bitmap Style Designer, 打开设计器. ...
随机推荐
- [转帖]kubeadm 实现细节
kubeadm 实现细节 http://docs.kubernetes.org.cn/829.html 1 核心设计原则 2 常量和众所周知的值和路径 3 kubeadm init 工作流程内部设计 ...
- day1——js方法关键字的问题(onclick点了没反应)
<a href="javascript:void(0);" onclick="search();" >提交</a> js代码: fu ...
- java8新特性(三)_Optional类的使用
说实话,我第一次知道这个东西是从阿里规约中,因为公司前一段时间一直在搞代码审核,我的代码写的就感觉很烂,就像规范下.让别人看起来没那么烂.于是就开始看阿里规约,在看到NPE处理的时候,上面提到用Opt ...
- Hbase远程连接:Can't get the locations
当Java API远程连接出错:Can't get the locations 原先填入的是IP地址,后来改为HOSTS文件中配置的主机名问题解决,如下红色字体部分: conf.set("h ...
- C#解析数组形式的json数据
在学习时遇到把解析json数据的问题,网上也搜了很多资料才得以实现,记录下来以便翻阅. 1. 下载开源的类库Newtonsoft.Json(下载地址http://json.codeplex.com/, ...
- 去掉DataTable列中的重复行
DataTable dt = ds.Tables[0]; //获得 DataTable DataView dv = new DataView(dt);DataTable dt2 = dv.T ...
- 架构师成长之路1.1-系统监控工具htop
点击返回架构师成长之路 架构师成长之路1.1-系统监控工具htop htop 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses. 与Linu ...
- 【转】为什么 MQTT 是最适合物联网的网络协议
初识 MQTT 为什么 MQTT 是最适合物联网的网络协议 Michael Yuan2017 年 6 月 14 日发布 WeiboGoogle+用电子邮件发送本页面 0 物联网 (IoT) 设备必须连 ...
- StringEscapeUtils的常用使用,防止SQL注入及XSS注入
StringEscapeUtils的常用使用,防止SQL注入及XSS注入 2017年10月20日 11:29:44 小狮王 阅读数:8974 版权声明:本文为博主原创文章,转载请注明出处. htt ...
- PHP多条件模糊查询
所使用的方法:$sqlArr=array();array_push();implode(); 原理, 一.建立sql语句前半句,并且建立一个空数组. 二.根据条件是否为空来判断是否向数组中添加元素.如 ...