自 API 21 以来,Google 一直在向 android.telecom 添加功能一般而言,尤其是通过实现 TelecomManager 的更多成员并添加 InCallService .最后一个应该允许非系统、第 3 方应用程序提供和替换系统调用应用程序通话屏幕的功能 - 弹出并允许对 EXTRA_STATE_OFFHOOK
或EXTRA_STATE_RINGING
广播(即来电和去电)。
目前,只有这个屏幕可以完全控制响铃和 Activity 调用以及相关的系统回调,具有细粒度的信息,通过根限制的 MODIFY_PHONE_STATE
权限和许多安全的 AOSP 代码不甚至可以通过反射访问。值得注意的是,它是不同制造商的 ROM 风格中变化最大的代码之一,包括启动器、联系人和相机。
这一切都很漂亮,但是......
您是如何实际开发第 3 方 InCallService 的?
即:
- 您如何获得有关 GSM 调用的通知和获取实例
- 如何接听这些电话
- 此类回调的生命周期是什么
- 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/