使用android.telecom和InCallService接听来电

leR*_*bot 17 android gsm telecommunication

从API 21开始,Google一直在为android.telecom添加功能,特别是通过实现更多的TelecomManager成员和添加InCallService.最后一个应该允许非系统的第三方应用程序提供和替换系统Calls app in-call屏幕的功能 - 弹出的窗口允许操作EXTRA_STATE_OFFHOOKEXTRA_STATE_RINGING广播(即传入和传出的电话呼叫) ).

目前,只有这个屏幕可以完全控制振铃和活动呼叫以及具有细粒度信息的相关系统回调,通过根限制MODIFY_PHONE_STATE权限和许多安全的AOSP代码甚至无法通过反射访问.它特别是不同制造商的ROM风格中最变化的代码之一,以及发射器,触点和相机.

这一切都非常漂亮,但......

你如何实际开发第三方InCallService?

即:

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

我不会立刻问所有这些问题的答案,但任何一个答案都可能与其他问题有关.这是广泛的,但本质上它需要是:在网络上没有任何例子我偶然发现了AOSP代码,而且该代码基于root权限的假设,这使得它无法用于第三方应用程序开发目的.

are*_*lek 6

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

首先,用户需要选择您的应用作为默认的手机应用.有关这种方法,请参阅使用InCallService替换Android 6和7上的默认电话应用程序.

您还需要定义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>
Run Code Online (Sandbox Code Playgroud)

在那里你应该至少处理onCallAdded(设置监听器Call,启动你的UI - 活动 - 用于调用)和onCallRemoved(删除监听器).

如何回答这些电话

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

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

查看Call.Callback单个呼叫可能发生的事件.

Google是否提供了我尚未找到的任何实际教程

我不知道谷歌,但你可以查看我的简化示例https://github.com/arekolek/simple-phone

  • @arekolek可以在没有替换SYSTEM UI的情况下使用INCALL SERVICE(您在Github上的示例)吗? (2认同)

use*_*139 5

请遵循“ 在通话应用替换”的第二条评论中的建议。另外,您需要一个实现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>
Run Code Online (Sandbox Code Playgroud)

有了call对象后,回答就像call.answer()一样简单。我建议,当您使这些工作正常进行时,请运行几个测试调用以了解何时调用了不同的回调。

关于教程,我在研究时找不到任何东西,但是那是一年多以前的事了……

希望这可以帮助!