使用InCallService替换Android 6和7上的默认Phone应用程序

时间:2017-03-16 15:23:13

标签: android android-intent android-6.0-marshmallow android-7.0-nougat android-7.1-nougat

Android API级别23将InCallService添加到提供用于管理电话的用户界面。该文档提供了示例清单注册,但我无法使其工作。该应用程序编译得很好但设置中的默认应用程序不显示我的应用程序。

我找到关于这个主题的任何信息的唯一地方是一年前关闭的a StackOverflow question。评论该问题,建议添加android.intent.action.DIAL活动,但这对我也没有帮助。我在我的活动中尝试了其他意图的各种组合(android.intent.action.CALL_DIALandroid.intent.action.ANSWER)。

是否需要更换手机应用所需的代码示例?这些类是否需要为应用程序提供一些工作方法来显示?

1 个答案:

答案 0 :(得分:3)

  

该应用程序编译得很好但设置中的默认应用程序不显示我的应用程序。

要将您的应用列为电话应用,您必须拥有至少包含这些意图过滤器的活动(以处理ACTION_DIAL文档中提到的两种情况,也在DefaultDialerManager hidden class中提及):< / p>

<intent-filter>
    <action android:name="android.intent.action.DIAL" />
    <data android:scheme="tel" />
</intent-filter>
<intent-filter>
    <action android:name="android.intent.action.DIAL" />
</intent-filter>

说实话,这有点违反直觉,因为设置默认的Phone应用程序与设置默认的Dialer是分开的 - 前者仅控制正在进行的呼叫UI,而后者仅控制拨号UI。

上述最小值可以稍微提高,允许将拨号器设置为默认值,并通过使用这些意图过滤器从Web浏览器启动:

<intent-filter>
    <!-- Handle links from other applications -->
    <action android:name="android.intent.action.VIEW" />
    <action android:name="android.intent.action.DIAL" />
    <!-- Populate the system chooser -->
    <category android:name="android.intent.category.DEFAULT" />
    <!-- Handle links in browsers -->
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="tel" />
</intent-filter>
<intent-filter>
    <action android:name="android.intent.action.DIAL" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

Dialer app in AOSP声明了更多过滤器。

TelecomManager的帮助下,您可以让用户更轻松地将您的应用设置为默认手机应用:

if (getSystemService(TelecomManager::class.java).defaultDialerPackage != packageName) {
    Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER)
            .putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName)
            .let(::startActivity)
}

这将显示类似于此的对话框:

change default dialer dialog

请参阅Answer incoming call using android.telecom and InCallService了解实际处理呼叫所需的操作。

这是一个应用程序的代码,它实现了处理拨号所需的最低限度,以及在自己的用户界面中接受/拒绝/结束调用:

https://github.com/arekolek/simple-phone