如何基于Google的Android最新拨号器应用程序(或基于Lineage OS等基于Vanilla的ROM)制作拨号器?

and*_*per 6 android gradle android-source android-dialer

背景

从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>
Run Code Online (Sandbox Code Playgroud)

并要求成为默认拨号程序,可以使用:

private fun offerReplacingDefaultDialer() {
    if (getSystemService(TelecomManager::class.java).defaultDialerPackage != packageName) {
        startActivity( Intent(ACTION_CHANGE_DEFAULT_DIALER)
                .putExtra(EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName))

    }
}
Run Code Online (Sandbox Code Playgroud)

问题

该API是如此之大,以至于很少有应用程序尝试过这样的事情,而与内置API相比,它们做了一个很小的实现。甚至比起Google的拨号器。

通过在通话过程中仅查看拨号器的UI即可实现的功能示例:静音,键盘,扬声器,添加通话(会议),保持,各种状态,视频通话(?),...

我发现了什么

为了制定自己的解决方案,我找到了一个示例存储库(此处为 “ simple-phone”),该存储库是我自己创建的(此处)分叉的,只是为了找出我应该实现多少东西才能制作出一些东西至少与Google提供的功能一样丰富。

我还搜索了其他用户是否曾经克隆过Dialer,但仅发现了2个,它们是Dialer的较旧版本(此处一个不具有通话中UI的版本,另一个此处存在一些问题带有调用日志,并且有很多已弃用和禁止使用的东西),还有一些我已停止考虑甚至使用的错误。

因此,我试图在此处克隆我发现的Android本身的项目。遗憾的是,它的文件夹结构很奇怪,无法理解应该怎么做以及如何在IDE中导入它:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

但是我找到的存储库以某种方式具有不同的文件夹结构,这意味着他们知道应该以某种方式对其进行修改,或者从那时起它已经发生了变化。

我甚至试图从自定义光盘克隆拨号应用程序(搜索Github上,在这里),却得到了类似的问题。

但是开发人员设法以某种方式使它起作用。如果您尝试使用ApkMirror的“ Lineage OS Phone”应用程序,则很有可能会正常运行,尤其是如果您使用v11而不是v19(v19在Pixel 2上对我有效,但在Note 8上却不起作用,而v11在这两者上均有效) 。

据说Google的Dialer现在可以在越来越多的设备上使用(在此处),但是由于某些原因,我认为它不能用于许多设备(在Note 8上进行了测试)。

它使我想起了4年前的Eclipse IDE时代,我试图克隆启动器并制作自己的启动器(在此处创建存储库)时遇到的许多问题。对我来说,这和发射器一样难...

到目前为止,对我而言唯一有效的方法是使用示例存储库之一(在此处),并使其成为工作叉(在此处),但是在我撰写本文时,它遇到了许多问题,例如无法处理调用日志,当我尝试更新其targetSdk,它有一些DB问题(如什么是写在这里)。也许还有更多我没有注意到的问题。

更新:在这里找到了另一个正常工作的存储库(“ Koler”)。不是AOSP,而是在某些情况下可以帮助您了解事物的工作方式。

问题

  1. 如何克隆最新版本的Dialer应用并使用它?实现可构建项目的步骤是什么?

  2. 为什么必须这么难?您提供的解决方案是否可以用于Android内部的其他类型的应用程序(例如启动器)?

  3. 除了Vanilla Android OS(这意味着如果没有好的解决方案)之外,是否可以针对不时更新的自定义ROM(例如Lineage OS)执行此操作?

小智 2

如何克隆最新版本的 Dialer 应用程序并使用它?

你不能。基于 AOSP Dialer 的项目严重依赖 AOSP 构建系统、内部库和 API,这些在完整的 AOSP 上下文之外根本不可用。

实现可构建项目的步骤是什么?

在 Android Studio 中构建它不会走得太远,除非您投入大量工作来重新设计或删除阻止您将其迁移到 Gradle 构建系统的内容。

为什么一定要这么难?

默认情况下,它根本不打算在 AOSP 之外构建。Google 工程师不在乎,他们有完整的 AOSP 结帐。定制 ROM 开发人员通常也不在乎,他们中的大多数人也会全面检查其修改后的源代码。

您提供的解决方案是否适用于 Android 内部的其他类型的应用程序(例如启动器)?

使用 Android Studio 构建它的唯一解决方案是使用 Gradle(然后使用 Import,正如您已经发现的那样)。有些应用程序包含 build.gradle,您必须看看它是否有效。启动器(AOSP 中的packages/apps/Launcher3,CM/LineageOS 中的packages/apps/Trebuchet)附带了一个由Google(无论出于何种原因)制作的build.gradle,用于在外部构建启动器。同样,您必须看看它是否有效。

除了 Vanilla Android 操作系统之外,是否可以为不时更新的自定义 ROM(例如 Lineage OS)执行此操作?

如前所述,大多数自定义 ROM 开发人员都有完整的源代码检查,因此他们通常不关心使用 Gradle(或 Android Studio)。一些 LineageOS 应用程序(Jelly/Browser、Eleven/Music 和其他一些)获得了 Gradle 支持,允许贡献者在没有完整源签出(可以是 70GB 或更多)的情况下测试更改,但这仅发生在 LineageOS 自己的应用程序上,因此到目前为止,AOSP 上游还没有使用任何东西。

  • 我正在寻找解决方案。简单地说这是不可能的并不是真的,因为我看到其他人成功了(正如我在问题中所写)。看看有效的例子。Github 存储库。Lineage OS 的电话应用程序。两者在两种截然不同的设备(Pixel 2 和 Note 8)上都能正常工作。我想知道该怎么做。不是如何不去做。显然,这不仅仅是克隆一个项目。这就是我问它的原因。如果这么容易的话我就会成功,而不用问如何做。 (2认同)