在 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>
AI 代码解读

注意

你必须在 <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" />
AI 代码解读

现在你的 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();
    }

}
AI 代码解读

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

先自己想一想。

目前只要收到来电就会弹出一个显示 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);
AI 代码解读

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

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();
}
AI 代码解读

现在我们的 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);
AI 代码解读

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

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();
        }

    }
AI 代码解读

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

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

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

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





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

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。
相关文章
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
265 4
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
74 14
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
46 0
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
打造个性化安卓应用:从设计到实现
【10月更文挑战第30天】在数字化时代,拥有一个个性化的安卓应用不仅能够提升用户体验,还能加强品牌识别度。本文将引导您了解如何从零开始设计和实现一个安卓应用,涵盖用户界面设计、功能开发和性能优化等关键环节。我们将以一个简单的记事本应用为例,展示如何通过Android Studio工具和Java语言实现基本功能,同时确保应用流畅运行。无论您是初学者还是希望提升现有技能的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧。
打造个性化Android应用:从设计到实现的旅程
【10月更文挑战第26天】在这个数字时代,拥有一个能够脱颖而出的移动应用是成功的关键。本文将引导您了解如何从概念化阶段出发,通过设计、开发直至发布,一步步构建一个既美观又实用的Android应用。我们将探讨用户体验(UX)设计的重要性,介绍Android开发的核心组件,并通过实际案例展示如何克服开发中的挑战。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧,帮助您在竞争激烈的应用市场中脱颖而出。
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
95 2
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
124 5

热门文章

最新文章