【问题标题】:Android Connection Service report outgoing call without showing native call UI?Android Connection Service 报告拨出呼叫而不显示本机呼叫 UI?
【发布时间】:2021-09-26 14:50:34
【问题描述】:

我已经开发了一个带有 android ConnectionServices 和电信框架的语音通话应用程序。

当收到来自 firebase 的来电通知时,我可以显示本地通话屏幕,一切都很好。 当我开始拨出呼叫时,我只想将此呼叫报告给 Connection 服务,以便如果收到来自 gsm 的任何呼叫,它应该向呼叫者报告忙。在 callkit 中,如果您调用报告传出呼叫本机 callkit 屏幕不会出现在我的应用程序屏幕上,但 android 显示本机呼叫。 是否可以使本机屏幕对拨出电话不可见?

我的报告拨出电话的功能如下;

public void startCall(String number, String uuidString) {


    UUID uuid = null;
    if (uuidString != null) {
        uuid = UUID.fromString(uuidString);
    }
    //TODO: allow name passed in as well
    Log.d(TAG, "startCall number: $number");
    Bundle extras = new Bundle();
    Uri uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null);
    Bundle callExtras = new Bundle();
    callExtras.putString(Constants.EXTRA_CALL_NUMBER, number);
    if (uuid != null) {
        callExtras.putString(Constants.EXTRA_CALL_UUID, uuid.toString());
    }
    extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, voipUtilties.handle);
    extras.putParcelable(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, callExtras);
    if (ActivityCompat.checkSelfPermission(Application.context, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        Log.d("VOIP_pLuGIN", "Yetki Yok");
        return;
    }else{
        voipUtilties.telecomManager.placeCall(uri, extras);
    }


}

Service 类中覆盖的输出连接如下所示。

@Override
    public Connection onCreateOutgoingConnection(PhoneAccountHandle 
    connectionManagerPhoneAccount, ConnectionRequest request) {
    Bundle extras = request.getExtras();
    Connection outgoingCallConnection = null;
    String number = request.getAddress().getSchemeSpecificPart();
    String extrasNumber = extras.getString(EXTRA_CALL_NUMBER);
    String displayName = extras.getString(EXTRA_CALLER_NAME);
    boolean isForeground = VoipConnectionService.isRunning(this.getApplicationContext());

    Log.d(TAG, "makeOutgoingCall:, number: " + number + ", displayName:" + displayName);

    // Wakeup application if needed
    if (!isForeground) {
        Log.d(TAG, "onCreateOutgoingConnection: Waking up application");
       //TODO:
    }

    outgoingCallConnection = createConnection(request);
    outgoingCallConnection.setDialing();
    outgoingCallConnection.setAudioModeIsVoip(true);
    outgoingCallConnection.setCallerDisplayName(displayName, TelecomManager.PRESENTATION_ALLOWED);

    // ‍️Weirdly on some Samsung phones (A50, S9...) using `setInitialized` will not display the native UI ...
    // when making a call from the native Phone application. The call will still be displayed correctly without it.
    if (!Build.MANUFACTURER.equalsIgnoreCase("Samsung")) {
        outgoingCallConnection.setInitialized();
    }

    Log.d(TAG, "onCreateOutgoingConnection: calling");


    final String uuid = outgoingCallConnection.getExtras().getString(EXTRA_CALL_UUID);
    setAllOthersOnHold(uuid);

    final String address = outgoingCallConnection.getExtras().getString(EXTRA_CALL_NUMBER);
    Log.d(TAG,"Created call's uuid" + uuid);

   

    return outgoingCallConnection;
}

任何想法都会被采纳。

【问题讨论】:

  • 嗨 :) 你能分享你的扩展“连接”类的类吗?如果您没有,您应该将您的服务声明为“SELF_MANAGED”,请参阅here
  • 非常感谢您的回答。是的,将 Service 更改为 SELF_MANAGED 解决了我的问题。

标签: android voip android-connectionservice telecom-manager


【解决方案1】:

我在我的项目中使用this package。在 VoipUtilities.kt 将 PhoneAccount 功能更改为 CAPABILITY_SELF_MANAGED 而不是 CAPABILITY_CALL_PROVIDER 并在 VoipconnectionService.java 中,我将此代码块添加到 createConnection 函数解决了我的问题。

 if((phoneAccount.getCapabilities() & PhoneAccount.CAPABILITY_SELF_MANAGED) == PhoneAccount.CAPABILITY_SELF_MANAGED) {
                Log.d(TAG, "[VoiceConnectionService] PhoneAccount is SELF_MANAGED, so connection will be too");
                connection.setConnectionProperties(Connection.PROPERTY_SELF_MANAGED);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多