Android开发之监听手机来电

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

程序运行结果:


log_phone文件:

Android开发之监听手机来电

应用实例:


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组件跟随系统启动,那个这种监听就可以做到“神不知,鬼不觉”了。嘿嘿.............

Android开发之监听手机来电

上一篇:vue项目如何通过前端实现自动识别并配置服务器环境地址


下一篇:Android_WebServices_源码分析