Android自定义来电界面实现_Z1001001的博客-程序员秘密

技术标签: ui  移动开发  

场景需求

在手机来电时,有时不方便接听电话,希望能点触屏幕达到静音的效果,稍候再接听电话。

开发思路

首先得获得手机来电的事件,进而监听屏幕的点击事件,让手机铃声静音

困难点

手机来电事件,是系统中优先级最高的,第三方的应用无法更改系统自带的来电功能。

解决办法

查阅了网上一些通用的做法,下载了一些来电显示的应用,通过观察发现,目前大家的做法普遍是:

首先后台始终有一服务,监听来电事件,当来电时,跳转到第三方应用的界面,在此界面上进行来电

页面的优化,比如可以接听、挂断电话,界面做的比系统自带的更好看...其实此时系统自带的来电也在

后台跑着,只是如果在我们的应用中接听或挂断了电话,系统中的事件也就关了。

相关代码

 1    public void onReceive(Context context, Intent intent) {
 2         final Context ctx = context;
 3         final ShowPref pref = ShowPref.getInstance(ctx);
 4         /**
 5          * 以什么方式显示界面
 6          */
 7         final int showType = pref.loadInt(ShowPref.SHOW_TYPE);
 8 
 9         telMgr = (TelephonyManager)ctx.getSystemService(Service.TELEPHONY_SERVICE);
10         switch (telMgr.getCallState()) {
11             case TelephonyManager.CALL_STATE_RINGING:// 来电响铃
12                 System.out.println("....................主人,那家伙又来电话了....................");
13                 final String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
14                 System.out.println("number:" + number);
15 
16                 if (number.length() == 11) {
17                     synchronized (monitor) {
18                         switch (showType) {
19                             case ShowPref.TYPE_ACTIVITY:
20                                 new Handler().postDelayed(new Runnable() {
21                                     @Override
22                                     public void run() {
23                                         // TODO Auto-generated method stub
24                                         showActivity(ctx, number);
25                                     }
26                                 }, 1000);
27                                 break;
28                             case ShowPref.TYPE_FULL_DIALOG:
29                                 new Handler().postDelayed(new Runnable() {
30                                     @Override
31                                     public void run() {
32                                         // TODO Auto-generated method stub
33                                         showWindow(ctx, number, 100);
34                                     }
35                                 }, 100);
36                                 break;
37                             case ShowPref.TYPE_HALF_DIALOG:// 非满屏Dialog
38                             default:// 默认显示半屏dialog
39                                 int value = pref.loadInt(ShowPref.TYPE_HALF_VALUE,
40                                         ShowPref.TYPE_HALF_DIALOG_DEFAULT);
41                                 final int percent = value >= 25 ? (value <= 75 ? value : 75) : 25;
42                                 new Handler().postDelayed(new Runnable() {
43                                     @Override
44                                     public void run() {
45                                         // TODO Auto-generated method stub
46                                         showWindow(ctx, number, percent);
47                                     }
48                                 }, 100);
49                                 break;
50                         }
51                     }
52                 }
53                 break;
54             case TelephonyManager.CALL_STATE_OFFHOOK:// 接听电话
55                 break;
56             case TelephonyManager.CALL_STATE_IDLE:// 挂断电话
57                 synchronized (monitor) {
58                     switch (showType) {
59                         case ShowPref.TYPE_ACTIVITY:
60                             Utils.sendEndCallBroadCast(ctx);
61                             break;
62                         case ShowPref.TYPE_FULL_DIALOG:
63                         case ShowPref.TYPE_HALF_DIALOG:
64                         default:// 默认会显示半屏的dialog
65                             closeWindow(ctx);
66                             break;
67                     }
68                 }
69                 break;
70             default:
71                 break;
72         }
73 
74     }
View Code

