拦截来电消息的方式有两种:
1、通过接收广播消息。需要Context.registerReceiver(..., TelephonyManager.ACTION_PHONE_STATE_CHANGED);
2、通过注册监听器。需要TelephonyManager.listen(PhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
下面用第一种方法,进行演示!

AndroidManifest.xml

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/><receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
<pre style="font-family: 宋体; font-size: 9pt; background-color: rgb(255, 255, 255);">

注册监听器

        mMyReceiver = new MyReceiver();Log.e(TAG, "registerReceiver() mMyReceiver=" + mMyReceiver);IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);intentFilter.setPriority(Integer.MAX_VALUE);Intent intent = registerReceiver(mMyReceiver, intentFilter);Log.e(TAG, "registerReceiver() intent=" + intent);

注销监听器

        unregisterReceiver(mMyReceiver);Log.e(TAG, "unregisterReceiver() mMyReceiver=" + mMyReceiver);

实现监听器

public class MyReceiver extends BroadcastReceiver {public final String TAG = "MyReceiver";private WindowManager mWinMgr;private TextView mTxtView;public MyReceiver() {}@Overridepublic void onReceive(Context context, Intent intent) {Log.e(TAG, "intent.action=" + intent.getAction());if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {String phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);int state = telephony.getCallState();Log.e(TAG, "state=" + state + ",phoneNumber=" + phoneNumber);switch (state) {case TelephonyManager.CALL_STATE_RINGING:Log.e(TAG, "CALL_STATE_RINGING=" + state);mWinMgr = (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;params.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;params.width = WindowManager.LayoutParams.WRAP_CONTENT;params.height = WindowManager.LayoutParams.WRAP_CONTENT;params.format = PixelFormat.RGBA_8888;mTxtView = new TextView(context);mTxtView.setText("悬浮窗,来电号码:" + phoneNumber);//mTxtView.setBackgroundColor(0x00000000);mTxtView.setTextColor(0xFFFFFFFF);mWinMgr.addView(mTxtView, params);break;case TelephonyManager.CALL_STATE_OFFHOOK:Log.e(TAG, "CALL_STATE_OFFHOOK=" + state);if (mWinMgr != null) {mWinMgr.removeView(mTxtView);}break;case TelephonyManager.CALL_STATE_IDLE:Log.e(TAG, "CALL_STATE_IDLE=" + state);if (mWinMgr != null) {mWinMgr.removeView(mTxtView);}break;default:Log.e(TAG, "default state=" + state);if (mWinMgr != null) {mWinMgr.removeView(mTxtView);}break;}}}
}

效果

额外说明

将TextView替换成VideoView,便可以将文本显示替换成视频播放了。示例代码如下:

                    String path = Environment.getExternalStorageDirectory().getPath();Uri uri = Uri.parse(path + File.separator + "1.mp4");mView = new VideoView(context);mView.setVideoURI(uri);mView.start();

如果商用,还需要再考虑如果几点:
1、来电视频,可以从网络上获取,本次如果获取不及,应该本次取,下次用。
2、来电视频,跟原有的来电铃声有重叠,应该将原有铃声停掉。
3、来电视频的位置和大小,需要产品的角度,仔细考虑下。

参考:http://blog.csdn.net/forlong401/article/details/19126875

Android来电,显示悬浮窗相关推荐

  1. uniapp 来电显示悬浮窗插件(支持锁屏来电) Ba-CallerID

    简介(下载地址) Ba-CallerID 是一款来电显示悬浮窗插件插件. 支持显示.隐藏 支持锁屏来电显示 支持自定义位置显示(上.中.下) 支持拖动(这版不支持,需要的话可以加) 支持申请.判断悬浮 ...

  2. Android无需权限显示悬浮窗, 兼谈逆向分析app

    前言 最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android. ...

  3. Android越过悬浮窗权限显示悬浮窗

    文/Shawon(简书作者) 原地址 http://www.jianshu.com/p/167fd5f47d5c ,经验证,此方法可以越过大多数手机的悬浮球权限. 但是对MIUI8无效,MIUI8中应 ...

