Как определить, когда телефон отвечает или отклонен

Мне удалось подготовить мероприятие, когда звонит телефон. Теперь мне нужно знать, как отменить эту активность, когда я прошу телефон или отклонить вызов. Я вызываю EXTRA_STATE_IDLE? EXTRA_STATE_OFFHOOK?

Есть идеи?

     public class IncomingBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); // If an incoming call arrives if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { //Did my work } 

в вашем onReceive:

 PhoneStateChangeListener pscl = new PhoneStateChangeListener; TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); tm.listen(pscl, PhoneStateListener.LISTEN_CALL_STATE); 

отдельный class:

 private class PhoneStateChangeListener extends PhoneStateListener { public static boolean wasRinging; @Override public void onCallStateChanged(int state, String incomingNumber) { switch(state){ case TelephonyManager.CALL_STATE_RINGING: Log.i(LOG_TAG, "RINGING"); wasRinging = true; break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.i(LOG_TAG, "OFFHOOK"); if (!wasRinging) { // Start your new activity } else { // Cancel your old activity } // this should be the last piece of code before the break wasRinging = true; break; case TelephonyManager.CALL_STATE_IDLE: Log.i(LOG_TAG, "IDLE"); // this should be the last piece of code before the break wasRinging = false; break; } } } 

Все, что вам нужно сделать, это написать код, чтобы проверить, было ли предыдущее состояние «звонить». Если текущее состояние неактивно, а предыдущее состояние звонит, они отменили вызов. Если текущее состояние отключено и предыдущее состояние звонит, они ответили на звонок.

Вышеприведенный ответ совершенно неверен в случае исходящих вызовов. В Android нет способа, с помощью которого можно определить, действительно ли был вызван вызов (в случае исходящих вызовов). Когда вы набираете номер, состояние off_hook запускается. Это один из недостатков Android-программирования.

Ниже приводятся состояния, которые он проходит в разных сценариях:

1) Ответ на входящий вызов

 CALL_STATE_RINGING => CALL_STATE_OFFHOOK (After Answering call) => CALL_STATE_IDLE (After End call) 

2) Отклонение / Неответ (Пропущенный) Принятый вызов

 CALL_STATE_RINGING => CALL_STATE_IDLE (After End call) 

3) Набор номера

 CALL_STATE_OFFHOOK (After dialing) => CALL_STATE_IDLE (After End call) 

Код

  int prev_state=0; public class CustomPhoneStateListener extends PhoneStateListener { private static final String TAG = "CustomPhoneStateListener"; @Override public void onCallStateChanged(int state, String incomingNumber){ if(incomingNumber!=null&&incomingNumber.length()>0) incoming_nr=incomingNumber; switch(state){ case TelephonyManager.CALL_STATE_RINGING: Log.d(TAG, "CALL_STATE_RINGING"); prev_state=state; break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.d(TAG, "CALL_STATE_OFFHOOK"); prev_state=state; break; case TelephonyManager.CALL_STATE_IDLE: Log.d(TAG, "CALL_STATE_IDLE==>"+incoming_nr); NumberDatabase database=new NumberDatabase(mContext); if((prev_state==TelephonyManager.CALL_STATE_OFFHOOK)){ prev_state=state; //Answered Call which is ended } if((prev_state==TelephonyManager.CALL_STATE_RINGING)){ prev_state=state; //Rejected or Missed call } break; } } } 

В вашем приемнике

 onReceive(Context context, Intent intent) { TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener(); telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); //Register our listener with TelephonyManager Bundle bundle = intent.getExtras(); String phoneNr= bundle.getString("incoming_number"); mContext=context; } 

ниже приведен код обнаружения исходящего вызова по событиям доступности –

Добавьте class, который расширяет AccessibilityService в ваших проектах –

 public class CallDetection extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { acquireLock(this); Log.d("myaccess","after lock"); if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) { Log.d("myaccess","in window changed"); AccessibilityNodeInfo info = event.getSource(); if (info != null && info.getText() != null) { String duration = info.getText().toString(); String zeroSeconds = String.format("%02d:%02d", new Object[]{Integer.valueOf(0), Integer.valueOf(0)}); String firstSecond = String.format("%02d:%02d", new Object[]{Integer.valueOf(0), Integer.valueOf(1)}); Log.d("myaccess","after calculation - "+ zeroSeconds + " --- "+ firstSecond + " --- " + duration); if (zeroSeconds.equals(duration) || firstSecond.equals(duration)) { Toast.makeText(getApplicationContext(),"Call answered",Toast.LENGTH_SHORT).show(); // Your Code goes here } info.recycle(); } } } @Override protected void onServiceConnected() { super.onServiceConnected(); Toast.makeText(this,"Service connected",Toast.LENGTH_SHORT).show(); AccessibilityServiceInfo info = new AccessibilityServiceInfo(); info.eventTypes = AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED; info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; info.notificationTimeout = 0; info.packageNames = null; setServiceInfo(info); } @Override public void onInterrupt() { } } 

Но для работы функции event.getSource() вам нужно указать некоторую конфигурацию вашего сервиса через xml, поэтому создайте в своем проекте папку xml и добавьте xml-файл с именем serviceconfig.xml (вы можете указать любое имя, которое вы хотите.

Содержание serviceconfig ниже –

  

Вы можете узнать больше о serviceconfig здесь

Теперь добавьте свою услугу в файл манифеста, например:

       

И вы сделали, просто запустите приложение и перейдите к настройкам доступности в своем телефоне, вы найдете опцию, названную как обнаружение ( или любое другое имя, которое вы указали в качестве описания вашего сервиса ), включите это, чтобы предоставить разрешения на доступ для вашего приложения.

Теперь вы увидите тост, когда на вызов будет дан ответ.

вы можете закодировать любой код, который вы хотите там, также вы можете вызвать функцию обратного вызова в своей деятельности

Самое главное – не звоните в свое окно вызовов (окно дозвона андроида) до ответа на вызов, иначе это не сработает.

Примечание. Поскольку андроид не предоставляет никакого решения для определения ответа на вызов или нет, это лучшая альтернатива, которую я сделал, надеюсь, что она работает для вас.

  • Как перенести работу на передний план (верхняя часть стека)?
  • Объявления Mopub не показываются
  • Обновление до сервисов Google Play: 9.0.0 Ошибка Не удалось решить: com.google.android.gms: play-services-measurement: 9.0.0
  • setEmptyView в ListView не показывает его вид в приложении для Android?
  • Почему ListView.getCheckedItemPositions () не возвращает правильные значения?
  • Как передать Bundle из fragmentа в fragment
  • Как включить javadoc для библиотеки поддержки Android?
  • Как выравнивать представления в нижней части экрана?
  • Удаление активности из стека истории
  • Является ли ondestroy не всегда называется?
  • Архивная библиотека Android (aar) против стандартной банки
  • Давайте будем гением компьютера.