转载请注明出处: http://blog.csdn.net/like_program/article/details/52662942

这篇博客将讲解 Android 如何获取来电号码和去电号码。

打开 Android Studio,新建 PhoneNumberTest 项目。

我们先实现 获取来电号码。

先修改下布局文件, activity_main.xml 代码如下:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.phonenumbertest.MainActivity"><Button
        android:id="@+id/btn_incoming_call"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="获取来电号码"/><Button
        android:id="@+id/btn_incoming_call_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="不获取来电号码"/>
</LinearLayout>

布局文件很简单,就是定义了两个按钮,分别用来 获取来电号码不获取来电号码

然后,我们在 MainActivity 中实例化这两个按钮,并为它们设置按键监听。MainActivty.java 代码如下:

package com.example.phonenumbertest;import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {/*** 获取来电号码*/private Button btnIncomingCall;/*** 不获取来电号码*/private Button btnIncomingCallCancel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 实例化控件btnIncomingCall = (Button) findViewById(R.id.btn_incoming_call);btnIncomingCallCancel = (Button) findViewById(R.id.btn_incoming_call_cancel);// 设置按键监听btnIncomingCall.setOnClickListener(this);btnIncomingCallCancel.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_incoming_call:Intent startIncomingService = new Intent(this, IncomingCallService.class);startService(startIncomingService);Toast.makeText(this, "获取来电号码", Toast.LENGTH_SHORT).show();break;case R.id.btn_incoming_call_cancel:Intent stopIncomingService = new Intent(this, IncomingCallService.class);stopService(stopIncomingService);Toast.makeText(this, "不获取来电号码", Toast.LENGTH_SHORT).show();break;}}
}

然后我们新建一个 IncomingCallService.java ,继承自 Service。在这个 Service 中,我们将实现获取来电号码的逻辑。IncomingCallService.java 代码如下:

package com.example.phonenumbertest;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;/*** 获取来电号码服务*/
public class IncomingCallService extends Service {/*** 电话服务管理器*/private TelephonyManager telephonyManager;/*** 电话状态监听器*/private MyPhoneStateListener myPhoneStateListener;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();// 获取来电号码getIncomingCall();}@Overridepublic void onDestroy() {super.onDestroy();// 不获取来电号码getIncomingCallCancel();}/*** 获取来电号码*/private void getIncomingCall() {// 获取电话系统服务telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);myPhoneStateListener = new MyPhoneStateListener();telephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);}/*** 不获取来电号码*/private void getIncomingCallCancel() {telephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_NONE);}/*** 电话状态监听器*/class MyPhoneStateListener extends PhoneStateListener {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);switch (state) {// 如果电话铃响case TelephonyManager.CALL_STATE_RINGING:Toast.makeText(IncomingCallService.this, "来电号码是:" + incomingNumber, Toast.LENGTH_LONG).show();}}}
}

我们可以看到,实现获取来电号码的逻辑并不复杂,在 onCreate() 方法中,我们调用了 getIncomingCall() 来获取来电号码,我们再到 getIncomingCall() 方法里看看,在 getIncomingCall() 中,我们先获取了电话系统服务(TelephonyManager),然后给电话系统服务(TelephonyManager)设置了一个监听器,这里我们设置的监听器是我们自定义的监听器,继承自 PhoneStateListener ,并且我们重写了 onCallStateChanged() 这个方法,当电话状态发生变化的时候就会回调这个方法。

注意:onCallStateChanged() 方法里有一个参数:incomingNumber 这个参数就是 来电号码,知道了这个,就好办了。

在 onCallStateChanged() 方法里,我们对当前的电话状态进行判断,如果当前的电话状态是 电话铃响 ,就弹出 Toast 提示,并把 来电号码(incomingNumber)显示出来。

还要注意一点,获取来电号码需要 READ_PHONE_STATE 权限:

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

以上就是获取来电号码的逻辑,我们再看下 不获取来电号码 的逻辑。在 onDestroy() 方法中,我们调用了 getIncomingCallCancel() 来 不获取来电号码,这个方法里只有一句代码,telephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_NONE) ,这句代码的作用是 取消注册监听器,也就是把我们刚刚设置的电话状态监听器取消掉。这样,自然就获取不到来电号码了。

运行一下程序:

