6

添加了 Android API 级别 23InCallService提供用于管理电话呼叫的用户界面。该文档提供了一个示例清单注册,但我无法让它工作。该应用程序编译良好,但设置中的默认应用程序不显示我的应用程序。

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

是否有替换电话应用程序所需的代码工作示例?类是否需要为应用提供一些工作方法才能展示?

4

1 回答 1

8

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

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

<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>

老实说,这有点违反直觉,因为设置默认电话应用程序与设置默认拨号器是分开的——前者仅控制正在进行的呼叫 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>

AOSP中的Dialer 应用程序声明了更多过滤器。

您可以在以下帮助下让用户更轻松地将您的应用设置为默认电话应用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)
}

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

更改默认拨号程序对话框

请参阅使用 android.telecom 和 InCallService 接听来电,了解实际处理呼叫所需的操作。

这是一个应用程序的代码,该应用程序实现了在其自己的 UI 中处理拨号和接受/拒绝/结束呼叫所需的最低要求:

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

于 2018-04-14T20:39:59.160 回答