ANDROID 经过监听来电去电,并弹出悬浮窗

要监听android打电话和接电话,有一种的是经过新建一个Receiver继承自BroadcastReceiver。java

还有一种也可经过PhoneStateListener来实现。今天就说说后面一种,废话不说了,直接上代码android

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.webphone;
import org.apache.http.message.BasicNameValuePair;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.WindowManager;
import android.widget.TextView;
 
public class TelListener extends PhoneStateListener {
         
         private Context context;
         private WindowManager wm; //系统管理
         private TextView tv; //悬浮窗文本
         private Boolean isInComing= false ; //标记是否为来电
         public TelListener(Context context){
                 this .context = context;
         }
         @Override
         public void onCallStateChanged( int state, String incomingNumber) {
                 switch (state)
                 {
                 case TelephonyManager.CALL_STATE_RINGING: //此时为响铃状态
                     {
                         isInComing= true ; //若是有响铃状态,则表示此时为来电

                        //如下代码为悬浮窗显示来电号码web

                        //定义窗口布局
apache

                         wm = (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 

                        WindowManager.LayoutParams params = new WindowManager.LayoutParams();  ide

                        //设置窗口布局居于全部之上
布局

                        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;  this

                        //使窗口失去焦点spa

                         params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
                         params.width = WindowManager.LayoutParams.WRAP_CONTENT; 

                        params.height = WindowManager.LayoutParams.WRAP_CONTENT;  code

                        //背景透明
orm

                         params.format = PixelFormat.RGBA_8888;
                         tv = new TextView(context);
                         String comingNum=  GetInComingNumber();
                         tv.setTextSize( 40 );
                         tv.setText( "来电" +comingNum);
                         wm.addView(tv, params); //添加到系统窗口中。
                     } break ;
                 case TelephonyManager.CALL_STATE_OFFHOOK: //若是处于忙时状态
                     {
                         if (!isInComing) //若是非来电状态,则标记为去电
                         {
                             if (wm != null )
                                 wm.removeView(tv);

                            //如下代码为悬浮窗显示去电号码

                             wm = (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
                             WindowManager.LayoutParams params = new WindowManager.LayoutParams(); 
                             params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; 
                             params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
                             params.width = WindowManager.LayoutParams.WRAP_CONTENT; 
                             params.height = WindowManager.LayoutParams.WRAP_CONTENT; 
                             params.format = PixelFormat.RGBA_8888;
                             tv = new TextView(context);
                             tv.setTextSize( 40 );
                             //获取实际去电号码,此处使用自定义方法,(这边去电号码本身想办法保存)
                             String outcomingNum=AppData.getRealNum();
                             tv.setText( "去电" + outcomingNum);
                             wm.addView(tv, params);
                             isInComing= false ; //标记为非来电
                         }
                     } break ;
                 case TelephonyManager.CALL_STATE_IDLE:
                     {
                         if (wm != null && tv!= null )
                             wm.removeView(tv);
                     } break ;
                 }
                 super .onCallStateChanged(state, incomingNumber);
         }
}

固然了,虽然代码是OK了,可是记得配置好权限。

1
< uses-permission android:name = "android.permission.READ_PHONE_STATE" ></ uses-permission >

虽然如此,既然是弹出悬浮窗,那也该配置下弹出悬浮窗的权限吧。

1
< uses-permission android:name = "android.permission.SYSTEM_ALERT_WINDOW" />

都好了,那最重要的一步可别忘记了,在启动的时候添加监听,而且注册广播。

1
2
3
TelephonyManager telM = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
       //设置监听
       telM.listen( new TelListener( this .getContext()), PhoneStateListener.LISTEN_CALL_STATE);

还要在AndroidManifest.xml中注册广播接收类

1
2
3
4
5
< receiver android:name = ".PhoneBootReceiver" >
             < intent-filter >
                     < action android:name = "android.intent.action.BOOT_COMPLETED" />
             </ intent-filter >
     </ receiver >

若是想要接收开机广播,而后在接收到广播后注册来电监听。接收开机广播须要有“RECEIVE_BOOT_COMPLETED”权限,AndroidManifest.xml 中申明以下

 

1
< uses-permission android:name = "android.permission.RECEIVE_BOOT_COMPLETED" />

 

其实android API自己是没法监听去电的,这只是一种转弯的方法。。

PS:在转个弯,你就能够实现来电归属地查询了。。

目前个人处理方式是接收开机广播,而后在接收到广播后注册来电监听。接收开机广播须要有“android.permission.RECEIVE_BOOT_COMPLETED”权限,manifest中申明以下

本文从百度空间搬家到博客园。。

相关文章
相关标签/搜索