Android OutgoingCall的ConnectionService实现

Android OutgoingCall的ConnectionService实现,android,android-6.0-marshmallow,phone-call,Android,Android 6.0 Marshmallow,Phone Call,我正在尝试实现ConnectionService、PhoneAccount和PhoneAccountHandle,以获取断开我的传出呼叫的原因(例如,用户拒绝呼叫、无法访问等) 到目前为止,我已经能够使用customPhoneAccount发起呼叫,但该电话从未通过,因此我无法获得响应 以下是我现在编写的代码: register()是从“我的活动”调用以注册phoneAccount的方法: public void register() { TelecomManager manager

我正在尝试实现ConnectionService、PhoneAccount和PhoneAccountHandle,以获取断开我的传出呼叫的原因(例如,用户拒绝呼叫、无法访问等) 到目前为止,我已经能够使用customPhoneAccount发起呼叫,但该电话从未通过,因此我无法获得响应

以下是我现在编写的代码:
register()是从“我的活动”调用以注册phoneAccount的方法:

public void register() {
    TelecomManager manager = (TelecomManager) getSystemService(TELECOM_SERVICE);
    PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(
            new ComponentName(getPackageName(),
                    MyConnectionService.class.getName()), "myConnectionServiceId");
    PhoneAccount.Builder builder = PhoneAccount.builder(phoneAccountHandle, "CustomAccount");
    builder.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER | PhoneAccount.CAPABILITY_CONNECTION_MANAGER);
    PhoneAccount phoneAccount = builder.build();
    manager.registerPhoneAccount(phoneAccount);
}
启动调用的call()方法:

 public void call() {
    TelecomManager manager = (TelecomManager) getSystemService(TELECOM_SERVICE);
    PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(
            new ComponentName(getPackageName(),
                    MyConnectionService.class.getName()), "myConnectionServiceId");
    Bundle test = new Bundle();
    test.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
    manager.placeCall(Uri.parse("tel:" + "1212312312"), test);
}
以下是MyConnectionService:

public class MyConnectionService extends ConnectionService {

public static final String TAG = MyConnectionService.class.getName();
@Override
public int onStartCommand(Intent intent,int flags, int startId) {
    Log.d(TAG, "On Start");
    return super.onStartCommand(intent, flags, startId);
}

@Override
public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
    Connection connection = super.onCreateOutgoingConnection(connectionManagerPhoneAccount, request);
    Log.d(TAG, connection.getDisconnectCause().getReason());
    return connection;
}

@Override
public void onCreateOutgoingConnectionFailed(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
    if (request != null) {
        Log.d(TAG, request.toString());
    }
    super.onCreateOutgoingConnectionFailed(connectionManagerPhoneAccount, request);
}
我尝试了不同的功能以及与ConnectionService相关的其他线程上提到的所有选项,但没有得到预期的结果,有人能帮我吗?

有几件事:

  • 您不应使用具有特殊用途的
    PhoneAccount.CAPABILITY\u CONNECTION\u MANAGER
    ,该用途不适用于您的用例,并且需要特殊权限

  • 您的
    onCreateOutgoingConnection
    方法不应调用超级版本;该方法是基本
    ConnectionService
    类中的空白方法。Telecom调用您对onCreateOutgoingConnection的覆盖,以便您可以提供一个新的连接实例

  • 看看Android开源
    TestConnectionService
    类;它实现了一个简单的
    连接服务

    TestConnectionService不是只用于进行虚拟/假呼叫吗?我也在尝试使用ConnectionService实现我们自己的呼叫应用程序。我希望我的应用程序能够进行真正的运营商呼叫。是否可以使用ConnectionService类?我建议以TestConnectionService为例来说明如何实现API。ConnectionService API不允许您的应用程序进行真正的运营商呼叫。其目的主要是包装VoIP呼叫解决方案的功能,以便呼叫将出现在设备的拨号器/电话应用程序中。如果你想打电话,你需要android.permission.CALL_手机的权限,然后可以使用TelecomManager#placeCall拨打外线电话。谢谢@TGunn!如果您的应用程序不允许进行真正的运营商呼叫,那么是否可以创建您自己的呼叫应用程序,并添加诸如在呼叫过程中播放音乐等功能@TGunn您能否提供一些示例来实现连接服务。示例代码非常有帮助,谢谢@TGunn您能够实现它吗?我只能使用ConnectionService进行假/假呼叫,但我需要能够进行实际呼叫。检查了Android源代码,看起来有很多事情需要做。我知道应该有更好的方法。@artsylar:不,我不能让它工作,我不确定在过去两年左右的时间里事情是否发生了变化,但当时很明显Android不允许“断开连接导致我的外呼断开”@Saurabh7474我坚持实现连接服务API。您能提供一些集成connectionService的示例吗。