Android之来电秀实战示例

目录
  • 正文
  • 第一:监听来电状态
  • 第二:通过手机状态来做不同的处理
  • 第三:来电秀界面的实现了
  • 第四:开机自动启动
  • 第五:注册这些四大组件和申请用到的一些权限

正文

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

先来两张效果图:

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

第一:监听来电状态

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

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

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

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

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

@Override
	public void onCreate() {
		super.onCreate();
		isRunning = true;
		initPhoneStateListener();
		callShowView = CallShowView.getInstance();
	}
/**
	 * 初始化电话状态监听
	 */
	private void initPhoneStateListener(){
		phoneStateListener = new PhoneStateListener(){
			@Override
			public 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);
	}
@Override
	public 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";
	@Override
	public 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不被进程杀死,如下:

@Override
	public 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来电秀的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android如何帮助用户自动接听或者挂断来电

    这篇文章教你如何帮助用户自动接听或者挂断来电.当然并不是我原创的代码,我只不过是把stackoverflow上的一些代码整合了一下,做个代码的二传手. 源码 AcceptOrRejectCallDemo 源码中用了MVP的模式,只是最简单的使用,如果不熟悉的话刚好可以学学,逻辑部分在IncomingPresenter类中. 首先需要监听来电的广播 在AndroidManifest文件中添加: <receiver android:name=".incomingcall.PhoneListen

  • Android 自定义来电秀实现总结

    目录 前言 实现思想 申请权限 静态权限 动态权限 监听电话 BroadcastReceiver +悬浮窗显示实现 InCallService + Activity实现 前言 该文章为对工作中部分业务实现的总结,阅读时间:20分钟,版本:Android 6.0 - 9.0 update time 2021年02月03日11:48:55 文章可能存在不足之处,还望评论批评,一起学习进步. 要想实现自定义 来电秀,首先我们先这样 再这样,然后你这样,最后你再这样一下,就可以了,很好实现的,听懂了么?

  • Android8.1 通过黑名单屏蔽系统短信和来电功能

    前言 同样的最近有个新需求,需要将8.1 设备的来电功能和短信功能都屏蔽掉,特殊产品就是特殊定制,那就开始吧. 屏蔽短信功能 还可沿用之前的6.0 处理方法, 在 SmsReceiverService.java 中 handleSmsReceived()中进行拦截分发 但是想了想这次准备搞点不一样的,我发现通讯录和之前6.0不太一样,8.1有个添加屏蔽联系人的功能,能够屏蔽指定电话和短信,也就是黑名单功能.所以此次就通过黑名单的方式进行拦截,通过下面几位老哥的详尽分析和打印日志找到修改地方 源码

  • Android来电拦截的实现方法

    本文实例为大家分享了Android来电拦截的方法,供大家参考,具体内容如下 权限 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android

  • Android来电监听和去电监听实现代码

    我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开 1.监听来电去电有什么用? 2.怎么监听,来电去电监听方式一样吗? 3.实战,有什么需要特别注意地方? 监听来电去电能干什么 1.能够对监听到的电话做个标识,告诉用户这个电话是诈骗.推销.广告什么的 2.能够针对那些特殊的电话进行自动挂断,避免打扰到用户 来电去电的监听方式(不一样的方式) 1.来电监听(PhoneStateListener) 来电监听是使用PhoneStateListener类,使用方式

  • Android监听系统来电并弹出提示窗口

    1.问题 项目中有自己企业的通讯录,但是在应用中拨打公司通讯录的联系人,由于手机通讯录中没有相应的信息,只显示一串电话号 2 .目的 监听系统来电,获取到电话号码,通过调用接口,查询出来相应电话号码的详细信息,并弹出系统悬浮框,给用户提示. 3.实现 首先 注册广播监听系统来电.监听系统来电需要.注册相应的权限 代码地址:https://github.com/sdsjk/phone_alert.git <uses-permission android:name="android.permi

  • Android仿通话来电界面效果

    Android仿通话来电界面,供大家参考,具体内容如下 简介:开发中需要模拟来电时的通话界面,仿照来电界面实现来电时播放铃声,界面通过动画模拟来电动效. 效果图: 自定义图片背景,图片由小变大的动态效果. shap_circle.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/androi

  • Android之来电秀实战示例

    目录 正文 第一:监听来电状态 第二:通过手机状态来做不同的处理 第三:来电秀界面的实现了 第四:开机自动启动 第五:注册这些四大组件和申请用到的一些权限 正文 简单的说下实现来电秀的大概原理流程:首先通过监听来电状态,通过拦截来电然后在窗口弹出一层系统级别的弹窗,这层弹窗即是来电秀. 先来两张效果图: 下面来说下实现,因为商用的原因,不能直接贴代码,所以在这里,会贴一些比较核心的代码,大概分为五个步骤: 第一:监听来电状态 /** * 电话状态监听(来电或去电) * * @author Jen

  • Android开发Flutter 桌面应用窗口化实战示例

    目录 前言 一.应用窗口的常规配置 应用窗口化 自定义窗口导航栏 美化应用窗口 二.windows平台特定交互 注册表操作 执行控制台指令 实现应用单例 三.桌面应用的交互习惯 按钮点击态 获取应用启动参数 四.写在最后 前言 通过此篇文章,你可以编写出一个完整桌面应用的窗口框架. 你将了解到: Flutter在开发windows和Android桌面应用初始阶段,应用窗口的常规配置: windows平台特定交互的实现,如:执行控制台指令,windows注册表,应用单例等: 桌面应用的交互习惯,如

  • Vue技巧Element Table二次封装实战示例

    目录 前言 思考 实践 filterPane.vue 明确目标 传入数据结构整理 timeSelect elinput elselect 开始封装 tablePane.vue 明确目标 传入数据结构整理 tool cols pageData operation tablePane.vue配置项Cols详解 开始封装 实战 结尾 前言 由于重构后台管理项目中有好多表格页面, 举个栗子 这表格看着还挺好看,写起来叫人直呼XX,多动脑子少掉发,少走弯路多省鞋. 写了一个后感觉太麻烦了,于是我奋笔疾书,

  • Android 获取随机验证码功能示例

    验证码功能在各大网站都能用到,下面小编通过实例代码给大家分享Android 获取随机验证码功能,具体代码如下所示: package cn.hk.image; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; impo

  • Android编程之SurfaceView学习示例详解

    本文实例讲述了Android编程之SurfaceView学习示例.分享给大家供大家参考,具体如下: SurfaceView是View的子类,使用的方式与任何View所派生的类都是完全相同的,可以像其他View那样应用动画,并把它们放到布局中. SurfaceView封装的Surface支持使用本章前面所描述的所有标准Canvas方法进行绘图,同时也支持完全的OpenGL ES库. 使用OpenGL,你可以再Surface上绘制任何支持的2D或者3D对象,与在2D画布上模拟相同的效果相比,这种方法

  • Android Material Design 阴影实现示例

    本文介绍了Android Material Design 阴影实现示例,分享给大家,具体如下: 让 View 产生阴影有以下 4 种方式: 控制 elevation 使用 OutlineProvider 使用 9 图 使用 MD 风格的控件,如 CardView,FloatingActionButton 0.Z轴的概念 Android 在 5.0 及以后采用了 Material Design 设计语言,引入了 Z 轴的概念,也就是垂直于屏幕的轴,Z 轴会让 View 产生阴影的效果: 想象有一束

  • c# 实现语音聊天的实战示例

    一.语音聊天说专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点: (1)时效性:视频直播会因为带宽问题有时出现延迟高的问题,而语音直播相对来说会好很多,延迟低,并且能够第·一时间与听众互动,时效性强. (2)隐私性:这一点体现在何处,如主播不想暴露自己的长相,或者进行问题回答是,没有视频的话会让主播感到更安心,所以语音直播隐私性更强. (3)内容质量高:因为语音直播不靠"颜值"只有好的内容才能够吸引用户,所以语音直播相对来说内容质

  • Opencv 图片的OCR识别的实战示例

    一.图片变换 0.导入模块 导入相关函数,遇到报错的话,直接pip install 函数名. import numpy as np import argparse import cv2 参数初始化 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required = True, help = "Path to the image to be scanned") arg

  • Android 照片选择区域功能实现示例

    实现 Android 的照片选择区域功能 主要有参考 pqpo/SmartCropper 1, 显示 显示四条边和八个点, 八个点: 4 个角和 4 条边的中点 /* 裁剪区域, 0, 左上 -> LeftTop, 1, 右上 -> RightTop, 2, 右下 -> RightBottom, 3, 左下 -> LeftBottom */ Point[] mCropPoints; // 4 条边的中点 Point[] mEdgeMidPoints; 绘制 protected vo

  • Android实现微信登录的示例代码

    目录 一.布局界面 二.MainActivity.java 微信登录的实现与qq登录类似.不过微信登录比较麻烦,需要拿到开发者资质认证,花300块钱,然后应用的话还得有官网之类的,就是比较繁琐的前期准备工作,如果在公司里,这些应该都不是事,会有相关人提前准备好.在这里我们已经拿到了开发者认证,并且申请到了微信登录的授权. 现在直接介绍mob来实现微信登录的代码,并获取微信的相关数据,比较简单. 一.布局界面 布局界面只需要一个button来触发授权就可以 <Button android:id=&qu

随机推荐