http://www.iteye.com/topic/1118711
最近因为项目的原因需要实现一个来电监听,且生成一个悬浮窗口提示相关信息(具体什么信息不方便透露哈)。
现把我的思路及实现方法大致说下哈。
想要监听来电首先需要要manifest中申明"android.permission.READ_PHONE_STATE"权限
-
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
还需要注册来电监听,目前我的处理方式是接收开机广播,然后在接收到广播后注册来电监听。接收开机广播需要有“android.permission.RECEIVE_BOOT_COMPLETED”权限,manifest中申明如下
-
<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
然后注册广播接收类
-
<receiverandroid:name=".PhoneBootReceiver">
-
<intent-filter>
-
<actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
-
</intent-filter>
-
</receiver>
PhoneBootReceiver中注册监听来电,首先得获取系统服务“TELEPHONY_SERVICE”
-
TelephonyManagertelM=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
然后添加监听
-
telM.listen(newTelListener(context),PhoneStateListener.LISTEN_CALL_STATE);
TelListener是自己定义的电话状态监听类,继承自PhoneStateListener,监听来电只需要实现onCallStateChanged(int state, String incomingNumber)方法。
咳咳...标题上说了弹出悬浮窗口,其实悬浮窗口就是在WindowManager中添加一个View,这个功能我也是在TelListener实现的。要想实现悬浮窗口,首先得有“android.permission.SYSTEM_ALERT_WINDOW”的权限,在manifest中申明如下:
-
<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>
WindowManager需要通过context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
来获取。
先把TelListener源码放出来,再详解
-
publicclassTelListenerextendsPhoneStateListener{
-
-
-
privateContextcontext;
-
privateWindowManagerwm;
-
privateTextViewtv;
-
publicTelListener(Contextcontext){
-
this.context=context;
-
}
-
-
@Override
-
publicvoidonCallStateChanged(intstate,StringincomingNumber){
-
//TODOAuto-generatedmethodstub
-
super.onCallStateChanged(state,incomingNumber);
-
if(state==TelephonyManager.CALL_STATE_RINGING){
-
-
wm=(WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
-
WindowManager.LayoutParamsparams=newWindowManager.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;
-
<spanstyle="white-space:pre;"></span>params.format=PixelFormat.RGBA_8888;
-
tv=newTextView(context);
-
tv.setText("这是悬浮窗口,来电号码:"+incomingNumber);
-
wm.addView(tv,params);
-
-
}elseif(state==TelephonyManager.CALL_STATE_IDLE){
-
if(wm!=null){
-
wm.removeView(tv);
-
}
-
}
-
}
-
}
state = TelephonyManager.CALL_STATE_RINGING表示有新的来电,state = TelephonyManager.CALL_STATE_IDLE表示电话中断(可能理解不是很准确,电话挂断的时候state会和TelephonyManager.CALL_STATE_IDLE相等)
定义窗口布局
-
WindowManager.LayoutParamsparams=newWindowManager.LayoutParams();
设置窗口类型在所有窗口之上
-
params.type=WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
别忘了
-
params.flags=WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
如果没有这句话的话,在生成悬浮窗口后,悬浮窗口后的界面上东西都不能点。这句话的目的是让悬浮窗口失去焦点。
背景透明
-
params.format=PixelFormat.RGBA_8888;
本例中悬浮窗口只是显示一个TextView其内容为“这是悬浮窗口,来电号码:xxxxxx”,最后将TextView添加到窗体中
在电话中断后将TextView移除,否则会一直显示的...
啦..本文就到这儿了...
“啥?要可移动的?”
要想可以拖动的话,那给TextView添加setOnTouchListener,实现OnTouchListener的onTouchListener方法。
对了,别忘了将
-
params.type=WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
修改为
-
params.type=WindowManager.LayoutParams.TYPE_PHONE;
因为TYPE_SYSTEM_OVERLAY的话是TextView获取不到输入焦点,也就没法拖动了哈。
这个例子只是监听来电,如果想监听去电的话,需要写一个Broadcast Receiver用来监听拨打电话时的系统广播“android.intent.action.NEW_OUTGOING_CALL”,而且需要在manifest中配置“android.permission.PROCESS_OUTGOING_CALLS”权限。在Broadcast
Receiver中可以通过intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)来获取拨出去的电话号码。剩下的应该就简单了。
分享到:
相关推荐
android仿苹果按钮,通过手势的判定实现简易悬浮按钮拖动。
主要介绍了Android广播接实现监听电话状态(电话的状态,拦截) 的相关资料,需要的朋友可以参考下
主要介绍了Android实现监听电话呼叫状态的方法,涉及Android权限控制及电话状态监听的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本篇文章主要介绍了Android监听系统来电并弹出提示窗口,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要给大家介绍了Android在Fragment中实现监听触摸事件的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
主要介绍了Android实现信号强度监听的方法,是Android手机中很常见的一个实用功能,需要的朋友可以参考下
Android中监听电话状态.zip
Android来去电监听,电话挂断
android 利用重力感应监听 微修改代码可以解决 来电时翻转手机后静音。
并为给出创建对话框之后 并为给出如何用户获取在对话框中做出选择后的数据 即如何监听用户做出的选择 接下来笔者将根据JavaDoc API文档引导读者详细的了解提示对话框 文本框对话框 简单列表对话框 单选项列表对话框 ...
Android中采用Service实现电话监听器并将监听到的内容上传到服务器案例!
通过AccessibilityService实现系统按键监听,可实现抢红包插件等.
android 后台监听按键事件方法及demoandroid 后台监听按键事件方法及demo
主要介绍了Android实现静态广播监听器的方法,涉及Android的广播机制与记录监听广播信息的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
主要介绍了Android中的webview监听每次URL变化实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
android NotificationListenerService 监听通知栏,android NotificationListenerService 监听通知栏 android NotificationListenerService 监听通知栏
Android实现监听连续点击事件源码
Android 实现短信发送 实现监听短信发送状态 对方是否已经接收到 并且保存至发件箱
实现手机电话状态的监听,主要依靠两个类:TelephoneManger和PhoneStateListener。 TelephonseManger提供了取得手机基本服务的信息的一种方式。因此应用程序可以使用TelephonyManager来探测手机基本服务的情况。应用...
Android 通过开启后台的服务达到监听来电和去电 源码