  4. WindowManager解析(二)Android悬浮框无法弹出输入法的原因和无需权限显示悬浮窗

    Android悬浮框无法弹出输入法 最近要研究悬浮窗方面的东西,遇到一个问题,我的悬浮窗里面有一个输入框,但是不弹出输入法,后来找到一个方法: 在WindowManager的实例获取方式不对,之前是这 ...

  5. android悬浮动态权限,android应用内悬浮窗-自动贴边,不需要权限!

    简单基于注释的API来处理运行时6.0权限配置 热门度(没变化) 10.0/10 (没变化) ">10.0 活跃度(没变化) 0.8/10 (没变化) ">0.8 Wa ...

  6. Android中自定义悬浮窗

    有时候,我们可能会需要制作一个始终悬浮的窗口显示一些关键信息.它独立于我们的页面,可以在不妨碍用户操作的情况下显示信息.这里我们就学习一下悬浮窗的做法. 1.WindowManager的常用方法 ge ...

  7. Android全屏悬浮窗画布,使用WindowManager实现Android悬浮窗

    WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象. 每一个WindowMan ...

  8. Android 实现Service悬浮窗监听实时网速

    我们都知道Android 的Service一般情况下是没有界面的,也就是运行在后台看不见的地方,实际上Service也可以是可见的,这篇文章简单记录一下如何让Service可见. 在安卓8以后显示悬浮 ...

  9. 小米手机如何显示悬浮窗

    每个android开发者最蛋疼的事情估计应该就是各种手机的适配兼容的问题了,特别是适配小米和魅族的,没办法,别人 有技术就是任性,我们只能忧伤的慢慢搞去. 今天做的应用悬浮窗在小米上不能出现(放在se ...

  10. Android纯java悬浮窗,android 悬浮窗

    以重绘状态栏,遮盖状态栏为例:java 一.设置 WindowManager.LayoutParams 属性android public static WindowManager.LayoutPara ...

最新文章

  1. 长沙网络推广浅析影响网站收录的因素有哪些?该如何做的更好?
  2. Go安装web框架revel
  3. 处理业务代码中循环遍历出现的性能问题
  4. python进行linux编程,Python之函数进阶
  5. ROS入门笔记(四):ROS实践(小海龟仿真)— ROS Topics
  6. python标准数据库接口是_Python 数据库接口模块_python 数据库模块_python 数据库接口...
  7. HDOJ---1874 畅通工程续[最短路径问题-Dijkstra算法]
  8. 服务治理---限流(令牌桶算法)
  9. NDK开发简单demo
  10. Linux之Shell编程学习总结
  11. oracle dbca静默安装,dbca 静默安装
  12. 软件开发应遵循的原则
  13. 信息隐藏——二值图像的信息隐藏
  14. 语音信号处理初学者概念总结
  15. iOS安全-测试内容
  16. python123第五周随机密码生成_利用Python生成随机密码
  17. Android OpenCV实现文字识别
  18. JS特效教程,学完即精通
  19. 看到一个想收藏的的AJAX小列子
  20. 数据结构最短路径例题_《数据结构课程设计》最短路径问题实验报告

热门文章

  1. 小米/红米手机如何通过USB数据线把手机网络共享给电脑
  2. 简易四六级刷题网站(一键帮你对答案)
  3. 施普林格(Springer)免费书籍
  4. 变压器的这些特性,你了解多少?
  5. 基于JAVA东理咨询交流论坛计算机毕业设计源码+系统+数据库+lw文档+部署
  6. 目标检测---以制作yolov5的数据集为例,利用labelimg制作自己的深度学习目标检测数据集(正确方法)
  7. Ubuntu 安装sogo输入法
  8. 二叉搜索树(平衡二叉搜索树)
  9. w11 php 环境变量
  10. android自定义相机带方框,Android摄像头开发:拍照后添加相框,融合相框和图片为一副 图片...