简单的说下实现来电秀的大概原理流程:首先通过监听来电状态,通过拦截来电然后在窗口弹出一层系统级别的弹窗,这层弹窗即是来电秀。

先来两张效果图:

下面来说下实现,因为商用的原因,不能直接贴代码,所以在这里,会贴一些比较核心的代码,大概分为五个步骤:

第一:监听来电状态

/*** 电话状态监听(来电或去电)* * @author Jenly* */
public class PhoneStateReceiver extends BroadcastReceiver {public static final String PHONE_STATE = "android.intent.action.PHONE_STATE";@Overridepublic void onReceive(Context context, Intent intent) {LogUtils.d(intent.getAction());context.startService(new Intent(context,CallShowService.class));}}

这是一个广播接收器,用来接收手机来电状态的,把接收到的状态发送给CallShowService服务来做相应的处理

第二:通过手机状态来做不同的处理

CallShowService.class是一个来电秀服务(CallShowService extends Service),里面的主要核心代码是通过监听来电状态来做出相应的处理,如:弹屏

下面是CallShowService几个比较核心的代码:

 @Overridepublic void onCreate() {super.onCreate();isRunning = true;initPhoneStateListener();callShowView = CallShowView.getInstance();} 
 /*** 初始化电话状态监听*/private void initPhoneStateListener(){phoneStateListener = new PhoneStateListener(){@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);phoneState = state;if(isEnable){//启用switch (state) {case TelephonyManager.CALL_STATE_IDLE://待机时(即无电话时,挂断时会调用)LogUtils.d("CALL_STATE_IDLE");dismiss();//关闭来电秀break;case TelephonyManager.CALL_STATE_OFFHOOK://摘机(接听)LogUtils.d("CALL_STATE_OFFHOOK");callShow();//显示来电秀break;case TelephonyManager.CALL_STATE_RINGING://响铃(来电)LogUtils.d("CALL_STATE_RINGING");isCalling = false;phoneNumber = incomingNumber;LogUtils.d("incomingNumber:"+ incomingNumber);//来电号码callShow();//显示来电秀break;default:break;}}}};//--------------------------telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);//设置监听器telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);}
 @Overridepublic int onStartCommand(Intent intent, int flags, int startId) {if(intent!=null && Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())){//去电phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);LogUtils.d("Calling..."+phoneNumber);isCalling = true;}return super.onStartCommand(intent, START_STICKY, startId);}

第三:来电秀界面的实现了

CallShowView 来电秀界面 (CallShowView extends View),里面弹屏的核心代码:

 private void initViews() {context = getContext();windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);int width = windowManager.getDefaultDisplay().getWidth();int height = windowManager.getDefaultDisplay().getHeight();// -------------params = new LayoutParams();params.gravity = Gravity.LEFT | Gravity.TOP;params.x = 0;params.y = 0;params.width = width;params.height = height;params.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;// 设置图片格式,效果为背景透明params.format = PixelFormat.TRANSLUCENT;// 设置Window flag 系统级弹框 | 覆盖表层params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 不可聚集(不让返回键) | 全屏 | 透明标状态栏params.flags = LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_FULLSCREEN| WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN ;initCalledView();}

第四:开机自动启动

/*** 自动启动* @author Jenly*/
public class AutoStartReceiver extends BroadcastReceiver {public static final String AUTO_START_RECEIVER = "jenly.autostart_action";@Overridepublic void onReceive(Context context, Intent intent) {LogUtils.d("AutoStartReceiver");if(!CallShowService.isRunning)startCallShowService(context, intent);}private void startCallShowService(Context context, Intent intent) {intent.setClass(context, CallShowService.class);context.startService(intent);}}

在CallShowService的生命周期里面需要加上一句核心的代码,保证CallShowService不被进程杀死,如下:

 @Overridepublic void onDestroy() {isRunning = false;sendBroadcast(new Intent(AutoStartReceiver.AUTO_START_RECEIVER));super.onDestroy();}

第五:注册这些四大组件和申请用到的一些权限

     <!-- 电话状态接收广播 --><receiver android:name=".service.PhoneStateReceiver" ><intent-filter><action android:name="android.intent.action.PHONE_STATE" /><action android:name="android.intent.action.NEW_OUTGOING_CALL" /></intent-filter></receiver><receiver android:name=".service.AutoStartReceiver" ><intent-filter android:priority="1000"><action android:name="android.intent.action.RECEIVE_BOOT_COMPLETED" /><action android:name="android.intent.action.USER_PRESENT" /><action android:name="jenly.autostart_action" /></intent-filter></receiver><service android:name=".service.CallShowService"android:enabled="true" >  <intent-filter android:priority="1000" >  <action android:name=".service.CallShowService" />  </intent-filter>  </service>
    <uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /><uses-permission android:name="android.permission.CALL_PHONE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 弹出窗口权限 --><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

这样来电秀算是基本实现了,简单的总结一下几个重要的点:

1、手机来电状态的监听拦截、

2、来去电弹屏、

3、开机启动保证弹屏服务不被后台杀死、

今天就先到这里了,后续会把来电秀界面的电话的接听与挂机也写出来。

Android之来电秀实现(一)相关推荐

  1. Android之来电秀实现(二)

    今天要说的主题是来电秀实现里面的电话接听与挂机,在这里我们需要用到ITelephony.aidl相关的一些文件, 如下图: 将如上文件导入到工程,去掉一些不需要的aidl关联,其中PhoneUtils ...

  2. Android 来电秀总结

    前言 效果图 TODO 参考文章 实现思想 申请权限 静态权限 动态权限 监听电话 BroadcastReceiver +悬浮窗显示实现 InCallService + Activity实现 最后 该 ...

  3. android 来电秀 开源,自定义来电秀Demo

    [实例简介] 完全自定义界面的来电秀demo,以各种方式显示自定义界面.详情请看 http://blog.csdn.net/likebamboo/article/details/14449881 [实 ...

  4. Android 实现仿360来电秀的功能

    公司项目中需要实现当有电话进来时,在来电界面显示这个手机号码的一些信息. 需要解决两个问题: 1.悬浮窗的问题    2.后台服务保活的问题 悬浮窗需要在解锁的状态下弹出,在锁屏的状态下也需要弹出. ...

  5. android 通话状态监听(自定义接听挂断按钮与通话界面,根据公司的业务逻辑可以实现自己的来电秀功能)...

    前言: 因为公司需求,要自定义一款来电秀的app当做周边产品来配合主营的app业务. 之前因为赶项目,没时间整理这块,现在项目告一段落了,现在回头看看感觉这个功能还是挺有意思的,比较有针对性.电话呼入 ...

  6. Android来电秀应用

    废话:接了个加急项目,要求10天完成一个类似来电秀的APP,看来领导是很相信我的技术的,哈哈,(内心OS:尼玛,臣妾做不到),然鹅并没有什么用,还是想想如何实现吧 ###项目步骤(技术难点拆分) * ...

  7. android实现来电动画,华为来电动画app-华为来电动画(透明来电秀)安卓版-幻想游戏网...

    华为来电动画app是一款非常好用靠谱的手机来电动画设置应用软件平台,在华为来电动画这款应用软件平台里它汇集了海量的潮流炫彩主题素材,用户可以随意选择自己喜欢的来电动画设置,你还在等待什么?大家赶快来点 ...

  8. Android设置来电壁纸,来电壁纸秀下载-来电壁纸秀 安卓版v1.0.7-PC6安卓网

    来电壁纸秀是一款特别炫酷的来电壁纸美化软件.来电壁纸秀app给大家准备了超级多的精美壁纸素材,来电壁纸秀不仅有无数的壁纸素材,而且来电壁纸秀app还有很多来电秀模板! 软件介绍 来电壁纸秀是一款来电秀 ...

  9. 手机来电秀怎么开启_360手机卫士怎么设置来电秀 360手机卫士来电秀设置方法...

    360手机卫士除了防护等安全功能外,它的来电秀也是比较火热的,很多朋友都喜欢在这里设置自己别具个性的来电秀,这篇文章就一起了解一下360手机卫士怎么设置来电秀. 360手机卫士来电秀设置是在[隐私保护 ...

最新文章

  1. 报表应用系列——图表JFreeChart: 第 4 章 折线图
  2. 第五章 python中正则表达式的使用
  3. Meizu M8 Preview
  4. IOS UITableView性能优化
  5. mysql错误用法insert into where
  6. oracle tranc,ORACLE TRUNC()函数
  7. php单文件短链接,php实现的短网址算法分享
  8. 设计赋能,数联杭温!2020温州“市长杯”·数字设计(杭州)专项赛开始报名啦!...
  9. android10获取imei,Android 10 root用户获取imei
  10. Android8.1 swap空间不够编译失败:ckati failed with: signal: interrupt
  11. 三菱plc编程有c语言吗,三菱plc编程用什么语言
  12. [裴礼文数学分析中的典型问题与方法习题参考解答]5.1.25
  13. 教你炒股票13:不带套的操作不是好操作!
  14. html是l面包屑效果,CSS制作面包屑
  15. Dubbo扩展点注解之@Adaptive
  16. Eclipse 下载带有WTP 相应插件板本的地址
  17. 国医馆项目(杂七杂八)
  18. 基本共射放大电路的动态分析以及放大电路Q点的稳定
  19. codeforces1718 A1.Burenka and Traditions (easy version)
  20. cannot be cast to javax.servlet.Servlet 解决

热门文章

  1. 深入浅出OOD(一)
  2. CRM系统优化线索转化率
  3. 应用与机遇 | 陀螺财经正式发布「2019年度内容精选报告(中)」
  4. JPA中No entity found for query
  5. 百度AI - 对接百度AI 增值税发票识别接口
  6. 利用swftools将pdf转换为swf小例
  7. [转载]近半年的读书总结
  8. 【考研】设计求二叉树 T 的 WPL 算法(2014-408真题)
  9. 干货 :建立软件的经济学分析框架,浅议开源软件的经济学特性(附图解)
  10. 对于Imbalance Data的总结