Обнаружение исходящего вызова и события зависания вызова в android
У меня есть требование, в котором я хочу обнаружить два вида событий, связанных с вызовами в Android
- при исходящем звонке, мое приложение должно узнать это вместе с вызываемым номером
- когда вызов повесил трубку (из-за успеха/неудачи), мое приложение должно узнать об этом вместе с причиной зависания
возможно ли это в Android?
3 ответов
вы должны создать BroadcastReceiver:
public class CallReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_RINGING)) {
// Phone number
String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
// Ringing state
// This code will execute when the phone has an incoming call
} else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_IDLE)
|| intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_OFFHOOK)) {
// This code will execute when the call is answered or disconnected
}
}
}
вы должны зарегистрировать приложение, чтобы прослушать эти намерения в манифесте:
<receiver android:name=".CallReciever" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
существует более простое решение, использующее только TelephonyManager и PhoneStateListener.Вам даже не нужно регистрировать BroadcastReceiver.
public class MyPhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
//Hangup
case TelephonyManager.CALL_STATE_IDLE:
break;
//Outgoing
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
//Incoming
case TelephonyManager.CALL_STATE_RINGING:
break;
}
}
}
и зарегистрировать его:
public static void registerListener(Context context) {
((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).listen(new MyPhoneStateListener(),
PhoneStateListener.LISTEN_CALL_STATE);
}
вам нужно создать приемник для следующих действий намерения:
- исходящий вызов - ACTION_NEW_OUTGOING_CALL
- вызов hangup -ACTION_PHONE_STATE_CHANGED