在 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日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。
目录
相关文章
|
4天前
|
搜索推荐 Java Android开发
打造个性化安卓应用:从设计到发布的全程指南
【9月更文挑战第15天】本篇文章将带领读者踏上一段激动人心的旅程,从构思一个独特的安卓应用想法开始,直至将其变为现实并成功发布。我们将一起探索如何捕捉灵感、设计界面、编写代码以及最终将应用推向市场。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供宝贵的洞见和实用的技巧,让你的应用在竞争激烈的市场中脱颖而出。
35 17
|
2天前
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
19 3
|
2天前
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
12 2
|
9天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
24 5
|
7天前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
21 1
|
15天前
|
XML Java Android开发
探索Android开发之旅:打造你的第一个应用
【9月更文挑战第4天】在这篇专为初学者设计的文章中,我们将一起踏上激动人心的Android开发之旅。从设置开发环境到实现一个简单的“Hello World”应用,每一步都充满了发现和学习。文章将引导你理解Android开发的基础知识,并鼓励你动手实践。让我们开始吧,创造你的第一款Android应用,开启技术世界的新篇章!
|
17天前
|
存储 缓存 搜索推荐
打造个性化天气应用:Android 平台上的天气预报小助手
【9月更文挑战第2天】在这篇文章中,我们将一起探索如何从零开始构建一个简单却功能强大的天气应用。通过这个指南,你将学会如何在 Android 平台上使用 Java 编程语言和相关 API 来创建你自己的天气预报小助手。文章不仅提供了代码示例,还深入讨论了设计思路、用户界面优化以及数据管理等关键方面,旨在帮助初学者理解并实现一个完整的应用项目。
|
2天前
|
搜索推荐 Java 测试技术
打造个性化安卓应用:从设计到发布的完全指南
【9月更文挑战第17天】在这个数字时代,拥有一款个性化的安卓应用无疑是展现创意、实现梦想的一大步。本文将带你走进安卓应用的开发世界,从设计理念的孕育到实际代码的编写,再到最终的应用发布,我们将一步步揭开应用开发的神秘面纱。无论你是编程新手还是希望提升现有技能,这篇文章都将是你的宝贵资源。让我们开始这段激动人心的旅程吧!
|
6天前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
18 0
|
12天前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同双子星座般耀眼夺目,引领着移动应用的潮流。它们各自拥有独特的魅力和深厚的用户基础,为开发者提供了广阔的舞台。然而,正如每枚硬币都有两面,安卓与iOS在开发过程中也展现出了截然不同的特性。本文将深入剖析这两者在开发环境、编程语言、用户体验设计等方面的显著差异,并探讨如何根据目标受众和项目需求做出明智的选择。无论你是初涉移动应用开发的新手,还是寻求拓展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议,帮助你在安卓与iOS的开发之路上更加从容自信地前行。