场景需求
在手机来电时,有时不方便接听电话,希望能点触屏幕达到静音的效果,稍候再接听电话。
开发思路
首先得获得手机来电的事件,进而监听屏幕的点击事件,让手机铃声静音
困难点
手机来电事件,是系统中优先级最高的,第三方的应用无法更改系统自带的来电功能。
解决办法
查阅了网上一些通用的做法,下载了一些来电显示的应用,通过观察发现,目前大家的做法普遍是:
首先后台始终有一服务,监听来电事件,当来电时,跳转到第三方应用的界面,在此界面上进行来电
页面的优化,比如可以接听、挂断电话,界面做的比系统自带的更好看...其实此时系统自带的来电也在
后台跑着,只是如果在我们的应用中接听或挂断了电话,系统中的事件也就关了。
相关代码
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>
项目源码
时间: 2024-10-06 11:35:18