2013-10-21 168 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; 
    } 
}