如何使用android.telecom.InCallService实现呼叫合并,等待和电话会议

问题描述 投票:1回答:1

我用我的项目之一android.telecom.InCallService。它给所有的电话状态出色,但一旦你实现这个服务,你需要创建自己的拨号器,它可以处理所有的呼叫功能,即呼叫合并,会议,呼叫等待,等等。

任何链接或建议来实现呼叫等待,合并和会议将是巨大的帮助。

android telephonymanager
1个回答
0
投票

我只发现了如何保持呼叫,在这个仓库:CustomPhoneDialer。见InCallService,上onCallAdded(覆盖)的方法,创建一个新的OngoingCall。

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

在正在进行的通话类,你需要创建你走你的活动一样的答案使用方法,拒绝等。而你们中的一个需要,保持/不保持:

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();
}
}
© www.soinside.com 2019 - 2024. All rights reserved.