2011-04-21 149 views
7

我们如何以编程方式知道我正在拨打的电话是在另一方接收的? 我知道有一些电话状态,如IDLE,OFFHOOK和RINGING。 我希望收到我正在拨打的电话已收到,被对方断开连接或对方无人看管。电话状态

请建议。

回答

1

我的理解是,我们不能在各个国家之间的区分摘机状态里面,除非我们有内包装访问:然后你就可以做这样的事情。

如果我们有内部软件包访问权限,那么只有我们可以知道所连接的呼叫是实际接收还是错过或由另一方断开。

+0

嗨,我可以确切知道它指的是哪个内部包? – user2199280 2013-07-16 06:34:36

3

您需要一个PhoneStateListener。这样可以检查电话的状态。您必须实施onCallStateChanged。每次通话状态发生变化时都会调用此方法。

switch(state) { 
      case TelephonyManager.CALL_STATE_IDLE: 
        Log.d("Call","Outgoing Call finished"); 
      break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
        Log.d("Call","Outgoing Call Starting"); 
      break; 
     } 
+1

难道不是摘机状态,是指所有的这些拨号,呼叫建立和呼叫挂?我如何区分这三者。在一个链接中,我看到OFFHOOK状态仅表示呼叫已连接。请澄清。与呼叫连接的 – 2011-04-21 08:22:47

+0

我的意思是对方拿起电话。我还想知道,如果直接断开连接,对方可能没有接听电话。那我能知道吗? – 2011-04-21 08:24:26

+0

在这里你可以看到这三个状态的调用可以有:http://developer.android.com/reference/android/telephony/TelephonyManager.html – 2011-04-21 08:28:15

0

你必须使用广播接收器具有以下的onReceive实施检查phonestate改变

@Override 
public void onReceive(Context context, Intent intent) { 
    this.context = context; 
    final Bundle extras = intent.getExtras(); 
    if (intent.getAction().equals(
    TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ 
     final String state = extras.getString(TelephonyManager.EXTRA_STATE); 
     if ("IDLE".equals(state)){ 
      //TODO 
     } 
     if ("OFFHOOK".equals(state)){ 
      //TODO 
     } 
     if ("RINGING".equals(state)){ 
      //TODO 
     } 
    } 
} 

如果你要检查中间状态,你可以添加例如状态控制...

2

尽管在android电话管理器中只有三种可用状态,但在电话呼叫中很容易识别所有情况的状态。 所以我们在这里接收来自android的3个事件,例如RINGING,OFFHOOK和IDLE。为了获得呼叫的等待状态,我们需要定义我们自己的状态,如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; 
 
    } 
 
}