使用 android.telecom 和 InCallService 接听来电

Posted

技术标签:

【中文标题】使用 android.telecom 和 InCallService 接听来电【英文标题】:Answer incoming call using android.telecom and InCallService 【发布时间】:2017-06-05 16:00:54 【问题描述】:

自 API 21 以来,Google 一直在向android.telecom 添加功能,特别是通过实现更多TelecomManager 成员和添加InCallService。最后一个应该允许非系统的第 3 方应用程序提供和替换系统呼叫应用程序通话屏幕的功能 - 弹出并允许对 EXTRA_STATE_OFFHOOKEXTRA_STATE_RINGING 广播进行操作的窗口(即来电和去电)。

目前,只有这个屏幕可以完全控制响铃和活动呼叫以及相关的系统回调以及细粒度的信息,通过根受限的MODIFY_PHONE_STATE 权限和许多甚至无法通过反射访问的安全 AOSP 代码。值得注意的是,它是不同制造商的 ROM 风格中变化最大的代码之一,包括启动器、联系人和相机。

这一切都很漂亮,但是......

您是如何实际开发第 3 方 InCallService 的?

即:

    您如何获得有关 GSM 呼叫的通知和获取实例 如何接听这些电话 此类回调的生命周期是什么 Google 是否为此提供任何我尚未找到的实际教程

我不会一次性询问所有这些问题的答案,但任何一个答案都可能与其他问题相关联。这是广泛的,但本质上它必须是:除了 AOSP 代码之外,我在网络上没有偶然发现的示例,并且该代码基于 root 权限的假设,这使得它无法用于 3rd 方应用程序开发目的。

【问题讨论】:

对于你的问题 #1,android.intent.action.PHONE_STATE 广播不起作用吗? @SharpEdge 您会收到有关“通话”的通知,但您不知道哪个 android.telecom.Call - developer.android.com/reference/android/telecom/Call.html 在这样的情况下,我实际上可以调用#answer(int videoState) 和得到2.整理 那里似乎没有很多信息 - 这个问题中的 cmets 可能会有所帮助:***.com/q/34861910/334402。有一点需要注意,以防不清楚 - 此 API 将替换 InCallUI - 即控制调用的用户界面。 @Mick 是的,不是很多,因此是帖子。我非常清楚 API 的目的是替换 InCallUI。问题是 API 并没有真正提供这样做的方法,据我所知。你发布的那个问题问了很多和我一样的问题,而且这个问题很可能也被关闭了......伙计在我之前两天问过,而且非常相似,我实际上仔细检查了那个人是不是我,但他不是:P! 【参考方案1】:

您如何获得有关 GSM 呼叫的通知和获取实例

首先,用户需要选择您的应用作为默认电话应用。请参阅Replacing default Phone app on Android 6 and 7 with InCallService 了解如何执行此操作。

您还需要定义一个InCallService 实现,系统将绑定到该实现并通知您该调用:

<service
    android:name=".CallService"
    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>

您应该至少处理onCallAdded(在Call 上设置侦听器,启动您的UI - 活动- 用于呼叫)和onCallRemoved(删除侦听器)。

如何接听这些电话

如果用户想接听电话,需要调用Call#answer(int)方法,例如VideoProfile.STATE_AUDIO_ONLY

这个类的回调的生命周期是什么

查看Call.Callback,了解一次通话可能发生的事件。

Google 是否为此提供任何我没有找到的实际教程

我不了解 Google,但您可以查看我的简化示例 https://github.com/arekolek/simple-phone

【讨论】:

花时间下载示例,在 Android Nougat 设备上运行它(应该也可以在 Marshmallow 上运行),显示一个弹出窗口要求更换拨号器 (ACTION_CHANGE_DEFAULT_DIALER),接到一个呼出电话,按下接受,工作如预期。默认(三星)拨号器未显示 @arekolek 是否可以在不替换 SYSTEM UI 的情况下使用 INCALL SERVICE(您在 Github 上的示例)? @pudnivec74 你不需要InCallService 那么 @pudnivec74 那么您需要来自TelecomManager 的更新API:acceptRingingCall()endCall()silenceRinger()。就像我说的,你应该问一个单独的问题,因为它与这个答案完全无关。 @MateenChaudhry 我想说 Android 不允许这样做。即使您是选择处理来电的用户应用程序,也不应该 100% 地被第三方拦截诸如响铃之类的重要事情。谷歌正在采取进一步措施来移除 Android Pie 中的此类控制,移除对完整联系人提供商的访问权限、SMS 应用替换等【参考方案2】:

听从Replacing in call app第二条评论的建议。此外,您还需要一个实现 InCallService 接口的服务。当调用到达时,将调用 onCallAdded(Call call) 方法,为您提供对调用对象的引用。

<service
  android:name=".InCallServiceImplementation"
  android:enabled="true"
  android:exported="true"
  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>

一旦你有了呼叫对象,回答它就像 call.answer() 一样简单。我建议当你让上面的东西正常工作时,运行几个测试调用来了解何时调用不同的回调。

关于教程,我在研究这个时找不到任何教程,但那是一年多前的事了......

希望这会有所帮助!

【讨论】:

很好,今天将尝试测试实现并返回结果 嗨 IeRobot,您是否尝试过 InCallService,在我的情况下,服务没有被调用来进行呼入和呼出。 知道如何在不让手机振动的情况下拒绝使用此服务的呼叫吗?【参考方案3】:

我猜谷歌一定读过这个问题,因为显然在 Android 8 上,终于有了新的权限allows answering calls through a 3rd party dev-facing permission。

android.permission.ANSWER_PHONE_CALLS (...) 允许应用接听 来电以编程方式

目前还没有详细信息,因为 API 26 的文档还没有发布。当他们这样做时,我会确保更新这个答案。

编辑:用户 arekolek 提供了一个在这个问题的原始 API 版本上完美运行的答案(在提问时,API 是 23,即使问题提到了 API 21),因此他得到正确答案的勾号。如果您想实现一个针对最低 SDK 23 的调用屏幕,请参阅他的回答。请注意,如果您希望它适用于弃用(或限制)使用提供了示例代码。 github 存储库按我最初的预期工作。

【讨论】:

这个答案是题外话。如果您正在实现 InCallService,则不需要该 API,您可以使用 API 23 接听电话。 随时改进或添加答案,我不再投资于这个主题,所以我无法抽出时间来改进我自己问题的答案。据我了解,您只能接听奥利奥(26 岁)及以上的电话,不能接听棉花糖的电话。请参阅developer.android.com/reference/android/telecom/… -“在 api 级别 26 中添加”。此外,一个简单的谷歌搜索“扩展 InCallService”可以很好地显示事情的状态...... 我的理解是,acceptRingingCall() 可以让你告诉 Android 接听电话,而不会成为默认的电话应用。此外,据我所知,我链接到的存储库中使用的 API 均未在更新的 API 级别上被弃用或限制。

以上是关于使用 android.telecom 和 InCallService 接听来电的主要内容,如果未能解决你的问题,请参考以下文章

INCA操作之VUI开发工具

在 ETAS INCA 中,哪些类对应于每种类型的数据库项?

openssl命令查看证书的内容

时间戳未从 Glue 加载到 Redshift 表中

测量设备自动化-AK协议

https证书查看及其验证