监听权限:

 1   <!-- 挂断手机的权限 -->
 2     <uses-permission android:name="android.permission.CALL_PHONE" />
 3 
 4     <!-- 读取手机状态的权限 -->
 5     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 6     <!-- 系统级弹窗权限 -->
 7     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
 8     <!-- 解锁的权限 -->
 9     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
10     <!-- 亮屏的权限 -->
11     <uses-permission android:name="android.permission.WAKE_LOCK" />
12     <!-- 网络操作的权限 -->
13     <uses-permission android:name="android.permission.INTERNET" />
14     <!-- 读取网络状态 -->
15     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
16 
17     <uses-permission android:name="android.permission.RESTART_PACKAGES" />
18     
19     <application
20         android:icon="@drawable/icon"
21         android:label="@string/app_name" >
22         <activity
23             android:name="com.likebamboo.phoneshow.MainActivity"
24             android:label="@string/app_name" >
25             <intent-filter>
26                 <action android:name="android.intent.action.MAIN" />
27 
28                 <category android:name="android.intent.category.LAUNCHER" />
29             </intent-filter>
30         </activity>
31         <activity
32             android:name="com.likebamboo.phoneshow.OverLayActivity"
33             android:label="@string/app_name" >
34         </activity>
35         <!-- 注册监听手机状态 -->
36         <receiver android:name="com.likebamboo.phoneshow.PhoneStateReceiver" >
37             <intent-filter android:priority="1000" >
38                 <action android:name="android.intent.action.PHONE_STATE" />
39             </intent-filter>
40         </receiver>
41 
42         <service
43             android:name="com.likebamboo.phoneshow.ScreenService"
44             android:label="@string/app_name" >
45         </service>
View Code

项目源码

源码.zip

转载于:https://www.cnblogs.com/aLaDing/p/4580918.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Z1001001/article/details/102164410

智能推荐

kubernetes高可用架构_lyzkks的博客-程序员秘密

在之前的实验中,kubernetes集群都是一台master和两台node组成的小集群,在实际的生产环境中需要考虑到集群的高可用。在node节点实际已经实现了高可用,pod分布在不同的节点上,当一个节点宕机的时候,其上的pod会漂移到正常的节点上。所以,重点的高可用重心就要放在master上。官方的master节点高可用架构图中可以看出,用户通过kubectl发送命令经过LB进...

B端产品设计规范_b端设计规范尺寸_aimeeth的博客-程序员秘密

开篇说:上一篇,我写过一篇综合类的设计规范和适配。这一次我想重点写一下:网页PC端产品设计规范和组的设计拆解,对项目的设计效率提升,有一定价值和意义。分析项目设计中的组件,设计元素,设计规范与设计稿到开发的最后,尽可能保证产品设计还原的一致性。思考项目设计的实际场景,团队来调整优化产品设计整体方案和设计细节、优化产品交互和设计的一个过程。在这个团队协作的过程中,团队包括产品经理、体验设计师及开发程序员等测试人员,都要积极的参与讨论,多方并行参与到最后形成一套可以落地执行,...

机器学习实战(基于scikit-learn和TensorFlow)学习心得(18)--Polynomial Regression 多项式回归和学习曲线_带刀的骑士的博客-程序员秘密

