在 Android 应用中监测来电信息

简介: 本文讲的是在 Android 应用中监测来电信息,你知道么,即使你的 Android 应用是关闭状态,也可以在应用中取到来电信息的。
本文讲的是在 Android 应用中监测来电信息,

目标

本文的主要目标是监测 Android 中的来电状态信息。

你想在你的 Android 应用中监测来电状态和来电号码么?

你在处理通话、摘机、空闲状态时无从下手么?

你想在收到来电、摘机(接听时的状态)或空闲(挂机状态)时做一些事情么?

我最近搞的一个大工程中必须要用到监测电话信息。

如果你想知道我如何实现的话,就继续读下去吧。.

即使应用关闭也可以监测来电信息

你知道么,即使你的 Android 应用是关闭状态,也可以在应用中取到来电信息的。

这很酷,是吧?现在让我们看看该 “怎么做” !

关键点在于 Receiver

你听说过 Android 里面的 receiver 么?

如果听说过的话,那么你会很容易的弄清楚手机状态这个概念的。

当然,没听说过也不要担心,我会告诉你 receiver 是什么以及如何在应用中使用它。

RECEIVER 到底是个什么鬼东西?

Broadcast receiver 帮助我们接收系统或其他应用的消息。

Broadcast receiver 响应来自系统本身或其他应用的广播信息(intent、event等)。

点击以下链接获取更多知识:

在我们的应用里创建一个 Broadcast Receiver 需要执行以下两步:

  1. 创建 Broadcast Receiver
  2. 注册 Broadcast Receiver

让我们先在 Android Studio 里建立一个带有空白 Activity 的简单工程。

如果你第一次接触 Android studio 不知道如何创建新工程的话,点击以下链接:

让我们创建并注册 BROADCAST RECEIVER

创建一个名为 PhoneStateReceiver 的 Java 类文件,并继承 BroadcastReceiver 类。

要注册 Broadcast Receiver的话,需要将以下代码写入 AndroidMainifest.xml 文件

<receiver android:name=".PhoneStateReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

注意

你必须在 <application>标签内写这几行代码.

我们的主要目的是接收通话广播,所以我们需要将 android.intent.action.PHONE_STATE 作为 receiver 的 action。

你的 AndroidMainifest.xml 文件应该和下图一样:

Phone State Receiver

漂亮!我们成功的在项目中加入了一个 Broadcast Receiver。

你得到权限了么?

为了在应用中接收手机的通话状态广播,你需要取得对应的权限。

我们需要在 AndroidManifest.xml 文件中写入以下代码来获取权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

现在你的 AndroidManifest.xml 应该和下面这张图一样了

Read Phone State

关于 onReceive() 方法的来龙去脉

现在让我们将目光转回到 继承了 BroadcastReceiver 的 PhoneStateListener 类中。

在这个类中我们需要重写 onReceive(Contex context, Intenet intent) 方法,因为在基类(BroadcastReceiver)中这个方法是抽象方法(abstract method)。

你对 onReceive() 方法了解多少呢?

如果我让你天马行空的想象一下这个方法的作用,你会怎么猜呢?

提示: 它的名字已经解释了一切。

加油……努力……你离答案只有一步之遥了……

是的,就是你猜的那样。onReceive() 使用 Intent 对象参数来接收每个消息。我们已经声明并在 AndroidManifest.xml 中注册了Broadcast Receiver。

现在,让我们将目光转向 PhoneStateReciver.java 文件来看看我们要在 onReceive() 方法中做些什么。

public void onReceive(Context context, Intent intent) {

    try {
        System.out.println("Receiver start");
        Toast.makeText(context," Receiver start ",Toast.LENGTH_SHORT).show();
    }
    catch (Exception e){
        e.printStackTrace();
    }

}

我们已经做了一堆准备工作了,你觉得我们现在是不是可以检测到通话状态了呢?

先自己想一想。

目前只要收到来电就会弹出一个显示 Receiver start 消息的 toast,我们也会在控制台中收到同样的消息,因为我们已经将其输出到控制台中。 Receiver Start

但……

我们无法得知准确的通话状态,我们的目标是取到如下的状态:

  • 响铃
  • 摘机
  • 空闲

保持冷静,继续探索手机状态

那我们要怎么做来取到电话状态信息呢? 你听说过 Android 里面的 Telephony Manager 么?

如果你对 Telephony Manager 不熟悉的话,别担心。我会教你什么是 Telephony Manager 以及如何用它取到通话状态的。

Telephony Manager 会将来自 Android 设备电话的全部状态信息告诉你。利用这些状态我们可以做许多事。

