在Android 6和7上用InCallService替换默认电话应用程序

6

Android API level 23增加了InCallService,以提供用户界面来管理电话通话。文档提供了一个示例清单注册,但我无法使其工作。应用程序编译正常,但在设置中的默认应用程序中没有显示我的应用程序。

我发现有关此主题的唯一信息来源是StackOverflow问题,该问题已于一年前关闭。那个问题的评论建议添加android.intent.action.DIAL活动,但这对我也没有帮助。我在我的活动中尝试了其他意图的各种组合(android.intent.action.CALL_DIALandroid.intent.action.ANSWER)。

是否有任何可用于替换电话应用程序所需代码的工作示例?这些类需要提供一些工作方法才能显示应用程序吗?


1
我有一个带有“InCallService”的应用程序,它在Android 6上运行良好。但是,在Android 7上运行时,它无法获取InCallService的回调。您有任何想法吗? 我几天前发布了一个相关的问题,https://stackoverflow.com/questions/45079210/incallservice-not-working-in-android-nougat,但没有得到任何回复。 - Vineesh TP
@VineeshTP,你是如何在Android 6上使其工作的?如果可以,请分享解决方案。 - Piotr Aleksander Chmielowski
@PiotrAleksanderChmielowski:https://developer.android.com/reference/android/telecom/InCallService.html,使用Android文档中提到的代码本身。第一段就有提到。<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> - Vineesh TP
1个回答

10
应用程序编译正常,但在设置的默认应用程序中未显示我的应用程序。
要将您的应用程序列为电话应用程序,您必须具有至少这些意图过滤器的活动(处理文档中提到的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>

坦白说,这有点违反直觉,因为设置默认电话应用程序与设置默认拨号器是分开的——前者仅控制正在进行的通话界面,而后者仅控制拨号界面。
为了允许将您的拨号器设置为默认并从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中的拨号应用程序甚至声明了更多的过滤器。

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

请参考使用android.telecom和InCallService接听来电的答案,了解如何处理通话本身。
以下是一个应用程序的代码,实现了最少量的功能,以在其自己的用户界面中处理拨号、接受/拒绝/结束通话:

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


@MateenChaudhry,我鼓励你将其作为一个单独的问题发布。 - arekolek
这是问题。 如果您能回答,请回答。 https://stackoverflow.com/questions/52130348/reject-call-silently-using-incallservice/52130709?noredirect=1#comment91219240_52130709 - Mateen Chaudhry
1
它在MIUI小米设备上无法工作。我认为它只能在原生Android操作系统上运行,而不能在定制ROM上运行。 - Pinak Gauswami
@arekolek,你推荐的应用程序完美地运行了。但是我在将对象传递给CallActivity时遇到了困难。如果您能帮助我,我将不胜感激。https://stackoverflow.com/q/55620683/4300670 - Aliton Oliveira
1
@user13267,我注意到了一个Java分支,我可以看出它还有改进的空间,但是我被告知它已经能够正常工作了。 - arekolek
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接