假设我们的系统散点是这样的从图中可以看出,这个分布形似二次函数,只单纯的使用线性回归去拟合数据是肯定不合适的.所以说我们要把单纯的一次线性回归扩展成多次多项式回归.如何使线性回归扩展成多项式回归呢?一种简单的方法是将每个feature都扩展为多次项,然后在此扩展上训练线性模型。原线性回归方程是:y=a(x1)+b(x2)+1二次多项式方程是:y=c(x1)^2 +d(x2)^2+a(x1...

Objc_msgSend提示Too many arguments to function call, expected 0, have 2错误_南山锄头的博客-程序员秘密

首先说明下,在Xcode6之前运用objc_msgSend,是有参数提示的。但是从Xcode6之后,苹果不推荐我们使用runtime,所以就取消了参数提示功能。估计是不想让我们过多的了解底层。Xcode6之后我们运用objc_msgSend函数是这样的:从图中很明显可以看出来是没有参数提示的。我们可以通过对Xcode进行配置进行更改。更改如图:按照如上图的方式操作,搜索msg,并把YES改成NO即...

uniapp组件uni-file-picker中设置使用照相机和相册的权限_uniapp获取相机权限-程序员秘密

在uniapp中,使用uni-file-picker组件,设置照相机与相册的使用权限

随便推点

程序员的你_爱时晴天的博客-程序员秘密

当程序员的你明天你是否会想起,昨天你写的程序。明天你是否还惦记,经爱编程的你。领导们都已想不起,曾经加班的你。我也是偶然看程序,才想起同事的你。谁聘了牛B烘烘的你,谁安慰天天加班的你。谁把你的设计做起,谁给你做的升级。你从前总是很小心,从不把离职的事提起。你也曾无意中说起,薪水实在太低。那时候屏幕总是在闪,日子总过得太慢。你总说离职遥遥无期,转眼就各奔东

实现Postman+Newman+Git+Jenkins+钉钉/邮件提醒接口自动化测试持续集成_postman newman 钉钉_Vincent_Han的博客-程序员秘密

目录接口测试脚本一般的执行流程Windows系统Newman安装Centos系统Newman安装命令行执行Postman脚本生成测试报告Postman脚本持续集成发送钉钉通知解决jenkins上无法展示HTML样式的问题扩展学习 团队成员协作编写接口用例->用例归档到git/svn->脚本集成jenkins,在环境更新后自动触发执行或定时执行。当然git/SVN不熟悉也可以在本地文件操作。1、先下载安装nodejs (必须安装10.0以上的版本)从http://nodejs.cn/dow

精准医学 | 十篇文章读懂DNA甲基化与疾病(肿瘤)的关系_京神好eea8e7_易基因科技的博客-程序员秘密

DNA甲基化后可能导致染色体的结构发生改变,有可能通过关闭抑癌基因,从而导致肿瘤发生。近年来的大量研究表明,DNA异常甲基化与肿瘤的发生、发展、细胞癌变有着密切的联系。DNA甲基化水平(即甲基化谱)和特定基因甲基化程度改变可作为肿瘤诊断指标。那么DNA甲基化在不同癌症发生发展机制是什么呢?易基因小编整理了10篇相关研究文章,分享给各位!肿瘤早筛早诊01 膀胱癌作者巧妙运用了中山纪念医院(SYSMH)、癌症基因组图谱(TCGA)和基因表达总表(GEO)的研究数据,以及Mass...

解决Hibernate:could not initialize proxy - no Session_run_fasting的博客-程序员秘密

/******************************************************************************************************************/ 解决Hibernate:could not initialize proxy - no Session Hibernate单端关联懒加载策略:即在&amp;lt;one-to...

Numpy学习总结与梳理 ---- 参考两门课程《莫烦Python》《日月光华Python》【Numpy回顾总结】_MarToony|名角的博客-程序员秘密

莫烦PythonNumpyNumpy的数据类型:仅一种:np.array数组对象的创建方式&amp;属性方法调用规则Numpy的数组创建方式:np.array(list) 默认浮点数类型zeros(元组形式的shape)----zeros((3,4))empty(元组形式的shape)----有时生成0值,有时生成各种随机数。arange(起始数字,结束数字,步幅)----返回一维数组,常搭配reshaperandom.randn(元组形式的shape)----标准正态分布随机值。

SmallPython代码_python small_sha_ka的博客-程序员秘密

SmallPython 完整代码#include&lt;iostream&gt;#include&lt;string.h&gt;#include&lt;iterator&gt;#include&lt;stdlib.h&gt;#include&lt;stdio.h&gt;#include&lt;memory&gt;#include&lt;map&gt;#include&lt;ctyp...

推荐文章

热门文章

相关标签