Nie można wykryć, kiedy połączenie wychodzące jest odbierane w systemie Android
Aby wykryć, kiedy połączenie wychodzące zostało odebrane, próbowałem utworzyćPhoneStateListener
i nasłuchiwaćTelephonyManager
jestCALL_STATE_RINGING
, CALL_STATE_OFFHOOK
, iCALL_STATE_IDLE
, zto pytanie, ale nie działa, jak wyjaśniono poniżej.
Najpierw zarejestrowałem następujące pozwolenie w manifeście:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
NastępnieBroadcastReceiver
nazywaOutCallLogger
to łapieNEW_OUTGOING_CALL
zdarzenie za każdym razem, gdy wykonywane jest połączenie wychodzące:
<receiver android:name=".listener.OutCallLogger">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
Dalej, moja realizacjaOutCallLogger
. Ustawiłem boolean o nazwienoCallListenerYet
aby uniknąć dołączania nowegoPhoneStateListener
doTelephonyManager
kiedy tylkoonReceive()
jest wywoływany.
public class OutCallLogger extends BroadcastReceiver {
private static boolean noCallListenerYet = true;
@Override
public void onReceive(final Context context, Intent intent) {
number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
if (noCallListenerYet) {
final TelephonyManager tm = (TelephonyManager) context.getSystemService(
Context.TELEPHONY_SERVICE);
tm.listen(new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
Log.d(This.LOG_TAG, "RINGING");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(This.LOG_TAG, "OFFHOOK");
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.d(This.LOG_TAG, "IDLE");
break;
default:
Log.d(This.LOG_TAG, "Default: " + state);
break;
}
}
}, PhoneStateListener.LISTEN_CALL_STATE);
noCallListenerYet = false;
}
}
}
Teraz, gdy wykonuję połączenie wychodzące w moim urządzeniu,CALL_STATE_RINGING
NIGDY nie jest wywoływany. Zawsze otrzymuję wydruki „IDLE” do „OFFHOOK”, gdy druga linia zaczyna dzwonić, nic nie odpowiada, gdy połączenie zostanie odebrane, a wydruk „IDLE” ponownie, gdy połączenie zostanie zakończone.
Jak mogę wiarygodnie wykryć, kiedy połączenie wychodzące jest odbierane w Androidzie, a może nawet?