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     }
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

posted @ 2015-06-28 16:46  程序媛小天  阅读(4726)  评论(0编辑  收藏  举报