如何检测电话何时接听或拒绝

use*_*234 23 android telephony android-intent

当电话铃响时,我设法准备了一项活动.现在我需要知道如何取消这个活动,当我打电话或拒绝电话时.我是否打电话给EXTRA_STATE_IDLE?EXTRA_STATE_OFFHOOK?

有任何想法吗?

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



public class IncomingBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
    // If an incoming call arrives
    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING))
    { //Did my work }
Run Code Online (Sandbox Code Playgroud)

小智 25

拨打电话时,上述答案完全错误.在Android中,没有办法检测呼叫是否实际应答(如果是呼出呼叫).拨打号码的那一刻,off_hook州就被解雇了.这是Android编程的缺点之一.

  • “*在 android 中,无法检测到呼叫是否被实际接听(在拨出电话的情况下)。*”——那么股票拨号器如何检测/显示持续时间?在您方便时尝试此操作:拨打另一个号码 20 秒,然后在您结束通话。对于最后拨打的号码,您的拨号器应显示 0min0secs 持续时间。现在再次拨打电话,但在另一端接听电话 5-10 秒。在您的终端结束通话,您的**拨号器将显示接听电话的持续时间**! (3认同)

And*_*eas 21

在你的onReceive中:

PhoneStateChangeListener pscl = new PhoneStateChangeListener();
TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(pscl, PhoneStateListener.LISTEN_CALL_STATE);
Run Code Online (Sandbox Code Playgroud)

单独的课程:

private class PhoneStateChangeListener extends PhoneStateListener {
    public static boolean wasRinging;
    String LOG_TAG = "PhoneListener";
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch(state){
            case TelephonyManager.CALL_STATE_RINGING:
                 Log.i(LOG_TAG, "RINGING");
                 wasRinging = true;
                 break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                 Log.i(LOG_TAG, "OFFHOOK");

                 if (!wasRinging) {
                     // Start your new activity
                 } else {
                     // Cancel your old activity
                 }

                 // this should be the last piece of code before the break
                 wasRinging = true;
                 break;
            case TelephonyManager.CALL_STATE_IDLE:
                 Log.i(LOG_TAG, "IDLE");
                 // this should be the last piece of code before the break
                 wasRinging = false;
                 break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要做的就是编写一些代码来检查以前的状态是否"振铃".如果当前状态为空闲且前一状态正在响铃,则他们取消了呼叫.如果当前状态是摘机并且之前的状态正在响铃,他们接听了电话.

  • 还有一个问题接听电话怎么样? (3认同)

Kar*_*thi 7

以下是它在不同场景中经历的状态:

1)接听已接来电

CALL_STATE_RINGING => CALL_STATE_OFFHOOK (After Answering call) => CALL_STATE_IDLE (After End call) 
Run Code Online (Sandbox Code Playgroud)

2)拒绝/不应答(未接)已接来电

CALL_STATE_RINGING => CALL_STATE_IDLE (After End call)  
Run Code Online (Sandbox Code Playgroud)

3)拨打电话

CALL_STATE_OFFHOOK (After dialing) => CALL_STATE_IDLE (After End call) 
Run Code Online (Sandbox Code Playgroud)

  int prev_state=0;


  public class CustomPhoneStateListener extends PhoneStateListener {  

        private static final String TAG = "CustomPhoneStateListener";  

        @Override  
        public void onCallStateChanged(int state, String incomingNumber){  

            if(incomingNumber!=null&&incomingNumber.length()>0) incoming_nr=incomingNumber;   

            switch(state){  
                case TelephonyManager.CALL_STATE_RINGING:  
                        Log.d(TAG, "CALL_STATE_RINGING");  
                        prev_state=state;  
                        break;  
                case TelephonyManager.CALL_STATE_OFFHOOK:  
                Log.d(TAG, "CALL_STATE_OFFHOOK");  
                prev_state=state;  
                break;  
                case TelephonyManager.CALL_STATE_IDLE:  
                    Log.d(TAG, "CALL_STATE_IDLE==>"+incoming_nr);  
                    NumberDatabase database=new NumberDatabase(mContext);  
                    if((prev_state==TelephonyManager.CALL_STATE_OFFHOOK)){  
                        prev_state=state;  
                        //Answered Call which is ended  
                    }  
                    if((prev_state==TelephonyManager.CALL_STATE_RINGING)){  
                        prev_state=state;  
                        //Rejected or Missed call  
                    }  
                    break;  

            }  
        }  
    }  
Run Code Online (Sandbox Code Playgroud)

在你的接收器

onReceive(Context context, Intent intent) {  
        TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object  
        CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener();  
        telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);          //Register our listener with TelephonyManager  

        Bundle bundle = intent.getExtras();  
        String phoneNr= bundle.getString("incoming_number");  

        mContext=context;  
 }  
Run Code Online (Sandbox Code Playgroud)

  • 这是错的.拨打电话时会立即呼叫CALL_STATE_OFFHOOK.说真的,有多少人在stackoverflow中发布了这个,甚至没有测试过这个? (17认同)
  • Tnaks!我可以通过任何方式了解如何回复拨打电话? (2认同)