Android呼叫等待状态

时间:2013-10-21 10:01:22

标签: android telephonymanager

是否有任何州可以告诉我们线路已连接且其他人的电话正在振铃。就像我想知道正确连接的状态和其他人知道你正在打电话并可以回答它一样?

我试过这个,但它从未进入电话响铃状态:

public void onReceive(final Context context, Intent intent) {
TelephonyManagerTm=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        Tm.listen(new PhoneStateListener(){
            public void  onCallStateChanged(int state,String number) {
                super.onDataConnectionStateChanged(state);
                switch(state)
                {
                    case TelephonyManager.CALL_STATE_RINGING:
                        Toast.makeText(context, "Phone Ringing", 1).show();
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK:

                        break;
                    case TelephonyManager.CALL_STATE_IDLE: 
                        Toast.makeText(context, "call rejected", 1).show();                 
                        break;
                }
            }
        },PhoneStateListener.LISTEN_CALL_STATE);

3 个答案:

答案 0 :(得分:2)

尽管Android Telephony Manager中只有三种状态,但很容易识别新来电的等待状态。此算法将为电话中的所有情况提供状态。

所以我们在这里接收来自android的3个事件,例如RINGINGOFFHOOKIDLE。为了获得新来电的等待状态,我们需要定义自己的状态,如 RINGING,OFFHOOK,IDLE,FIRST_CALL_RINGING,SECOND_CALL_RINGING
请以某种方式思考我们从Android接收事件,我们将定义我们的待命状态

这是在广播接收机的onReceive()获取呼叫状态而不注册PhoneStateListener并逃避其他复杂情况的方法。见代码。

public class CallListening  extends BroadcastReceiver {
    static CustomPhoneStateListener customPhoneListener;
    private static final String TAG ="broadcast_intent";
    public static String incoming_number;
    private String current_state,previus_state,event;
    public static Boolean dialog= false;
    private Context context;
    private SharedPreferences sp,sp1;
    private SharedPreferences.Editor spEditor,spEditor1;
    public void onReceive(Context context, Intent intent) {
        //Log.d("intent_log", "Intent" + intent);
        dialog=true;
        this.context = context;
        event = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        incoming_number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
        Log.d(TAG, "The received event : "+event+", incoming_number : " + incoming_number);
        previus_state = getCallState(context);
        current_state = "IDLE";
        if(incoming_number!=null){
            updateIncomingNumber(incoming_number,context);
        }else {
            incoming_number=getIncomingNumber(context);
        }
        switch (event) {
            case "RINGING":
                Log.d(TAG, "State : Ringing, incoming_number : " + incoming_number);
            if((previus_state.equals("IDLE")) || (previus_state.equals("FIRST_CALL_RINGING"))){
                    current_state ="FIRST_CALL_RINGING";
                }
                if((previus_state.equals("OFFHOOK"))||(previus_state.equals("SECOND_CALL_RINGING"))){
                    current_state = "SECOND_CALL_RINGING";
                }

                break;
            case "OFFHOOK":
                Log.d(TAG, "State : offhook, incoming_number : " + incoming_number);
                if((previus_state.equals("IDLE")) ||(previus_state.equals("FIRST_CALL_RINGING")) || previus_state.equals("OFFHOOK")){
                    current_state = "OFFHOOK";
                }
                if(previus_state.equals("SECOND_CALL_RINGING")){
                    current_state ="OFFHOOK";
                    startDialog(context);
                }
                break;
            case "IDLE":
                Log.d(TAG, "State : idle and  incoming_number : " + incoming_number);
                if((previus_state.equals("OFFHOOK")) || (previus_state.equals("SECOND_CALL_RINGING")) || (previus_state.equals("IDLE"))){
                    current_state="IDLE";
                }
                if(previus_state.equals("FIRST_CALL_RINGING")){
                    current_state = "IDLE";
                    startDialog(context);
                }
                updateIncomingNumber("no_number",context);
                Log.d(TAG,"stored incoming number flushed");
                break;
        }
        if(!current_state.equals(previus_state)){
            Log.d(TAG, "Updating  state from "+previus_state +" to "+current_state);
            updateCallState(current_state,context);

        }
    }
    public void startDialog(Context context) {
        Log.d(TAG,"Starting Dialog box");
        Intent intent1 = new Intent(context, NotifyHangup.class);
        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent1);

    }
    public void updateCallState(String state,Context context){
        sp = PreferenceManager.getDefaultSharedPreferences(context);
        spEditor = sp.edit();
        spEditor.putString("call_state", state);
        spEditor.commit();
        Log.d(TAG, "state updated");

    }
    public void updateIncomingNumber(String inc_num,Context context){
        sp = PreferenceManager.getDefaultSharedPreferences(context);
        spEditor = sp.edit();
        spEditor.putString("inc_num", inc_num);
        spEditor.commit();
        Log.d(TAG, "incoming number updated");
    }
    public String getCallState(Context context){
        sp1 = PreferenceManager.getDefaultSharedPreferences(context);
        String st =sp1.getString("call_state", "IDLE");
        Log.d(TAG,"get previous state as :"+st);
        return st;
    }
    public String getIncomingNumber(Context context){
        sp1 = PreferenceManager.getDefaultSharedPreferences(context);
        String st =sp1.getString("inc_num", "no_num");
        Log.d(TAG,"get incoming number as :"+st);
        return st;
    }
}

答案 1 :(得分:1)

是的,我们可以获得州PhoneStateListener

每当您从Ph​​oneStateListener扩展一个类时,您将获得onCallStateChanged(),如下所示:

 public class CustomPhoneStateListener extends PhoneStateListener {

      ActivityManager activityManager;
      Intent i1;
      public CustomPhoneStateListener(Context context) {
          super();
          this.context = context;
          i1 = new Intent(context, TelephoneyWithoutToastActivity.class);
          i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      }

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

          switch (state) {
          case TelephonyManager.CALL_STATE_IDLE:
              //when Idle i.e no call
              Toast.makeText(context, "Phone state Idle", Toast.LENGTH_LONG).show();

              break;
          case TelephonyManager.CALL_STATE_OFFHOOK:

              //when Off hook i.e in call
              //Make intent and start your service here
              Toast.makeText(context, "Phone state Off hook", Toast.LENGTH_LONG).show();

              break;
          case TelephonyManager.CALL_STATE_RINGING:

              ActivityManager localActivityManager = (ActivityManager) this.context.getSystemService("activity");
              for (String str = ((ActivityManager.RunningTaskInfo) localActivityManager.getRunningTasks(1).get(0)).topActivity.flattenToString();; str = ((ActivityManager.RunningTaskInfo) localActivityManager.getRunningTasks(1).get(0)).topActivity.flattenToString()) {
                  if ((!str.contains("com.android.phone.InCallScreen")))
                      continue;
                  Log.d("IncomingCallPlus", "*****************************************************");   
                  context.startActivity(i1);
                  return;
              }    

          default:
              break;
          }
      }    
  }

供参考check this

答案 2 :(得分:1)

有3种状态:IDLE, RINGING, OFFHOOK

对于来电,正常流程是:

  • IDLE(开始状态),
  • RINGING(电话响了),
  • OFFHOOK(用户选择)

对于拨出电话,流程为:

  • IDLE(开始状态),
  • OFFHOOK(仅在对方接听后才会打电话)

拨打电话之前没有RINGING状态。