Как определить входящий звонок и исходящий вызов в android
как получить события входящего вызова и исходящего вызова в android отдельно.
На самом деле я пытался разработать приложение, которое открывается при входящем вызове, если номер существует в базе данных, и он работает нормально. но если я звоню с устройства (исходящий звонок), и если номер существует в базе данных, он открывает мое приложение.
Я хочу ограничить возможность открытия приложения при исходящем вызове.
В моем манифесте я получаю входящий вызов следующим образом:
<receiver android:name=".IncomingCallReceiver" >
<intent-filter >
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
IncomingCallReceiver:
MyPhoneStateListener phoneListener=new MyPhoneStateListener(context);
TelephonyManager telephony = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
MyPhoneStateListener:
public void onCallStateChanged(int state,String incomingNumber){
switch(state) {
case TelephonyManager.CALL_STATE_IDLE:
Log.d("DEBUG", "IDLE");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d("DEBUG", "OFFHOOK");
Intent i = new Intent(context, MyMainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d("DEBUG", "RINGING");
break;
}
}
может кто-нибудь помочь мне дифференцировать исходящий звонок от входящего вызова, поэтому я буду обрабатывать эти события.
Спасибо заранее.
Ответы
Ответ 1
Я хочу ограничить возможность открытия приложения при исходящем вызове.
on case TelephonyManager.CALL_STATE_OFFHOOK:
проверьте, было ли предыдущее состояние CALL_STATE_RINGING
или CALL_STATE_IDLE
(например, при настройках в обоих случаях устанавливался другой флаг).
В последнем случае приступайте к открытию приложения, иначе ничего не делайте
Ответ 2
добавьте <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
в свой приемник и обработайте его в своем методе onReceive()
.
<receiver android:name=".IncomingCallReceiver" >
<intent-filter >
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
Ответ 3
Действие намерения android.intent.action.NEW_OUTGOING_CALL
обрабатывает исходящие вызовы, но для входящего вызова я предлагаю проверить его следующим образом:
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
//outgoing call
} else if (intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) != null) {
//incoming call
}