实现了获取来电号码后,我们再来实现获取去电号码。

先修改布局文件,activity_main.xml 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.phonenumbertest.MainActivity">......<Button
        android:id="@+id/btn_outgoing_call"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="获取去电号码"/><Button
        android:id="@+id/btn_outgoing_call_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="不获取去电号码"/>
</LinearLayout>

在布局里,我们新增了两个按钮,分别是 获取去电号码不获取去电号码

然后,我们在 MainActivity 中实例化新增的两个按钮,并为它们设置按键监听。MainActivty.java 代码如下:

package com.example.phonenumbertest;import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {....../*** 获取去电号码*/private Button btnOutgoingcall;/*** 不获取去电号码*/private Button btnOutgoingCallCancel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 实例化控件......btnOutgoingcall = (Button) findViewById(R.id.btn_outgoing_call);btnOutgoingCallCancel = (Button) findViewById(R.id.btn_outgoing_call_cancel);// 设置按键监听......btnOutgoingcall.setOnClickListener(this);btnOutgoingCallCancel.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_incoming_call:......break;case R.id.btn_incoming_call_cancel:......break;case R.id.btn_outgoing_call:Intent startOutgoingService = new Intent(this, OutgoingCallService.class);startService(startOutgoingService);Toast.makeText(this, "获取去电号码", Toast.LENGTH_SHORT).show();break;case R.id.btn_outgoing_call_cancel:Intent stopOutgoingService = new Intent(this, OutgoingCallService.class);stopService(stopOutgoingService);Toast.makeText(this, "不获取去电号码", Toast.LENGTH_SHORT).show();break;}}
}

然后我们新建一个 OutgoingCallService.java ,继承自 Service。在这个 Service 中,我们将实现获取去电号码的逻辑。OutgoingCallService.java 代码如下:

package com.example.phonenumbertest;import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.widget.Toast;/*** 获取去电号码服务*/
public class OutgoingCallService extends Service {/*** 去电 Action*/private static final String OUTGOING_ACTION = "android.intent.action.NEW_OUTGOING_CALL";/*** 去电广播接收器*/private MyPhoneStateReceiver myPhoneStateReceiver;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();// 获取去电号码getOutgoingCall();}@Overridepublic void onDestroy() {super.onDestroy();// 不获取去电号码getOutgoingCallCancel();}/*** 获取去电号码*/private void getOutgoingCall() {IntentFilter intentFilter = new IntentFilter();// 监听去电广播intentFilter.addAction(OUTGOING_ACTION);myPhoneStateReceiver = new MyPhoneStateReceiver();// 动态注册去电广播接收器registerReceiver(myPhoneStateReceiver, intentFilter);}/*** 不获取去电号码*/private void getOutgoingCallCancel() {// 取消注册去电广播接收器unregisterReceiver(myPhoneStateReceiver);}/*** 监听去电广播*/class MyPhoneStateReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 获取去电号码String outgoingNumber = getResultData();Toast.makeText(context, "去电号码是:" + outgoingNumber, Toast.LENGTH_LONG).show();}}
}

在 onCreate() 方法中,我们调用 getOutgoingCall() 来获取去电号码,我们再到 getOutgoingCall() 方法里看看,在这个方法里,我们动态注册了 去电广播接收器 ,我们注册的广播接收器 MyPhoneStateReceiver 是我们自定义的广播接收器,在 MyPhoneStateReceiver 的 onReceive() 方法中,调用了 getResultData() 方法,这个方法返回的就是 去电号码。在 intentFilter 中,添加了一个值为 android.intent.action.NEW_OUTGOING_CALL 的 Action,表示我们的 去电广播接收器 想要接收去电广播。

获取来电号码需要权限,获取去电号码也需要权限:

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

这样,获取去电号码的逻辑就完成了。我们再看下 不获取去电号码。在 onDestroy() 方法中,调用了 getOutgoingCallCancel() 来 不获取去电号码,再到 getOutgoingCallCancel() 方法里看看,只有一句代码,unregisterReceiver(myPhoneStateReceiver),这句代码的作用是 取消注册去电广播接收器,取消注册了之后,自然也就获取不到去电号码了

再运行一下程序:

源码下载

