场景需求

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

开发思路

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

困难点

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

解决办法

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

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

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

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

相关代码

 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

Android自定义来电界面实现相关推荐

  1. Android N 来电界面

    本流程图基于MTK平台 Android 7.0,普通来电,本流程只作为沟通学习使用 通过前面 Android 7.0 Phone_MT来电流程 的流程分析中我们可以发现,最后是将来电的信息和状态传送到 ...

  2. andriod 自定义来电界面功能实现的一些思考

    转载:http://blog.csdn.net/likebamboo/article/details/14449881 由于近期所做一个项目需要做类似于"来电秀"的功能,所以上网搜 ...

  3. andriod 自定义来电界面功能实现的一些思考。

    原创博文,转载请注明出处:http://blog.csdn.net/likebamboo/article/details/14449881 由于近期所做一个项目需要做类似于"来电秀" ...

  4. android自定义设置界面,Android开发之精仿QQ设置界面(自定义PreferenceActivity)

    Android开发之精仿QQ设置界面(自定义PreferenceActivity) 时间:2011-12-05 10:25:06 来源:Android开发者门户 作者: 今天,再给大家分享一下QQ设置 ...

  5. android 自定义设置界面,Android 设置界面之 Preference

    Android系统为设置界面的UI提供了一系列的接口,设置界面的部分和Activity是分离的,会有一个PreferenceScreen的对象 是根目录,在其中会包含CheckBoxPreferenc ...

  6. android自定义打电话界面,两种Android打电话实现方法

    在android开发中,用户能够拨打电话是最基本的需求.俗话说"条条大路通罗马",实现拨打电话的方式有多种,今天,就提供最常用两种. 首先,拨打电话,对于用户来说,是一个耗费的操作 ...

  7. android 自定义关机界面,怎么定制Android关机界面

    在Android系统中,长按Power键默认会弹出对话框让你选择"飞行模式","静音","关机"等功能.这些功能对于手机非常适用,但是对于机 ...

  8. android 自定义关机界面,android源码探索之定制android关机界面的方法

    本文实例讲述了android源码探索之定制android关机界面的方法.分享给大家供大家参考.具体如下: 在Android系统中,长按Power键默认会弹出对话框让你选择"飞行模式" ...

  9. android notification应用之自定义来电通知

    android notification应用之自定义来电通知 1.为了实现老板的各种要求 本人矜矜业业完成任务 随着这个软电话软件的日益完善 本来来电的时候是创建一条通知点亮屏幕 用户可以解锁屏幕后接 ...

最新文章

  1. 关于程序猿的学习方法的一些总结
  2. Nature:最强癌基因找到了,居然不在染色体上 | 华人领衔最新研究
  3. 华为合作oppovivo小米鸿蒙,华为鸿蒙成功的关键:要让小米、OPPO、VIVO都用上鸿蒙...
  4. ds18b20温度传感器 lcd C语言,C程序控制18B20测温及LCD显示源码打包
  5. Cpp 对象模型探索 / 静态局部对象只构造一次的原因和执行析构的方法
  6. css实现3D立方体旋转特效
  7. 信息学奥赛一本通(1401:机器翻译)
  8. 2013q3 android ios 用户接入网络方式pv占比分布,2012年移动互联网发展分析.pdf
  9. 为什么java button 不能用 显示红色_Java中的整型包装类值的比较为什么不能用==比较?原因是因为缓存...
  10. Django ORM QuerySet集合对象的特性
  11. 贺利坚老师汇编课程35笔记:[BX+SI]和[BX+DI]寻址
  12. SQL Server 数据库的创建
  13. oracle 12c PDB 数据库 和mybatis 数据库连接池 的连接问题
  14. Instagram后端架构
  15. turtle八边形绘制
  16. Array王锐大神力作:osg与PhysX结合系列内容——第5节 角色动画效果(上)
  17. Vue如何将baes64格式的图片转成普通格式
  18. iOS 自动布局报错:Unable to simultaneously satisfy constraints.
  19. 城固一中2021高考成绩查询,汉中市各高中2020年高考喜报成绩一览
  20. 当BIM遇见建筑,设计灵感无限,欣赏有趣的BIM建筑

热门文章

  1. 路由器wan口和lan口短接_我把无线路由器的LAN口和WAN口用一根网线连接起来...
  2. tess4j linux so文件,linux tesseract 安装及部署tess4j项目的常见问题
  3. 软件测试EVT阶段,BVT、EVT、DVT、PVT产品开发几个阶段
  4. 电脑硬件故障维护小全(十一)
  5. vscode+mobaxterm实现服务器图形显示
  6. 服务器装系统bios设置方法,联想装系统bios设置方法介绍
  7. Google Cloud 线上课堂 | 解析勒索软件攻击链,看 Google Cloud 如何破局
  8. IC集成电路 测试与验证的区别?
  9. SteamVR 2.0 Unity插件使用指南
  10. webpack是干什么用的,以及它的优点