Состояние телефонного звонка

Как мы знаем программно, что вызов, который я делаю, получен с другой стороны? Я знаю, что есть некоторые состояния телефона, такие как IDLE, OFFHOOK и RINGING. Я хочу получать уведомления о том, что исходящий вызов, который я делаю, получен, отключен другой стороной или без присмотра с другой стороны.

Пожалуйста, предложите.

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 есть только три состояния, очень легко определить состояние для всех ситуаций в телефонном звонке. Итак, здесь мы получаем 3 события от android, такие как RINGING, OFFHOOK и IDLE. И чтобы получить ожидающее состояние вызова, нам нужно определить наши собственные состояния, такие как RINGING, OFFHOOK, IDLE, FIRST_CALL_RINGING, SECOND_CALL_RINGING .
Пожалуйста, подумайте так, что мы получаем события от android, и мы определим наши состояния вызова.
Ниже приведен метод получения состояний звонка по методу 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, если у нас нет внутреннего доступа к пакету.

Если у нас есть доступ к внутреннему пакету, то только мы можем узнать, действительно ли принимаемый вызов фактически принят или пропущен или отключен другой стороной.

Вы должны использовать broadcastreceiver со следующей версией 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 } } } 

И если вы хотите проверить промежуточное состояние, вы можете добавить, например, управление состоянием в виде целого числа ….