三星设备上不会调用自我管理的连接服务回调

时间:2019-04-04 12:52:03

标签: android samsung-mobile

我使用this guide开发了VoIP应用程序。 我在三星设备上使用自助式连接服务时遇到了问题。

我正在使用TelecomManager拨打电话。 我希望可以调用ConnectionService :: onCreateOutgoingConnection或ConnectionService :: onCreateOutgoingConnectionFailed,但在某些Samsung设备上不会发生。

拨打电话dialog window appears后。在三星银河s10上,出现一个带有文本“未发送呼叫”的android吐司。连接服务的方法不会被调用。

在装有Android操作系统的手机上,它可以按预期运行。

有人知道如何解决这个问题吗?

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.tcom">

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
    <uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name="com.example.tcom.ConnectionService"
            android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
            <intent-filter>
                <action android:name="android.telecom.ConnectionService" />
            </intent-filter>
        </service>

    </application>

</manifest>

ConnectionService:

public class ConnectionService extends android.telecom.ConnectionService {
    private static final String TAG = "ConnectionService";
    @Override
    public android.telecom.Connection onCreateIncomingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
        Log.i(TAG, "onCreateIncomingConnection");
        Connection connection = new Connection();
        MainActivity.setConnection(connection);
        return connection;
    }

    @Override
    public void onCreateIncomingConnectionFailed(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
        Log.i(TAG, "onCreateIncomingConnectionFailed");
        super.onCreateIncomingConnectionFailed(connectionManagerPhoneAccount, request);
    }

    @Override
    public android.telecom.Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
        Log.i(TAG, "onCreateOutgoingConnection");
        Connection connection = new Connection();
        MainActivity.setConnection(connection);
        return connection;
    }

    @Override
    public void onCreateOutgoingConnectionFailed(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
        Log.i(TAG, "onCreateOutgoingConnectionFailed");
        super.onCreateOutgoingConnectionFailed(connectionManagerPhoneAccount, request);
    }
}

连接:

public class Connection extends android.telecom.Connection {
    private static final String TAG = "Connection";

    public Connection() {
        super();
        setConnectionProperties(android.telecom.Connection.PROPERTY_SELF_MANAGED);
    }

    @Override
    public void onStateChanged(int state) {
        super.onStateChanged(state);
        Log.i(TAG, "onStateChanged state=" + android.telecom.Connection.stateToString(state));
    }
}

创建电话帐户:

    void createAccount() {
        tm = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
        if (tm == null) {
            throw new RuntimeException("cannot obtain telecom system service");
        }

        ComponentName connectionServiceName = new ComponentName(getApplicationContext(), ConnectionService.class);
        PhoneAccountHandle accountHandle = new PhoneAccountHandle(connectionServiceName, PHONE_ACCOUNT_LABEL);
        try {
            PhoneAccount phoneAccount = tm.getPhoneAccount(accountHandle);
            if (phoneAccount == null) {
                PhoneAccount.Builder builder = PhoneAccount.builder(accountHandle, PHONE_ACCOUNT_LABEL);
                builder.setCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED);
                phoneAccount = builder.build();
                tm.registerPhoneAccount(phoneAccount);
            }
            this.accountHandle = phoneAccount.getAccountHandle();

            if (tm.getPhoneAccount(accountHandle) == null) {
                throw new RuntimeException("cannot create account");
            }

        } catch (SecurityException e) {
            throw new RuntimeException("cannot create account", e);
        }
    }

通话创建:


    void createCall() {
        try {
            Bundle extras = new Bundle();
            extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle);
            Uri uri = Uri.fromParts(PhoneAccount.SCHEME_SIP, "test_call", null);
            tm.placeCall(uri, extras);
        }
        catch (SecurityException e) {
            throw new RuntimeException("cannot place call", e);
        }
    }

2 个答案:

答案 0 :(得分:0)

一些固件更新后,上面的代码开始正常工作。 因此,问题出在手机本身。

答案 1 :(得分:0)

还有其他人遇到这个问题,只需确保两件事:

  1. 从电话帐户的功能中删除PhoneAccount.CAPABILITY_CALL_PROVIDER
  2. 您已实现了InCallService