Android 获取来电号码和去电号码相关推荐

  1. android来电电话获取,Android获取来电号码代码

    对于Android平台的整个来电软件制作十分简单,Android平台在各方面都比较智能,加上一个BOOT_COMPLETED获取,保证开机自动运行,一个来电通就很容易的制作完成了. Android来电 ...

  2. android获取来电号码,Android获取来电号码代码详解

    对于Android平台的整个来电软件制作十分简单,Android平台在各方面都比较智能,加上一个BOOT_COMPLETED获取,保证开机自动运行,一个来电通就很容易的制作完成了. Android来电 ...

  3. android获取imei兼容_Android获取IMEI号码

    1 android 获取 imei号码2 3 核心代码:4 5 Imei =((TelephonyManager) getSystemService(TELEPHONY_SERVICE))6 .get ...

  4. Android通过来电号码识别姓名。

    项目中遇到需要通过来电号码获取到联系人姓名的需求. 然而,简单地通过联系人数据库的Filter来获取来电号码在部分手机是获取不到保存的联系人的,比如三星S3,需要获取通信录保存的有+86等国区码,而来 ...

  5. android 获取 imei号码

    转自:http://blog.csdn.net/gumanren/archive/2011/02/26/6209237.aspx android 获取 imei号码 核心代码: Imei = ((Te ...

  6. android 改变来电号码,Android8.1 MTK平台 Dialer修改(来电全屏、归属地显示)

    来电默认全屏 默认情况下,来电android是以通知窗口的形式显示,只在屏幕的顶部显示,现在改为全屏显示 修改位置 alps\vendor\mediatek\proprietary\packages\ ...

  7. CSR8670获取来电号码及开发流程

    平台:CSR8670 SDK:ADK4.1 场景:CSR8670作为HF,当AG连接上后,获取来电的号码 结论:如果不关注流程的,很简单,直接通过下面的设置并且Write Device就可以了. 不断 ...

  8. android通过sim卡获取本机号码,Android获取本机号码及Sim卡状态

    SIM卡存储的数据可分为四类: 第一类是固定存放的数据.这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI).鉴权密钥(KI).鉴权和加密算法等等. 第二类是暂时存放的 ...

  9. Android获取本机号码、IMEI等

    SIM卡存储的数据可分为四类: 第一类是固定存放的数据.这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI).鉴权密钥(KI).鉴权和加密算法等等. 第二类是暂时存放的 ...

最新文章

  1. 经典重温:卡尔曼滤波器介绍与理论分析
  2. 【PP操作手册】试制计划
  3. Coverage analysis in AIE
  4. fastapi vue socket 从其他文件调用 socket 方法
  5. WordPress插件开发-创建、停用、删除插件
  6. 今天的离离原上草的飞鸽传书
  7. Minecraft Forge:如何下载,安装和使用Forge
  8. chkdsk 和sfc.exe修复命令
  9. cf不能全屏win7的解决方法_win10玩cf不能全屏的解决方法教程
  10. 数据库设计时设计标识字段的一些思考
  11. 单片机c语言跑马灯实验报告,单片机跑马灯实验报告
  12. mac airdrop 隔空投送 我可以发现别人,别人发现不了我。搜索不到。
  13. 荷马史诗——解题报告
  14. 08年计算机组成原理自考试卷,2008年04月自学考试02318《计算机组成原理》试题...
  15. 《大数据原理与应用》林子雨:一. 大数据基础
  16. html div文字竖向显示,css怎么让文字竖着?
  17. 程序员拒绝春节工作被开除:获赔 19.4 万元
  18. SVM转化为对偶问题求解的原因
  19. OpenGL的版本历史和发展
  20. The authenticity of host ‘‘ can‘t be established.

热门文章

  1. 教你如何自动回复微信消息并定时发朋友圈?
  2. 如何将PPT转成Word?教你3种免费的方法
  3. MAC地址表、ARP缓存表、路由表及交换机、路由器基本原理
  4. 发布新的Silverlight游戏Demo:梦幻西游 之 “天人合一”①
  5. JasperReportsPDF报表生成工具介绍
  6. 6.java项目-尚医通(6)
  7. ps怎样选取自己想要的图片部分(二)
  8. C++枚举算法之和数
  9. 华为无线ap3010dn-agn刷成胖ap
  10. elementui table表格动态生成多级表头