android - 如何使用android.telecom.InCallService实现调用合并、等待和电话 session

标签 android telephonymanager

我在我的一个项目中使用 android.telecom.InCallService。它可以很好地提供所有电话状态,但是一旦您实现了此服务,您就需要创建自己的拨号器,它可以处理所有调用功能,即调用合并、 session 、调用等待等。

任何实现调用等待、合并和 session 的链接或建议都会有很大帮助。

最佳答案

我只在这个存储库中找到了如何保持通话: CustomPhoneDialer .查看InCallService,在方法onCallAdded(Override)上,新建一个OngoingCall。

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

在 OngoingCall 类中,您需要创建要在 Activity 中使用的方法,例如回答、拒绝等。其中之一需要保持/取消保持:

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();
}
....
}

在 Activity 中,在按钮监听器中使用这些方法:

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();
}
}

关于android - 如何使用android.telecom.InCallService实现调用合并、等待和电话 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54213087/

相关文章:

android - 使用服务获取 CallLog 上的最后一次通话

android - 如何监控网络类型并在它发生变化时得到通知

Android:如何确定实际的移动运营商名称?

telephonymanager - Android 11 中的 GetNetworkType

java - 当 fragment 膨胀时,抽屉导航启动未知 Activity

Android mvvm 我应该在两个 View 中使用 2 个 ViewModel、1 个 ViewModel,还是在父 Activity 中使用 1 个?

java - Android获取移动网络频段

java - 从定义位置的字符串变量获取引用

ANDROID:线性>相对>LinearLayout>表格>SeekBar太小

Android 建议编辑文本的帐户名称