电话状态

我们如何以编程方式知道我所拨打的电话是在另一端收到的? 我知道有一些电话状态,如IDLE,OFFHOOK和RINGING。 我想通知我正在拨打的电话已经收到,被另一方断开或者被另一方无人看pipe。

请build议。

Solutions Collecting From Web of "电话状态"

你需要一个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; } 

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

我所理解的是我们不能区分OFFHOOK状态中的各种状态,除非我们有内部的包访问。

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

您必须使用以下onReceive实施的broadcastreceiver来检查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 } } } 

如果你想检查中间状态,你可以添加例如状态控制的整数forms….