android - 使用 android.telecom 和 InCallService 接听来电

标签 android gsm telecommunication

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

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

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

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

即:

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

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

最佳答案

您如何获得有关 GSM 调用的通知和获取实例

首先,用户需要选择您的应用作为默认电话应用。引用 Replacing default Phone app on Android 6 and 7 with InCallService一种方法来做到这一点。

您还需要定义一个 InCallService系统将绑定(bind)到并通知您调用的实现:

<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 - Activity - 用于通话)和 onCallRemoved (删除监听器)。

如何接听这些电话

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

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

查看 Call.Callback对于一次调用可能发生的事件。

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

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

关于android - 使用 android.telecom 和 InCallService 接听来电,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41767460/

相关文章:

java - 如何在Java中仅删除字符串的尾随空格并保留前导空格?

architecture - 构建 SMS 服务器的最佳实践是什么

algorithm - 从 MAIN 生成的 PIN 和 PUK 的字符串模式/算法

text-to-speech - GSM SIM800C 文本转语音音频流

java - 无法在三星 S20 上检测到 CellInfo NR

c++ - 用于 IVR 应用的 SIP RTP 栈

tcp - tcp协议(protocol)实际上是如何工作的?

android通知两次启动相同的 Activity

android - 如何使视频全屏并保持纵横比?

android - 设置默认的 adb logcat 输出格式