Android自定义来电界面实现

场景需求

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

开发思路

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

困难点

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

解决办法

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

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

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

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

相关代码

 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     }

监听权限:

 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>

项目源码

源码.zip

时间: 2024-10-06 11:35:18

Android自定义来电界面实现的相关文章

Android软件开发之盘点自定义View界面大合集(二)

Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的自定义View界面的绘制 今天我用自己写的一个Demo 和大家详细介绍一个Android中自定义View中的使用与绘制技巧. 1.自定义view绘制字符串 相信在实际开发过程中必然很多地方都须要用到系统字 为什么会用到系统字? 方便 省内存 我相信做过J2ME游戏开发的朋友应该深知内存有多么多么重要 而且使用它还可以带来一个更重要的好处就是很方

android 自动拒接后再取消自动拒接,该联系人来电界面无图标显示,且点击挂断无反应

1.    设置一个联系人为自动拒接 2.    该联系人来电 3.    取消该联系人的自动拒接 4.    该联系人来电 Error: 来电界面无头像显示,直接显示黑屏,且点击拒接按钮出现通话过程的界面,而实际后台已经挂断 修改CallNotifier.java文件中onDisconnect()方法中以下位置添加如下代码: if (!mIsShouldSendtoVoicemail && ok2Ring) { Toast.makeText(PhoneApp.getInstance().

Android 4.4来电界面InCallUI

有个客户要让来电界面适应他们提供的皮套,这样的话,就要根据皮套的开窗来调节来电界面.而来电界面并不是在Dialer代码中,而是在pacakage/apps/InCallUI中,调节对应的布局文件. 编译的时候也要注意,不可以单独模块编译InCallUI,模块编译Dialer就会把InCallUI编译进去了.

android 自己主动拒接后再取消自己主动拒接,该联系人来电界面无图标显示,且点击挂断无反应

1.    设置一个联系人为自己主动拒接 2.    该联系人来电 3.    取消该联系人的自己主动拒接 4.    该联系人来电 Error: 来电界面无头像显示,直接显示黑屏,且点击拒接button出现通话过程的界面,而实际后台已经挂断 改动CallNotifier.java文件里onDisconnect()方法中下面位置加入例如以下代码: if (!mIsShouldSendtoVoicemail && ok2Ring) { Toast.makeText(PhoneApp.getI

Android 自定义View视图

创建全新的视图将满足我们独特的UI需求. 本文介绍在指南针开发中会用到的罗盘的界面UI,通过继承View类实现的自定义视图,以此来深刻了解自定义视图. 实现效果图: 源代码: 布局文件activity_main(其中CompassView继承View类): <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.

android自定义日历

前几天闲来无事,变想做一些小工具玩玩.花了一天多的时间,弄出一个简单日历的View.分为月份模式和星期模式.滚动查看,先上图看看: 上面的是显示的是月份的模式.下面是星期的模式: 一个很简单的自定义View,然后通过Viewpager的OnpageChangeListener进行刷新View的数据.Viewpager通过轮回使用View.我默认设置是5个.可以左右无限切换. 下面是自定义CalendarView: package com.example.calendar; import andr

Android自定义相机超详细讲解

Android自定义相机超详细讲解 转载请标明出处: http://blog.csdn.net/vinicolor/article/details/49642861: 由于网上关于Android自定义相机的文章写得不是太详细,Google官方的文档又说得不太容易理解,所以今天我来详细讲解一下Android自定义相机. 这篇文章主要写给一些刚刚接触Android的那些看官方API困难以及不太了解Android机制的同学们,所以熟练开发者可以绕道了. 最近在使用Camera类的时候发现居然被弃用了,

Android 自定义 ViewPager 打造千变万化的图片切换效果

Android 自定义 ViewPager 打造千变万化的图片切换效果 标签: Android自定义ViewPagerJazzyViewPager 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPa

【转】android 自定义ViewPager,修改原动画

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPager的切换效果觉得枯燥,形成了审美疲劳~~我们需要改变,今天教大家如何改变ViewPager 切换时的效果,实现个性化的图片切换~~ 看一下这样效果的图片切换: 是