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

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

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;//如果有响铃状态,则表示此时为来电

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

                        //定义窗口布局

                        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);
                        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中申明如下

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

ANDROID 通过监听来电去电,并弹出悬浮窗的更多相关文章

  1. Android 应用监听自身卸载,弹出用户反馈调查

    监听卸载情景和原理分析 1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇 ...

  2. Android 如何监听返回键,弹出一个退出对话框

    android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ...

  3. [转]Android 如何监听返回键,弹出一个退出对话框

    本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用 ...

  4. Android 另类方法监听软键盘的弹出收起事件

    http://www.cnblogs.com/csonezp/p/5065624.html 最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且 ...

  5. vue 监听手机键盘是否弹出及input是否聚焦成功

    //定义移动端类型 function pageStats() { let u = navigator.userAgent, app = navigator.appVersion; let obj = ...

  6. c# 获取移动硬盘信息、监听移动设备的弹出与插入事件

    原文 http://www.cnblogs.com/coolkiss/p/3328825.html 备忘一下改功能,主要通过WMI来实现,对于监听外接设备的弹出和插入事件一开始使用IntPtr Wnd ...

  7. Android 高仿UC浏览器监控剪切板弹出悬浮窗功能

    UC浏览器应该是android手机里 最流行的浏览器之一了,他们有一个功能 相信大家都体验过,就是如果你复制了什么文字,(在其他app中 复制也有这个效果!,所以能猜到肯定是监控了剪切板),就会弹出一 ...

  8. Android监听自身卸载,弹出用户反馈调查

    1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各 ...

  9. js 监听手机端键盘弹出和收起事件

    //这里区分不同系统,可以参考之前的文档记录 https://www.cnblogs.com/wind-wang/p/10737110.html const ua = typeof window == ...

随机推荐

  1. 驱动程序环境搭配(VS2010 + WDK + VirtualDDK + VMware)good

    http://www.cnblogs.com/BoyXiao/archive/2011/07/31/2122755.html

  2. qt 原子操作 QAtomicInt(++和--都不是原子操作:都包含三条机器指令)

    ++和--都不是原子操作:都包含三条机器指令 http://sroply.blog.163.com/blog/static/17092651920106117251539/

  3. 关于v$sql_bind_capture 的问题

    ---先清空shared_pool SQL> alter system flush shared_pool; System altered. SQL> col value_STRING f ...

  4. 《华油能源OA系统数据同步和扩展的设计与实现_张宇峰》阅读笔记

    为什么我会找到这篇论文? 华油能源集团拥有多套信息化软件系统,每个用户需要登录操作多个软件系统,记住多个系统的用户名.密码,需要不停的切换到每个系统,查看是否有需要进行的工作:管理员更是疲于每天对各个 ...

  5. 【转】Fragment和Activity

    原文网址:http://www.cnblogs.com/mengdd/archive/2013/01/11/2856374.html Fragment和Activity的交互 一个Fragment的实 ...

  6. django 项目部署在 Apache 后, 设置二级域名(Apache虚拟主机 、 万网二级域名设置)

    上一篇文章简单说了怎么把django的项目部署到Apache上. 现在想弄个二级域名,也就是我原来有个域名 www.mysite.com,现在我想弄个 bbs.mysite.com ,该怎么做呢. 要 ...

  7. 基于WCF大型分布式系统的架构设计

    在大型系统中应用中,一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或多个表.而在架构设计中,各个功能模块相互之间的交互点 越统 ...

  8. C#读取json数据介绍

    //using System.Web.Script.Serialization; JavaScriptSerializer serializer = new JavaScriptSerializer( ...

  9. Silverlight的ComboBox 的绑定和取值

    Silverlight的ComboBox与winform中的ComboBox存在类似的地方,但也有不同之处,本章包含以下内容: 一.ComboBox 如何添加和绑定数据. 二.ComboBox 如何添 ...

  10. php 正则校验是否是域名

    /** * @description 匹配 * t.cn 正确 * t-.cn 错误 * tt.cn正确 * -t.cn 错误 * t-t.cn 正确 * tst-test-tst.cn 正确 * t ...