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