想了解更多关于 Telephony Manager 的知识,请点以下链接:

我们可以通过 TelephonyManager.EXTRA_STATE 来取得当前通话状态。它会用一个 String 对象来返回当前通话状态。

以如下方式新建一个 String 对象来获取不同的通话状态信息:

String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

要获取不同的状态,我们可以用下面的代码达到目的:

if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
    Toast.makeText(context,"Ringing State Number is -"+incomingNumber,Toast.LENGTH_SHORT).show();
}
if ((state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK))){
    Toast.makeText(context,"Received State",Toast.LENGTH_SHORT).show();
}
if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
    Toast.makeText(context,"Idle State",Toast.LENGTH_SHORT).show();
}

现在我们的 PhoneCallReceiver 类应该如下所示:

Broadcast Receiver

是的,我们成功了!!!

我们成功达到了目标,你可以用模拟器或真机来检验一下成果。

如果你不知道如何打开模拟器的话,按照下面的步骤来:

  1. 打开 Android studio
  2. 点击 Android Device Monitor。如果你找不到 Android Device Monitor 的话,看下面这张截图。

Android Device Moniter

下面这张图会显示如何操作模拟器

Emulator Control

如果你使用新版本的 Android Studio (2.1 +) 或者你有最新的 HAXM 那你要跟着下面这张图来

Phone Device

就酱。你可以用模拟器来监测通话状态了,下面的截图显示了运行结果。

结果 1. 来电状态

Incoming Call State

结果 2. 接听状态

Call Receiver State

结果 3. 空闲状态

Call Idle State

我们的主要目标就完成了。

需要来电号码?

你仔细看过 Telephony Manager 这个类么?

你看到 TelephonyManager.EXTRA_INCOMING_NUMBER 这个了么?

如果你已经了解了 TelephonyManager.EXTRA_INCOMING_NUMBER,那很好,证明你读过我在上面给的关于 Telephony Manager 类的链接了

TelephonyManager.EXTRA_INCOMING_NUMBER 用 String 的形式返回来电号码。

Extra State

String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

如果你想在自己的应用中监测来电号码,可以利用下面的代码:

public class PhoneStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        try {
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

            if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){

                Toast.makeText(context,"Ringing State Number is - " + incomingNumber, Toast.LENGTH_SHORT).show();
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

    }

啊哈!我们成功取到了来电号码!

但愿本篇博客在获取来电信息方面对你有所帮助。对于获取来电消息方面还有问题的话请留言,我会尽快回复的。

学习 Android 很棒,不是么?来看看其他的 Android 教程 吧。

有开发 Android 应用的灵感?还等什么,快 联系我们 ,灵感直播即将上线。我们的公司被提名为印度最好的 Android 应用开发公司 。





