背景
从 Android M 开始,可以替换操作系统的拨号器应用程序,这意味着接听电话可以显示您自己的自定义 UI。
这是通过扩展InCallService类并拥有一个处理拨号意图的 Activity 来完成的:
<service android:name="your.package.YourInCallServiceImplementation"
android:permission="android.permission.BIND_INCALL_SERVICE">
<meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
<meta-data android:name="android.telecom.IN_CALL_SERVICE_RINGING"
android:value="true" />
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
</service>
<activity android:name="your.package.YourDialerActivity"
android:label="@string/yourDialerActivityLabel">
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
要请求成为默认拨号程序,您可以使用:
private fun offerReplacingDefaultDialer() {
if (getSystemService(TelecomManager::class.java).defaultDialerPackage != packageName) {
startActivity( Intent(ACTION_CHANGE_DEFAULT_DIALER)
.putExtra(EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName))
}
}
问题
API 是如此之大,以至于很少有应用程序甚至尝试过这样的事情,当他们这样做时,与内置的相比,他们做了一个非常小的实现。甚至与谷歌的拨号器相比。
应实现的功能示例,只需在通话期间查看拨号器的 UI:静音、键盘、扬声器、添加通话(会议)、保持、各种状态、视频通话 (?)、...
我发现了什么
尝试制作自己的解决方案时,我找到了一个示例存储库(此处- “simple-phone”),我已经制作了自己的分支(此处),只是为了找出我应该实现多少东西来制作一些东西至少与 Google 提供的功能一样丰富。
我也搜索过其他人之前是否克隆过拨号器,但只找到了 2 个,它们是相当旧的拨号器版本(一个没有通话期间的 UI,另一个有一些问题带有呼叫日志,并且有很多不推荐使用和禁止使用的东西),并且有一些我已经停止考虑使用的错误。
因此,我尝试在此处克隆我发现的 Android 项目。可悲的是,它有一个非常奇怪的文件夹结构,这使得它无法理解应该用它做什么以及如何在 IDE 上导入它:
但是不知何故,我发现的存储库具有不同的文件夹结构,这意味着他们知道应该以某种方式对其进行修改,或者从那时起它已经更改。
我什至尝试从自定义 ROM 克隆拨号器应用程序(在 Github 上搜索,这里),但遇到了类似的问题。
然而不知何故,开发人员设法使其工作。如果您从 ApkMirror 试用“Lineage OS Phone”应用程序,您很可能会正常工作,特别是如果您使用v11而不是v19(v19 在 Pixel 2 上对我有效,但在 Note 8 上无效,但 v11 在两者上都有效) .
也有人说谷歌的拨号器现在可以在越来越多的设备上使用(在这里),但由于某种原因,我看不到它适用于许多设备(在 Note 8 上测试过)。
它让我想起了4 年前,在 Eclipse IDE 时代,我尝试克隆启动器并制作自己的启动器(在此处制作存储库)时遇到的许多问题。这对我来说很奇怪,这和启动器一样难......
到目前为止,唯一对我有用的是使用其中一个示例存储库(此处),并对其进行了工作分叉(此处),但正如我所写的那样,它存在各种问题,例如无法处理调用-日志,当我尝试更新它的 targetSdk 时,它有一些数据库问题(比如这里写的)。也许还有更多我没有注意到的问题。
更新:在这里 ("Koler")找到了另一个存储库,它通常可以正常工作。不是 AOSP,但在某些情况下可以帮助理解事情是如何运作的。
问题
如何克隆最新版本的 Dialer 应用程序并使用它?实现可构建项目的步骤是什么?
为什么一定要这么难?您提供的解决方案是否适用于 Android 内部的其他类型的应用程序(例如启动器)?
作为 Vanilla Android OS 的替代方案(意思是如果没有好的解决方案来使用它),是否可以为不时更新的自定义 ROM 执行此操作,例如 Lineage OS ?