如何获得拨出电话的状态

时间:2012-04-18 16:20:53

标签: android broadcastreceiver

OnReceive方法中,我有类似的内容:

    Bundle bundle=intent.getExtras();
   String phonenumber=intent.getStrngExtra(Intent.EXTRA_PHONE_NUMBER);

如果拨打电话仍然开机或客户端挂断电话怎么办? 如何检查电话是否已被接听?

当客户端挂断电话或被叫客户接听电话时,我需要打印一个toat。

3 个答案:

答案 0 :(得分:2)

您需要为行动注册广播接收器 android.intent.action.PHONE_STATE

iF手机状态已更改为空闲一旦摘机,就意味着呼叫仍在继续。

如果阅读电话状态广播接收器中的状态变为摘机,则呼叫应答。在这些状态下根据需要举杯祝酒。

   public class CallDurationReceiver extends BroadcastReceiver {

static boolean flag =false;
static long start_time,end_time;    
@Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if(action.equalsIgnoreCase("android.intent.action.PHONE_STATE")){
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                                TelephonyManager.EXTRA_STATE_RINGING)) {

               //tOAST FOR INCOMING CALL, NOT YET PICKED UP

            }         
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                    TelephonyManager.EXTRA_STATE_IDLE)) {
                end_time=System.currentTimeMillis();
 //Total time talked =
                long total_time = end_time-start_time;
                //Store total_time somewhere or pass it to an Activity using intent

}     if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                    TelephonyManager.EXTRA_STATE_OFFHOOK)) {
                 start_time=System.currentTimeMillis();

}    

    }   
    }

在您的清单文件中注册您的接收器,如下所示:

<receiver android:name=".CallDurationReceiver">
       <intent-filter>
           <action android:name="android.intent.action.PHONE_STATE" />
       </intent-filter>
    </receiver>
        }

还要添加使用权限:

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

答案 1 :(得分:1)

所有我找到了解决方案,并成功实现了它。当被叫方接听了拨出电话时,无法获取确切的时间。

在接听另一端的电话之前,它已经过了两个阶段,即on_State_idleon_state_offhookOn_state_ringing无法拨打电话。

如果另一方的人没有接听电话,我们假设手机连续振铃40秒(这不确定)。

  1. 启动计时器以及on_State_idleon_state_offhook的起始阶段。

  2. 如果计时器超过40秒,则有两种情况意味着另一方面的人接听我的电话。

  3. 如果on_State_idle->on_state_offhook->on_State_idle在40秒内工作,则意味着另一只手没有接听我的电话。

  4. 如果第二种情况属实,请从通话记录中提取通话时间。

  5. Totaltimer运行时间 - 通话记录中的时间为您提供了拨出电话的确切时间!

答案 2 :(得分:0)

您可以使用以下代码处理呼叫状态:::

    private Runnable callMonitor = new Runnable() {
        public void run() {
            try {
                EndCallListener callListener = new EndCallListener();
                TelephonyManager mTM = (TelephonyManager)m_activity.getSystemService(Context.TELEPHONY_SERVICE);
                mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);
            } catch(Exception e) {
                Log.e("callMonitor", "Exception: "+e.toString());
            }
        }
    };   

    private class EndCallListener extends PhoneStateListener {
        private boolean active = false;
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {

            if(TelephonyManager.CALL_STATE_RINGING == state) {
                Log.i("EndCallListener", "RINGING, number: " + incomingNumber);
            }
            if(TelephonyManager.CALL_STATE_OFFHOOK == state) {
                //wait for phone to go offhook (probably set a boolean flag) so you know your app initiated the call.
                active = true;
                Log.i("EndCallListener", "OFFHOOK");
            }
            if(TelephonyManager.CALL_STATE_IDLE == state) {
                //when this state occurs, and your flag is set, restart your app
                Log.i("EndCallListener", "IDLE");
                if (active) {
                    active = false;

                    // stop listening                   
                    TelephonyManager mTM = (TelephonyManager)m_activity.getSystemService(Context.TELEPHONY_SERVICE);
                    mTM.listen(this, PhoneStateListener.LISTEN_NONE);

                    // restart the inbox activity
//                  Intent intent = new Intent(m_activity, MDInboxActivity.class);
//                  m_activity.startActivity(intent);
                }
            }
        }
    }