InCallService - 无法绑定服务

时间:2017-09-22 15:37:14

标签: android

我们正在构建IP呼叫应用程序的声音。我们对自Google API支持的Google支持的InCallService API感兴趣。

这将允许我们在相同的UI中控制本机调用和OTT调用,这对我们来说非常强大。我们也试过了ConnectionService,但它与我们试图实现的完全相反(Connection服务允许在本机UI中处理我们的VoIP cals)。

问题是如何实现InCallService没有很多文档(几乎没有)。我知道这个:

1)在清单中添加这些行:

    <service android:name="your.package.YourInCallServiceImplementation"
          android:permission="android.permission.BIND_INCALL_SERVICE">
      <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
      <intent-filter>
          <action android:name="android.telecom.InCallService"/>
      </intent-filter>
</service>

2)在电信服务绑定到其InCallService实现之前,必须首先将应用程序设置为默认电话应用程序(请参阅getDefaultDialerPackage())。

问题: 我们无法找到将我们的应用设置为默认手机应用的好方法。我们尝试将一个phoneaccount添加到TelecomManager但没有运气(我们这样做是为了连接服务)。

我们还尝试在manifest中的MainActivity +权限中添加这些intent过滤器:

<activity
    android:name="MainActivity"
    android:enabled="true">
<intent-filter>
    <action android:name="android.intent.action.DIAL"/>
    <action android:name="android.intent.action.CALL_PRIVILEGED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="tel"/>
</intent-filter>
<intent-filter>
    <action android:name="android.intent.action.CALL"/>
    <action android:name="android.intent.action.CALL_PRIVILEGED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="tel"/>
</intent-filter>
</activity>

...

<uses-permission android:name="android.permission.CALL_PHONE"/>

但仍然没有运气。

任何人都有更好的想法来帮助我们吗?

1 个答案:

答案 0 :(得分:1)

您可以发送一个方便的Intent,要求用户将您的应用设置为默认的手机应用:

private void checkDefaultDialer() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
      return;
    }

    TelecomManager telecomManager = (TelecomManager) getSystemService(TELECOM_SERVICE);

    boolean isAlreadyDefaultDialer = getPackageName()
        .equals(telecomManager.getDefaultDialerPackage());

    if (isAlreadyDefaultDialer) {
      return;
    }

    Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER)
        .putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, getPackageName());
    startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER);
}

Dialer dialog