自API 21以来,Google一直在向android.telecom添加功能,特别是通过实施TelecomManager的更多成员和添加InCallService。最后一个应该允许非系统的第三方应用程序提供和替换系统Calls app in-call屏幕的功能 - 弹出的窗口允许对EXTRA_STATE_OFFHOOK
或{{1广播(即传入和传出电话)。
目前,只有此屏幕可以完全控制振铃和活动呼叫以及具有细粒度信息的相关系统回调,通过根限制EXTRA_STATE_RINGING
权限和许多安全的AOSP代码甚至无法访问反射。它是不同制造商中变化最大的代码之一。 ROM风味,以及发射器,触点和相机。
这一切都非常漂亮,但......
您如何实际开发第三方InCallService?
即:
我不会立刻问所有这些问题的答案,但任何一个答案都可能与其他问题有关。这是广泛的,但本质上它需要:网络上没有任何例子我偶然发现AOSP代码以外的代码,并且该代码基于root权限的假设,这使得它无法使用用于第三方应用程序开发目的。
答案 0 :(得分:6)
首先,用户需要选择您的应用作为默认手机应用。请参阅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,但您可以查看我的简化示例https://github.com/arekolek/simple-phone
答案 1 :(得分:5)
遵循Replacing in call app第二条评论的建议。此外,您还需要一个实现InCallService接口的服务。当呼叫到达时,将调用onCallAdded(呼叫呼叫)方法,为您提供对呼叫对象的引用。
<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()一样简单。我建议当你得到上面的工作时,运行几个测试调用来了解何时调用不同的回调。
关于教程,当我调查这篇文章时,我找不到任何内容,但那是一年多以前......
希望这有帮助!
答案 2 :(得分: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的incall屏幕,请参考他的回答。注意你可能需要API依赖代码或compat库调整,如果你想让它在更新的API上工作,那些弃用(或限制)使用提供了示例代码。 github repo按照我最初的预期工作。