要监听android打电话和接电话,只需下面2步骤
1.第一步,写一个Receiver继承自BroadcastReceiver

  1.
  2. public class PhoneStatReceiver extends BroadcastReceiver{

  3.        

  4.         private static final String TAG = "PhoneStatReceiver";

  5.        

  6. //        private static MyPhoneStateListener phoneListener = new MyPhoneStateListener();

  7.        

  8.         private static boolean incomingFlag = false;

  9.        

  10.         private static String incoming_number = null;

  11.
  12.         @Override

  13.         public void onReceive(Context context, Intent intent) {

  14.                 //如果是拨打电话

  15.                 if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){                       

  16.                         incomingFlag = false;

  17.                         String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);       

  18.                         Log.i(TAG, "call OUT:"+phoneNumber);                       

  19.                 }else{                       

  20.                         //如果是来电

  21.                         TelephonyManager tm =

  22.                             (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);                       

  23.                        

  24.                         switch (tm.getCallState()) {

  25.                         case TelephonyManager.CALL_STATE_RINGING:

  26.                                 incomingFlag = true;//标识当前是来电

  27.                                 incoming_number = intent.getStringExtra("incoming_number");

  28.                                 Log.i(TAG, "RINGING :"+ incoming_number);

  29.                                 break;

  30.                         case TelephonyManager.CALL_STATE_OFFHOOK:                               

  31.                                 if(incomingFlag){

  32.                                         Log.i(TAG, "incoming ACCEPT :"+ incoming_number);

  33.                                 }

  34.                                 break;

  35.                        

  36.                         case TelephonyManager.CALL_STATE_IDLE:                               

  37.                                 if(incomingFlag){

  38.                                         Log.i(TAG, "incoming IDLE");                               

  39.                                 }

  40.                                 break;

  41.                         }

  42.                 }

  43.         }

  44. }


复制代码
第二步:在AndroidManifest.xml,配置写好的Receiver,并拦截相应的BroadCastAction,
另外注意加上相应的权限。

  1.
  2. <receiver android:name=".filter.PhoneStatReceiver">  

  3.             <intent-filter>

  4.                  <action android:name="android.intent.action.PHONE_STATE"/>           

  5.                  <action android:name="android.intent.action.NEW_OUTGOING_CALL" />

  6.             </intent-filter>

  7. </receiver>

  8.
  9. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

  10.         <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>


复制代码
对于来电状态的变化,用户可以在上面的例子代码中,加入自己想要实现的逻辑。
来电分三种状态:
CALL_STATE_RINGING:来电响铃
CALL_STATE_OFFHOOK:摘机
CALL_STATE_IDLE:挂机
去电的话,这里只监听了电话拨打出去,至于拨打出去的电话,是否被接通,看来android的一些相关文档,
好像都没有这样一个可拦截的状态变化,不知道有没有人实现过去电状态变化的监听。

如果有的话,还望提供思路!!


lz写的帖子很好,来电的状态在很多的资料中都可以看到,可以根据不同的状态进行一系列的处理。但是去电的状态到现在始终都没有获取。来电是用的是 onCallStateChanged(int state, String incomingNumber)方法,我看了源代码PhoneStateListener类中的这个方法只有那三个状态,没有其他关于去电的状态。而且也 没有其他的方法获取去电的电话状态以及电话号码。所以得到去电的状态一定不是在PhoneStateListener这个类中了,到底怎么获取去电的状态 呢?很着急呀?哪位高手指点一下呀


关于判断去电或者来电接通状态的方法在源代码中是有的~但是标记有@hide标签,也就是这个Api是隐藏的不能直接调用,我也在寻找调用这些隐藏Api的方法


已经成功了

if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))

{                        

mCallEvent = CALL_EVENT_OUTGOING;

mCallNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);        
            Log.i(TAG, "call OUT:" + mCallNumber);

            AskCallStateThread callStateThread = new AskCallStateThread(context);
            callStateThread.start();

}



private class AskCallStateThread extends Thread

{

private static final String TAG = "AskCallStateThread";



public AskCallStateThread(Context aContext) {

mContext = aContext;

}



Context mContext = null;

private Timer mTimer = new Timer(true);



private TimerTask mTimerTask = new TimerTask() {

@Override

public void run() {

TelephonyManager tm =

            (TelephonyManager)mContext.getSystemService(Service.TELEPHONY_SERVICE);



int nState = tm.getCallState();

Log.i(TAG, "mTelManager.getCallState = " + nState);

if (nState == TelephonyManager.CALL_STATE_IDLE)

{

while (!mTimerTask.cancel())

mTimer.cancel();

}

}

};



@Override

public void run() {

mTimer.schedule(mTimerTask, 1000, 1000);

}

}

你的代码不能区分对方是否接听,或者打不通,或者对方挂机,或者进入留言信箱

去电接通这个状态确实没有监听到,每次刚拨出去,状态就变更了,网上找了下,貌似确实没有一个好的解决方案,而且我发现很多软件只能监听GSM网络的,不知为何