Как реализовать слияние вызовов, ожидание и вызов конференции с помощью android.telecom.InCallService - PullRequest
0 голосов
/ 16 января 2019

Я использую android.telecom.InCallService в одном из моих проектов. Он превосходно предоставляет все состояния телефонии, но после того, как вы внедрите эту услугу, вам нужно будет создать свою собственную программу набора номера, которая сможет обрабатывать все функции вызова, то есть объединение вызовов, конференц-связь, ожидание вызова и т. Д.

Любая ссылка или предложение по реализации ожидания вызова, слияния и конференции будут очень полезны.

1 Ответ

0 голосов
/ 11 февраля 2019

В этом репозитории я нашел только способ удержания вызова: CustomPhoneDialer .См. InCallService, о методе onCallAdded (Override), создайте новый OngoingCall.

    onCallAdded(Call call){
    ....
    new OngoingCall().setCall(call)
    ....
    }

В классе OngoingCall вам необходимо создать методы, которые вы собираетесь использовать в своей деятельности, такие как ответ, отклонение и т. Д. И один из вас должен удерживать / отменять:

public class OngoingCall {

public static BehaviorSubject<Integer> state = BehaviorSubject.create();
private static Call call;

private Object callback = new Call.Callback() {
    @Override
    public void onStateChanged(Call call, int newState) {
        super.onStateChanged(call, newState);
        state.onNext(newState);
    }
};

public final void setCall(@Nullable Call value) {
    if (call != null) {
        call.unregisterCallback((Call.Callback)callback);
    }

    if (value != null) {
        value.registerCallback((Call.Callback)callback);
        state.onNext(value.getState());
    }
    call = value;
}

public void answer() {
    assert call != null;
    call.answer(VideoProfile.STATE_AUDIO_ONLY);
}

public void hangup() {
    assert call != null;
    call.disconnect();
}
public void hold(){
    assert call != null;
    call.hold();
}

public void unHold(){
    assert call != null;
    call.unhold();
}
....
}

А в своей деятельности, в слушателе кнопки используйте эти методы:

private OngoingCall ongoingCall;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_call);
    ButterKnife.bind(this);

    ongoingCall = new OngoingCall();
    disposables = new CompositeDisposable();

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

    number = Objects.requireNonNull(getIntent().getData()).getSchemeSpecificPart();
}

@OnClick(R.id.answer)
public void onAnswerClicked() {
    ongoingCall.answer();
}

@OnClick(R.id.hangup)
public void onHangupClicked() {
    ongoingCall.hangup();
}

@OnClick(R.id.hold)
public void onHoldClicked(){
    ongoingCall.hold();
}

@OnClick(R.id.unhold)
public void onUnHoldClicked(){
    ongoingCall.unHold();
}
}
...