Android开发之监听手机来电

TelephonyManager是一个管理手机通话状态、电话网络信息的服务类,该类提供了大量的getXxx(),方法获取电话网络的相关信息。关于TelephonyManager的详解可以参照:Android开发之获取手机SIM卡信息

程序运行结果:



log_phone文件:

应用实例:


package com.jph.monitorphone;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
/**
 * Describe:</br>
 * 监视手机来电
 * 本实例实现了监视当前手机的来电状态,
 * 并将来电与接听纪录写入log_phone文件中
 * @author jph
 * Date:2014.07.22
 * */
public class MonitorPhone extends Activity {
	TelephonyManager tManager;
	private String incomingNumber;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//获取系统的TelephonyManager对象
		tManager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
		//创建一个通话状态监听器
		PhoneStateListener pListener=new PhoneStateListener(){
			@Override
			public void onCallStateChanged(int state, String number) {
				// TODO Auto-generated method stub
				switch (state) {
				case TelephonyManager.CALL_STATE_IDLE://无任何状态
					break;
				case TelephonyManager.CALL_STATE_OFFHOOK://接听来电
					writeFile(state,number);
					break;
				case TelephonyManager.CALL_STATE_RINGING://来电
					incomingNumber=number;
					writeFile(state,number);
					break;
				default:
					break;
				}
				super.onCallStateChanged(state, incomingNumber);
			}
		};
		//为tManager添加监听器
		tManager.listen(pListener, PhoneStateListener.LISTEN_CALL_STATE);
	}
   //将接听电话,与来电信息写入到文件
	protected void writeFile(int state, String number) {
		// TODO Auto-generated method stub
		StringBuffer sb=new StringBuffer();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh.mm.ss");
		sb.append("时间:"+sdf.format(new Date())+"\n");
		switch (state) {
		case TelephonyManager.CALL_STATE_OFFHOOK://接听来电
			sb.append("接听了电话号为:"+incomingNumber+"的电话");
			break;
		case TelephonyManager.CALL_STATE_RINGING://来电
			sb.append(number+"来电");
			break;
		}
		sb.append("\n-----------------------\n");
		FileOutputStream fos=null;
		try {
			//以追加的方式打开输出流
			fos=openFileOutput("log_phone", MODE_APPEND);

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//将输出流封装成PrintStream对象
		PrintStream ps=new PrintStream(fos);
		//输入文件内容
		ps.println(sb.toString());
		//关闭输出流
		ps.close();
	}
}

最后别忘为应用添加相应的权限:

AndroidManifest.xml


<!-- 授予应用读取通话状态的权限 -->
	<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

实例分析:

本应用是通过Activity实现的,如果把实例中的代码放到后台执行的Service中运行,并设置Service组件跟随系统启动,那个这种监听就可以做到“神不知,鬼不觉”了。嘿嘿.............

时间: 2024-11-07 10:02:07

Android开发之监听手机来电的相关文章

Android获取手机状态和监听手机来电状态

获取手机状态: import android.content.Context; import android.telephony.TelephonyManager; //获得相应的系统服务 TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /** * 返回电话状态 * * CALL_STATE_IDLE 无任何状态时 * CALL_STATE_OFFHOOK 接起电话时 *

Android开发之监听或获取手机短信内容【转】

最近做的项目里要监听手机的短消息内容,这个东西好像在最初学的时候都做过,不过现在早忘记了,现在写下来,记住了. 前提--权限: <uses-permission android:name="android.permission.RECEIVE_SMS" > </uses-permission> <uses-permission android:name="android.permission.READ_SMS" > </us

Android开发之监听发出的短信

运行效果图: 预备知识: 为了监听指定的ContentProvider的数据的改变,需要通过ContentResolver向指定Uri注册CotentObserver监听器.ContentResolver提供了如下方法来注册监听器: publicfinal void registerContentObserver(Uriuri, boolean notifyForDescendents, ContentObserver observer) 参数:uri :该监听器所监听的ContentProvi

android开发事件监听

第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式.上面的程序代码就是匿名内部类来创建事件监听器的!!!对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器.第二种:内部类作为监听器 将事

Android之——监听手机开机事件

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47028535 本文中,主要通过监听开机广播来达到监听手机开机状态的操作,在Android中可以通过广播机制来监听一些系统服务和系统级的操作,好了,不多说,直接上代码吧 1.创建广播接收者类BootCompleteReceiver 这个类中的回调方法是手机开机后自动调用,我在这里只是打印出相关日志,具体的业务逻辑大家可以自己根据自己的具体需求去实现. 代码如下: package c

使用ionic开发时用遇到监听手机返回按钮的问题~

当时用的是ionic开发一个app,需求是,当按下手机的返回按钮,在指定的页面双击退出,而在其他页面点击一次返回到上个页面: 其实用ionic自带的服务就可以解决:  //双击退出   $ionicPlatform.registerBackButtonAction(function (e) {   //判断处于哪个页面时双击退出    if($location.path() =='/message' || $location.path() =='/work' || $location.path(

Android BroadcastReceiver实时监听电量

Android系统中实时的监听手机电量以及开机启动功能都是通过BroadcastReceiver组件实现的.我们可以动态注册这个类的一个实例通过 Context.registerReceiver()方法或者静态注册,通过<Receiver>标记在androidmanifest . xml.注意:如果我们注册一个接收器在Activity.onResume()实现,我们应该注销Activity在Activity生命周期的 onPause方法中.(这将减少不必要的系统开销).切记不能注销Activi

Android学习小记-----监听并保存传感器数据,让service后台运行(保持CPU运转

最近做了一个Demo,监听手机中传感器的数据,并将数据保存到手机文件中,发现数据会有丢失的现象. 经过多次测试,发现系统进入深度休眠了,之后service会停止,虽然增加了service自动启动的功能,但是还会导致数据中断一段时间.如果屏幕一直亮着会比较耗电,所以亮屏这种方法直接Pass掉.那么怎么保证service一直运行不会中断呢? 1,PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过Con

监听手机录音

需求分析: 记录通话过程中的录音,并保存到指定路径~ 知识点:1.手机开机发出广播,广播接受者收到通知,开启service服务 2.Service工作流程: 1.获取手机管理对象· 2.注冊监听器,对应手机状态 3.依据手机状态(振铃.通话.空暇),创建Mediaplay对象,暂停 这里监听手机状态,加入?权限 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 代码: Telephon