2013-10-21 169 views
0

是否有任何狀態可以告訴我們線路已連接並且其他人的電話正在振鈴。就像我想知道正確連接的狀態,並且其他人知道您正在打電話並可以回答它?Android呼叫等待狀態

我都試過,但它永遠不會在電話振鈴狀態:

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); 

回答

1

是的,我們可以得到國家PhoneStateListener

每當你從延長一個PhoneStateListener類,你會得到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

+0

我已經編輯我的問題,並加入我的代碼,但我在電話振鈴狀態從來沒有得到 – user2137186

+0

沒有你提到需要在manifest文件 – Pinki

+0

權限和廣播接收器,我有以下清單中的文件:<使用許可權的android:名稱=「android.permission。PROCESS_OUTGOING_CALLS「/> <使用權限android:name =」android.permission.READ_PHONE_STATE「/> <使用權限android:name =」android.permission.RECEIVE_BOOT_COMPLETED「/> <使用權限android:name =」 android.permission.READ_PHONE_STATE「/> <使用權限的android:name =」android.permission.CALL_PHONE「/> – user2137186

1

有3個州:IDLE, RINGING, OFFHOOK

對於來電的正常流動是:

  • IDLE(啓動狀態)時,
  • RINGING(電話振鈴),
  • OFFHOOK(用戶拿起)

對於傳出呼叫,流量爲:

  • IDLE(啓動狀態),
  • OFFHOOK(叫對方拿起後,才)

有撥出電話沒有RINGING狀態他們拾起之前。

2

儘管Android電話管理器中只有三種可用狀態,但很容易識別新來電的等待狀態。這個算法將爲電話中的所有情況提供狀態。

所以,我們在這裏接收來自android的3個事件,如RINGINGOFFHOOKIDLE。爲了獲得新來電的等待狀態,我們需要定義我們自己的狀態,如RINGING,OFFHOOK,IDLE,FIRST_CALL_RINGING,SECOND_CALL_RINGING
請認爲我們正在從android收到事件,我們將定義我們的電話

這裏是在沒有註冊PhoneStateListener的情況下獲得廣播接收機onReceive()的呼叫狀態並逃避其他複雜情況的方法。看代碼。

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; 
    } 
}