TelephonyManager 监听所有手机来电
要监听所有的来电,其实最重要的就是重写 TelephonyManager 的一个通话状态监听器 PhoneStateListener 然后调用 TelephonyManager.listen()
的方法进行监听
监听所有来电的步骤
-
取得
TelephonyManager
对象TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
-
创建一个 电话状态监听器 ,也就创建
PhoneStateListener
的实例PhoneStateListener listener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String number) { switch (state) { // 无任何状态 case TelephonyManager.CALL_STATE_IDLE: break; case TelephonyManager.CALL_STATE_OFFHOOK: break; // 来电铃响时 case TelephonyManager.CALL_STATE_RINGING: // 将电话号码打印出来,你还可以保存到文件中等 Log.d("listen_phone", new Date() + " 来电:" + number); break; default: break; } super.onCallStateChanged(state, number); } };
-
调用
tm.listen()
方法监听电话状态改变tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
范例
我们写一个 demo 来创建来电监听器
这里用的是 Activity 而非 Service,就是说要打开这个 Activity, 才可以进行监听,通常我们的需求都是要偷偷滴在后台跑的,因为时间关系就不写 Service 的了,如果需要 可自行修改,让 Service 随开机一起启动即可
-
创建一个 空的 Android 项目
cn.twle.android.ListenPhone
-
修改
AndroidManifest.xml
添加权限<!-- 授予该应用读取通话状态的权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-
修改
MainActivity.java
package cn.twle.android.listenphone; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; import java.util.Date; public class MainActivity extends Activity { TelephonyManager tm; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 取得TelephonyManager对象 tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); // 创建一个通话状态监听器 PhoneStateListener listener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String number) { switch (state) { // 无任何状态 case TelephonyManager.CALL_STATE_IDLE: break; case TelephonyManager.CALL_STATE_OFFHOOK: break; // 来电铃响时 case TelephonyManager.CALL_STATE_RINGING: // 将电话号码打印出来,你还可以保存到文件中等 Log.d("listen_phone", new Date() + " 来电:" + number); break; default: break; } super.onCallStateChanged(state, number); } }; // 监听电话通话状态的改变 tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); } }