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)

相关推荐

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

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

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

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

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

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

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

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

  • Android仿通话来电界面效果

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

  • 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开发Flutter 桌面应用窗口化实战示例

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

  • 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

  • Android 画中画模式的实现示例

    画中画支持 Android 8.0(API 级别 26)允许以画中画模式启动 Activity.画中画是一种特殊类型的多窗口模式,最常用于视频播放.使用该模式,用户可以通过固定到屏幕一角的小窗口观看视频,同时在应用之间进行导航或浏览主屏幕上的内容. 画中画利用 Android 7.0 中的多窗口模式 API 来提供固定的视频叠加窗口.要将画中画添加到您的应用中,您需要注册支持画中画的 Activity.根据需要将 Activity 切换为画中画模式,并确保当 Activity 处于画中画模式时,

  • Android中实现视差滚动示例介绍

    什么是视差滚动? 视差滚动原本是一个天文学术语,当我们观察星空的时候,离我们比较远的星星移动速度比较慢,离我们比较近的星星移动速度比较快,当我们坐在车上向车窗外看的时候也会有这种体验,远处的群山似乎没有移动,但近处的行道树却在飞速掠过. 在工程设计中,视差滚动是指通过为背景图像设定比前景图像更慢的移动速度模拟现实世界中人类的视觉体验,从而在 2D 场景中产生深度的错觉,增加沉浸感. 以下是几个设计实例: 如何在 Android 中实现视差滚动? 首先创建一个新项目 新建 Android proj

随机推荐

其他