`

[AndroidTips]Android监听来电和去电

 
阅读更多

参考:
android 呼入电话的监听(来电监听)
http://stephen830.iteye.com/blog/1181010
android 呼出电话的监听(去电监听)
http://stephen830.iteye.com/blog/1181452

android-轻松监听来电和去电
http://www.eoeandroid.com/thread-8994-1-1.html

 

android 呼入电话的监听(来电监听)

 

需要权限:

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

 

方式一:通过广播接收来电

 

定义来电广播接收类

package com.zhouzijing.android.demo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;

public class BroadcastReceiverMgr extends BroadcastReceiver {
	
	private final String TAG = MyBroadcastReceiver.TAG;

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		Log.i(TAG, "[Broadcast]"+action);
		
		//呼入电话
		if(action.equals(MyBroadcastReceiver.B_PHONE_STATE)){
			Log.i(TAG, "[Broadcast]PHONE_STATE");
			doReceivePhone(context,intent);
		}
	}
	
	/**
	 * 处理电话广播.
	 * @param context
	 * @param intent
	 */
	public void doReceivePhone(Context context, Intent intent) {
		String phoneNumber = intent.getStringExtra(
TelephonyManager.EXTRA_INCOMING_NUMBER);
		TelephonyManager telephony = 
(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
		int state = telephony.getCallState();
		switch(state){
		case TelephonyManager.CALL_STATE_RINGING:
			Log.i(TAG, "[Broadcast]等待接电话="+phoneNumber);
			break;
		case TelephonyManager.CALL_STATE_IDLE:
			Log.i(TAG, "[Broadcast]电话挂断="+phoneNumber);
			break;
		case TelephonyManager.CALL_STATE_OFFHOOK:
			Log.i(TAG, "[Broadcast]通话中="+phoneNumber);
			break;
		}
	}
}

 

定义Actitvity类

package com.zhouzijing.android.demo;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;

public class MyBroadcastReceiver extends Activity {
	public final static String TAG = "MyBroadcastReceiver";
	
	public final static String B_PHONE_STATE = 
TelephonyManager.ACTION_PHONE_STATE_CHANGED;
	
	private BroadcastReceiverMgr mBroadcastReceiver;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.my_broadcast_receiver);
	}	

	//按钮1-注册广播
	public void registerIt(View v) {
		Log.i(TAG, "registerIt");
		mBroadcastReceiver = new BroadcastReceiverMgr();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(B_PHONE_STATE);
		intentFilter.setPriority(Integer.MAX_VALUE);
		registerReceiver(mBroadcastReceiver, intentFilter);
	}
	
	//按钮2-撤销广播
	public void unregisterIt(View v) {
		Log.i(TAG, "unregisterIt");
		unregisterReceiver(mBroadcastReceiver);
	}
	
}

 

方式二:通过监听器来实现

package com.zhouzijing.android.demo;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;

public class MyBroadcastReceiver extends Activity {
	public final static String TAG = "MyBroadcastReceiver";
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.my_broadcast_receiver);
	}
	
	/**
	 * 按钮-监听电话
	 * @param v
	 */
	public void createPhoneListener(View v) {
		TelephonyManager telephony = (TelephonyManager)getSystemService(
Context.TELEPHONY_SERVICE);
		telephony.listen(new OnePhoneStateListener(),
PhoneStateListener.LISTEN_CALL_STATE);
	}
	
	/**
	 * 电话状态监听.
	 * @author stephen
	 *
	 */
	class OnePhoneStateListener extends PhoneStateListener{
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			Log.i(TAG, "[Listener]电话号码:"+incomingNumber);
			switch(state){
			case TelephonyManager.CALL_STATE_RINGING:
				Log.i(TAG, "[Listener]等待接电话:"+incomingNumber);
				break;
			case TelephonyManager.CALL_STATE_IDLE:
				Log.i(TAG, "[Listener]电话挂断:"+incomingNumber);
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:
				Log.i(TAG, "[Listener]通话中:"+incomingNumber);
				break;
			}
			super.onCallStateChanged(state, incomingNumber);
		}
	}
	
	

	
}

 

 

android 呼出电话的监听(去电监听)

 

权限:

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

 

通过接收呼出电话的广播来实现

定义广播类

package com.zhouzijing.android.demo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;

public class BroadcastReceiverMgr extends BroadcastReceiver {
	
	private final String TAG = MyBroadcastReceiver.TAG;

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		Log.i(TAG, "[Broadcast]"+action);
		

		
		//呼出电话
		if(action.equals(MyBroadcastReceiver.B_ACTION_NEW_OUTGOING_CALL)){
			String outPhoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
			Log.i(TAG, "[Broadcast]ACTION_NEW_OUTGOING_CALL:"+outPhoneNumber);
			//this.setResultData(null);
//这里可以更改呼出电话号码。如果设置为null,电话就永远不会播出了.
		}
		
		
	}
	
	
}

 

定义activity类

package com.zhouzijing.android.demo;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;

public class MyBroadcastReceiver extends Activity {
	public final static String TAG = "MyBroadcastReceiver";
	
	
	public final static String B_ACTION_NEW_OUTGOING_CALL = Intent.ACTION_NEW_OUTGOING_CALL;
	
	private BroadcastReceiverMgr mBroadcastReceiver;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.my_broadcast_receiver);
	}
	
	
	
	

	//按钮1-注册广播
	public void registerIt(View v) {
		Log.i(TAG, "registerIt");
		mBroadcastReceiver = new BroadcastReceiverMgr();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
		intentFilter.setPriority(Integer.MAX_VALUE);
		registerReceiver(mBroadcastReceiver, intentFilter);
	}
	
	//按钮2-撤销广播
	public void unregisterIt(View v) {
		Log.i(TAG, "unregisterIt");
		unregisterReceiver(mBroadcastReceiver);
	}
	
}

 

 

 

---------------------------------------------------------------------------------------------------------

要监听android打电话和接电话,只需下面2步骤

1.第一步,写一个Receiver继承自BroadcastReceiver

public class PhoneStatReceiver extends BroadcastReceiver{
        
        private static final String TAG = "PhoneStatReceiver";
        
//        private static MyPhoneStateListener phoneListener = new MyPhoneStateListener();
        
        private static boolean incomingFlag = false;
        
        private static String incoming_number = null;

        @Override
        public void onReceive(Context context, Intent intent) {
                //如果是拨打电话
                if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){                        
                        incomingFlag = false;
                        String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);        
                        Log.i(TAG, "call OUT:"+phoneNumber);                        
                }else{                        
                        //如果是来电
                        TelephonyManager tm = 
                            (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);                        
                        
                        switch (tm.getCallState()) {
                        case TelephonyManager.CALL_STATE_RINGING:
                                incomingFlag = true;//标识当前是来电
                                incoming_number = intent.getStringExtra("incoming_number");
                                Log.i(TAG, "RINGING :"+ incoming_number);
                                break;
                        case TelephonyManager.CALL_STATE_OFFHOOK:                                
                                if(incomingFlag){
                                        Log.i(TAG, "incoming ACCEPT :"+ incoming_number);
                                }
                                break;
                        
                        case TelephonyManager.CALL_STATE_IDLE:                                
                                if(incomingFlag){
                                        Log.i(TAG, "incoming IDLE");                                
                                }
                                break;
                        } 
                }
        }
}

 

第二步:在AndroidManifest.xml,配置写好的Receiver,并拦截相应的BroadCastAction,
另外注意加上相应的权限。

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

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission> 
分享到:
评论

相关推荐

    android 监听来电和去电

    在Android开发中,监听来电和去电是许多应用程序的核心功能之一,尤其是在通讯应用、日志记录或企业级安全软件中。根据给定的文件信息,我们可以深入探讨如何在Android中实现这一功能,包括必要的权限设置、广播接收...

    android 利用重力感应监听

    例如,检查来电状态通常需要监听PhoneStateListener或BroadcastReceiver,而权限方面则需要确保应用已经获得了ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限,因为Android 6.0及以上版本需要运行时权限。...

    android拨号键盘及来去电监听

    在Android开发中,拨号键盘和来去电监听是两个重要的功能模块,它们涉及到用户与设备的通信交互。本文将详细解析如何实现这样的功能,并提供相关的编程知识点。 首先,我们来了解一下拨号键盘的实现。在Android系统...

    Android-Android来去电监听电话挂断

    在Android平台上,来电和去电的监听以及电话挂断的处理是通过系统级别的电话状态监听器(PhoneStateListener)实现的。这个功能涉及到Android的电信服务API,它允许应用程序接收和响应电话事件,如通话开始、结束、...

    android 电话状态监听(来电和去电)实现代码

    实现手机电话状态的监听,主要依靠两个类:TelephoneManger和PhoneStateListener。 TelephonseManger提供了取得手机基本服务的信息的一种方式。因此应用程序可以使用TelephonyManager来探测手机基本服务的情况。应用...

    Android 获取来电号码和去电号码

    在Android系统中,获取来电和去电号码是开发者经常需要处理的任务,这主要涉及到电话管理和广播接收器的相关知识。下面将详细阐述如何实现这一功能。 首先,我们需要了解Android的权限管理。由于涉及到用户隐私,...

    Android开发通过BroadcastReceiver监听Home,电源Power,和音量变化Volume键

    总之,通过BroadcastReceiver可以实现对Android设备上Home键、电源键和音量键的监听。在实际开发中,理解BroadcastReceiver的工作原理和使用方式,以及对权限的管理,是提升用户体验的关键。同时,合理地组织项目...

    Android广播接实现监听电话状态(电话的状态,拦截)

    在Android平台上,对电话状态的监听和拦截是一个需要特别权限和精确实现的敏感操作,这涉及到Android的权限管理、广播接收器(BroadcastReceiver)、事件监听机制以及电话状态的处理。以下知识点将详细介绍如何实现这...

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

    - `PhoneStateListener`是系统提供的监听电话状态变化的类,通过注册监听器来捕捉来电、去电、电话挂断等事件。 - 示例代码中,使用了`PhoneReceiver`类继承自`BroadcastReceiver`,并重写了`onReceive`方法来处理...

    Android中的webview监听每次URL变化实例

    本文档将详细讲解如何在Android的WebView中监听URL的变化以及如何监听页面加载的完成情况。 首先,要监听WebView中URL的变化,可以通过设置自定义的WebViewClient,并重写onLoadResource方法。当WebView开始加载新...

    Android 实时监测(监听)网络连接状态变化

    android网络监听变化,判断当前是什么网络类型,实时监听。android网络监听变化,判断当前是什么网络类型,实时监听。android网络监听变化,判断当前是什么网络类型,实时监听。android网络监听变化,判断当前是什么...

    Android实现信号强度监听的方法

    首先,我们需要了解Android中的`TelephonyManager`类,它是系统提供的一个接口,用于获取手机通话状态和网络信息。通过这个类,我们可以获取到手机的信号强度数据。以下是如何初始化`TelephonyManager`: ```java ...

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

    在Android平台上,监听来电和去电是通过特定的API实现的,主要涉及到`PhoneStateListener`和广播接收器。下面将详细阐述这两个方法,并探讨它们的用途和注意事项。 首先,我们来看来电监听。来电监听主要利用`...

    各种Android Dialog创建及其监听事件实现

    6 创建自定义列表对话框 笔者为该对话框添加了自定义的布局文件 该自定义布局文件包含一个文本标签和一个文本框 并实现了确定按钮点击监听事件 在文本框输入内容后 获取文本框里的内容 并以toast形式显示出来 ...

    Android监听来电和去电的实现方法

    本文实例讲述了Android监听来电和去电的实现方法。分享给大家供大家参考,具体如下: 要监听android打电话和接电话,只需下面2步骤 第一步,写一个Receiver继承自BroadcastReceiver import android.app.Service; ...

    Android数据库内容变化的监听

    Android 数据库内容变化的监听 Android 数据库内容变化的监听是 Android 系统中一种重要的机制,用于监听数据库中的内容变化。这种机制基于 Uri 的内容监测,通过 ContentResolver 类提供了三个方法来实现监听功能...

    Android Webview滑动监听

    本篇将详细讲解如何在Android Webview中实现滑动监听以及图片的放大缩小功能。 首先,我们要了解`WebView`的基本用法。在Android Studio中,创建一个新的布局XML文件,添加`WebView`组件: ```xml android:id="@...

    android监听手机app启动

    综上所述,监听Android设备上其他应用的启动,需要根据API版本选择合适的方法。对于较新的Android版本,需要结合多种技术,如BroadcastReceiver和UsageStatsManager,以实现对应用启动的跟踪和分析。同时,理解...

    Android 操作以太网,监听网线插拔和以太网开关,设置以太网静态IP等

    这个项目已经很老了,其实是从 Android 4.4.4 的系统 Settings 中 copy 出来的。 其实原理都是编译运行系统 ...Android 操作以太网的项目,提供了监听网线插拔和以太网开关,设置以太网静态IP、网关、子网掩码、dns等。

    android 后台监听按键事件方法及demo

    android 后台监听按键事件方法及demoandroid 后台监听按键事件方法及demo

Global site tag (gtag.js) - Google Analytics