android 电话状态的监听(来电和去电) PhoneStateListener和Telephon

2019-04-13 15:12发布

今天的程序可以实现电话状态改变时启动(来电、接听、挂断、拨打电话),但是暂时没法实现拨打电话时判断对方是否接听、转语音信箱等。Android在电话状态改变是会发送action为android.intent.action.PHONE_STATE的广播,而拨打电话时会发送action为android.intent.action.NEW_OUTGOING_CALL的广播,但是我看了下开发文档,暂时没发现有来电时的广播。知道这个就好办了,我们写个BroadcastReceiver用于接收这两个广播就可以了。 [java] view plaincopy
  1. package com.pocketdigi.phonelistener;  
  2.    
  3. import android.app.Service;  
  4. import android.content.BroadcastReceiver;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.telephony.PhoneStateListener;  
  8. import android.telephony.TelephonyManager;  
  9.    
  10. public class PhoneReceiver extends BroadcastReceiver {  
  11.    
  12.     @Override  
  13.     public void onReceive(Context context, Intent intent) {  
  14.         // TODO Auto-generated method stub  
  15.         System.out.println("action"+intent.getAction());  
  16.         if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){  
  17.             //如果是去电(拨出)  
  18.             System.out.println("拨出");  
  19.         }else{  
  20.             //查了下android文档,貌似没有专门用于接收来电的action,所以,非去电即来电  
  21.             System.out.println("来电");  
  22.             TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);     
  23.             tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);  
  24.             //设置一个监听器  
  25.         }  
  26.     }  
  27.     PhoneStateListener listener=new PhoneStateListener(){  
  28.    
  29.         @Override  
  30.         public void onCallStateChanged(int state, String incomingNumber) {  
  31.             // TODO Auto-generated method stub  
  32.             //state 当前状态 incomingNumber,貌似没有去电的API  
  33.             super.onCallStateChanged(state, incomingNumber);  
  34.             switch(state){  
  35.             case TelephonyManager.CALL_STATE_IDLE:  
  36.                 System.out.println("挂断");  
  37.                 break;  
  38.             case TelephonyManager.CALL_STATE_OFFHOOK:  
  39.                 System.out.println("接听");  
  40.                 break;  
  41.             case TelephonyManager.CALL_STATE_RINGING:  
  42.                 System.out.println("响铃:来电号码"+incomingNumber);  
  43.                 //输出来电号码  
  44.                 break;  
  45.             }  
  46.         }  
  47.    
  48.     };  
  49. }  

要在AndroidManifest.xml注册广播接收器: [html] view plaincopy
  1. <receiver android:name=".PhoneReceiver">  
  2.         <intent-filter>  
  3.             <action android:name="android.intent.action.PHONE_STATE"/>  
  4.     <action android:name="android.intent.action.NEW_OUTGOING_CALL" />  
  5.         intent-filter>  
  6.        receiver>  

还要添加权限: [html] view plaincopy
  1. <uses-permission android:name="android.permission.READ_PHONE_STATE">uses-permission>  
  2.    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS">uses-permission>  


转自 :http://www.pocketdigi.com/20110725/417.html