0

我目前正在开发一个呼叫应用程序,但遇到了有关 InCallService 的问题。我需要将它绑定到我的 CallActivity,以便扬声器、麦克风静音等功能正常工作。问题是,当我绑定它时(按照关于绑定服务的 Google 文档),onCallAdded 永远不会被调用。我应该如何绑定 InCallService?

这是目前的完成方式:

呼叫服务:

package com.;

import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.telecom.Call;
import android.telecom.InCallService;
import timber.log.Timber;

public class CallService extends InCallService {

    private final IBinder binder = new LocalBinder();

    public class LocalBinder extends Binder {
        CallService getService() {
            return CallService.this;
        }
    }

    public void testing() {
        Timber.e("IT WORKS");
    }

    @Override
    public void onCallAdded(Call call) {
        Timber.e("ADD");
        super.onCallAdded(call);
        new OngoingCall().setCall(call);
        CallActivity.start(this, call);
    }

    @Override
    public void onCallRemoved(Call call) {
        Timber.e("REMOVE");
        super.onCallRemoved(call);
        new OngoingCall().setCall(null);
    }

    @Override
    public IBinder onBind(Intent intent) {
        //return super.onBind(intent);
        Timber.e("BIND");
        return binder;
    }

}

呼叫活动服务连接:

private ServiceConnection connection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className, IBinder service) {
        CallService.LocalBinder binder = (CallService.LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }
};

开始:

Intent intent = new Intent(this, CallService.class);
    bindService(intent, connection, Context.BIND_AUTO_CREATE);
4

1 回答 1

1

系统也在尝试绑定到您的服务,并且InCallService onBind实现不为空。

您必须拨打至,super.onBind(intent)否则您的呼叫服务将无法正常工作。将自定义意图操作添加到您的bindService意图:

Intent intent = new Intent(this, CallService.class);
intent.setAction("DirectBind");
bindService(intent, connection, Context.BIND_AUTO_CREATE);

并在服务中解决它:

@Override
public IBinder onBind(Intent intent) {
    Timber.e("BIND by "+ intent); // log what intent is trying to bind to your service
    if (intent.getAction() == "DirectBind") {
        return binder;
    }
    return super.onBind(intent);
}
于 2020-07-06T13:09:08.790 回答