ANDROID 通过监听来电去电,并弹出悬浮窗
要监听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);
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.width = 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 通过监听来电去电,并弹出悬浮窗的更多相关文章
- Android 应用监听自身卸载,弹出用户反馈调查
监听卸载情景和原理分析 1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇 ...
- Android 如何监听返回键,弹出一个退出对话框
android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ...
- [转]Android 如何监听返回键,弹出一个退出对话框
本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用 ...
- Android 另类方法监听软键盘的弹出收起事件
http://www.cnblogs.com/csonezp/p/5065624.html 最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且 ...
- vue 监听手机键盘是否弹出及input是否聚焦成功
//定义移动端类型 function pageStats() { let u = navigator.userAgent, app = navigator.appVersion; let obj = ...
- c# 获取移动硬盘信息、监听移动设备的弹出与插入事件
原文 http://www.cnblogs.com/coolkiss/p/3328825.html 备忘一下改功能,主要通过WMI来实现,对于监听外接设备的弹出和插入事件一开始使用IntPtr Wnd ...
- Android 高仿UC浏览器监控剪切板弹出悬浮窗功能
UC浏览器应该是android手机里 最流行的浏览器之一了,他们有一个功能 相信大家都体验过,就是如果你复制了什么文字,(在其他app中 复制也有这个效果!,所以能猜到肯定是监控了剪切板),就会弹出一 ...
- Android监听自身卸载,弹出用户反馈调查
1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各 ...
- js 监听手机端键盘弹出和收起事件
//这里区分不同系统,可以参考之前的文档记录 https://www.cnblogs.com/wind-wang/p/10737110.html const ua = typeof window == ...
随机推荐
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: SELECT command denied to user’
Linux环境 Mysql+Hibernate command denied to user 错误 错误信息 如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSynt ...
- BlockingQueue-线程的阻塞队列
BlockingQueue作为线程容器,可以为线程同步提供有力的保障,其主要用到的方法包括: add(E o); //将指定的元素添加到此队列中(如果立即可行),在成功时返回 true,其他情况则抛出 ...
- MVC3 IIS7部署记录
环境 系统:Win7 IIS:IIS7 开发工具:VS2010 MVC版本:ASP.NET MVC 3.0 注意 1.在部署MVC应用之前,一定要确保你的程序BIN文件夹下面是否包含 System.W ...
- Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)
描述 http://codevs.cn/problem/1040/ 与Codevs_1017_乘积最大很像,都是划分型dp. 给出一个字符串和几个单词,要求将字符串划分成k段,在每一段中求共有多少单词 ...
- Selenium终极自动化测试环境搭建(二):Selenium+Eclipse+Python
前面举例了Selenium+Eclipse+Junit+TestNG自动化测试环境的搭建,在前一篇的基础上,下面再举例Selenium+Eclipse+Python测试环境搭建. 第一步:安装Pyth ...
- 对使命召唤OL游戏中队友能相互救治的动作设定的感慨
很偶然的在网吧看到有人在玩一个枪战游戏,场景特别真实特别吸引人,后来留意到是使命召唤OL.我使用QQ帐号(是腾讯代理)玩了一次,觉得游戏做的确实精致,子弹打击效果和人物被子弹击中的效果特别真实,大家可 ...
- input hidden用法
之前获取数据传数据,都是写在全局变量里,今天老板告诉我说用input hidden来存,我百度了一下,确实是个好方法,记录之: 1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或 ...
- 作品第二课----点击DIV显示其内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android学习笔记(十一)BroadcastReceiver动态注册、注销示例
在上一篇博文中简单介绍了一下BroadcastReceiver的相关知识点,本篇举一个在代码中动态的注册.注销BroadcastReceiver的栗子. 1.首先创建一个MyReceiver并继承Br ...
- poj 1654 Area(多边形面积)
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17456 Accepted: 4847 Description ...