原文发布时间为:2016年11月06日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。
目录
相关文章
|
18小时前
|
安全 Android开发 开发者
构建高效Android应用:采用Kotlin与Jetpack的实践指南
【4月更文挑战第30天】 在移动开发领域,随着技术的不断进步,为了提高应用的性能和用户体验,开发者们不断地探索新的工具和框架。对于Android平台而言,Kotlin语言以其简洁性和功能性成为了开发的首选。而Jetpack组件则提供了一套高质量的库、工具和指南,帮助开发者更轻松地构建高质量的应用程序。本文将探讨如何结合Kotlin语言和Jetpack组件来优化Android应用的开发流程,提升应用性能,并保证代码的可维护性和可扩展性。
|
21小时前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第30天】在Android开发领域,Kotlin作为一种现代化的编程语言,因其简洁性和功能性受到了开发者的广泛欢迎。尽管与传统的Java相比,Kotlin提供了诸多便利,但关于其性能表现的讨论始终未息。本文将深入分析Kotlin和Java在Android平台上的性能差异,通过实际测试数据揭示两种语言在编译效率、运行速度以及内存占用方面的具体表现,并探讨如何利用Kotlin的优势来提升Android应用的整体性能。
|
23小时前
|
移动开发 调度 Android开发
构建高效Android应用:Kotlin协程的实践之路
【4月更文挑战第30天】 在移动开发领域,性能优化与流畅的用户体验始终是开发者追求的目标。随着Kotlin语言在Android开发中的普及,其提供的协程特性成为了解决异步编程问题的有力工具。本文将通过深入分析Kotlin协程的原理与实践,展示如何在Android应用中利用协程提升响应速度和处理效率,同时保证代码的简洁性和可维护性。我们将从基本概念出发,逐步深入到协程的高级使用场景,帮助开发者构建更加高效的Android应用。
|
23小时前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践之路
【4月更文挑战第30天】在移动开发领域,随着用户需求的不断增长和设备性能的持续提升,实现流畅且高效的用户体验已成为开发者的首要任务。针对Android平台,Kotlin协程作为一种新兴的异步编程解决方案,以其轻量级线程管理和简洁的代码逻辑受到广泛关注。本文将深入探讨Kotlin协程的概念、优势以及在实际Android应用中的运用,通过实例演示如何利用协程提升应用性能和响应能力,为开发者提供一条构建更高效Android应用的实践路径。
|
1天前
|
安全 网络安全 Android开发
云端防御策略:融合云服务与网络安全的未来构建高效的Android应用:从内存优化到电池寿命
【4月更文挑战第30天】 随着企业加速向云计算环境转移,数据和服务的云端托管成为常态。本文探讨了在动态且复杂的云服务场景下,如何构建和实施有效的网络安全措施来保障信息资产的安全。我们将分析云计算中存在的安全挑战,并展示通过多层次、多维度的安全框架来提升整体防护能力的方法。重点关注包括数据加密、身份认证、访问控制以及威胁检测与响应等关键技术的实践应用,旨在为读者提供一种结合最新技术进展的网络安全策略视角。 【4月更文挑战第30天】 在竞争激烈的移动市场中,Android应用的性能和资源管理已成为区分优秀与平庸的关键因素。本文深入探讨了提升Android应用效率的多个方面,包括内存优化策略、电池
|
1天前
|
算法 安全 Android开发
深入理解操作系统的内存管理机制构建高效Android应用:Kotlin的协程优势
【4月更文挑战第30天】 在现代计算机系统中,操作系统的内存管理是确保系统高效、稳定运行的关键。本文将探讨操作系统内存管理的核心技术,包括内存分配、虚拟内存、分页和分段等概念,以及它们是如何协同工作以提高内存利用率和系统性能的。通过对这些技术的详细分析,我们可以更好地理解操作系统背后的原理,并评估不同内存管理策略对系统行为的影响。 【4月更文挑战第30天】 在移动开发领域,尤其是针对Android平台,性能优化和流畅的用户体验始终是开发者追求的核心目标。随着Kotlin语言的普及,协程作为其在异步编程领域的杀手锏特性,已经逐渐成为提高应用性能和简化代码结构的重要工具。本文将深入探讨Kotli
|
1天前
|
缓存 监控 Android开发
构建高效Android应用:从内存优化到电池续航
【4月更文挑战第30天】 在移动开发领域,性能优化是一个永不过时的话题。对于Android应用而言,实现流畅的用户体验和延长设备电池寿命是至关重要的。本文将深入探讨Android平台特有的内存管理和电池使用策略,并提出一系列切实可行的优化措施。通过智能管理应用的生命周期、合理利用系统资源和调整后台任务执行策略,开发者可以显著提升应用性能并减少能源消耗。文章最后还将讨论如何利用Android Studio内置工具进行性能分析与监控,确保应用在发布前达到最优状态。
|
1天前
|
缓存 监控 API
Android应用性能优化实践
【4月更文挑战第30天】 随着智能手机的普及,用户对移动应用的性能要求越来越高。对于Android开发者而言,提升应用的性能是吸引和保留用户的关键因素之一。本文将深入探讨影响Android应用性能的主要因素,并提供一系列的优化策略,旨在帮助开发者构建更加流畅和高效的应用体验。
|
1天前
|
移动开发 调度 Android开发
构建高效Android应用:Kotlin协程的实践与优化
【4月更文挑战第30天】在移动开发领域,性能和响应性是衡量应用质量的关键指标。对于Android平台而言,Kotlin协程作为一种新兴的异步编程解决方案,提供了更为简洁和高效的处理并发任务的能力。本文将深入探讨Kotlin协程的核心原理,以及如何通过它们来提升Android应用的性能。我们将从基础概念出发,逐步介绍协程的创建、管理以及与Android UI线程的交互,并最终展示如何优化现有代码以利用协程的优势。
|
1天前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin与Jetpack的实践指南
【4月更文挑战第30天】 随着移动开发技术的不断演进,Android平台提供了多种工具和框架以提升应用性能和开发效率。在本文中,我们将深入探讨如何结合Kotlin语言的简洁性和Android Jetpack组件的强大功能来构建一个既高效又可维护的Android应用。通过分析现代Android应用架构的关键要素,我们将展示如何利用Kotlin的特性以及如何整合Jetpack中的LiveData、ViewModel和Room等组件,以实现响应式编程、数据持久化和生命周期管理。