Samsung设备上未调用自我管理的连接服务回调

问题描述 投票:1回答:1

我使用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);
        }
    }
android samsung-mobile
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.