如何根据谷歌的Android最新拨号器应用程序(或基于Vanilla的ROM,如Lineage OS)制作拨号器?

问题描述 投票:6回答:1

背景

从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,应该实现的功能示例:静音,键盘,扬声器,添加呼叫(会议),保持,各种状态,视频呼叫(?),...

我发现了什么

试图制作我自己的解决方案,我找到了一个示例存储库(here - “简单电话”),我已经制作了自己的(here),只是为了找出我应该实现多少东西来制作一些东西。至少与Google提供的功能一样丰富。

我还搜索过其他人是否曾经克隆过拨号器,但发现只有2个,而且它们是Dialer的旧版本(一个here没有调用的用户界面,另一个here有一些问题使用call-log,并且使用了大量已弃用和禁止使用的东西),还有一些我甚至停下来考虑使用的错误。

所以我试图克隆我发现的Android本身的项目,here。遗憾的是,它有一个非常奇怪的文件夹结构,这使得无法理解应该如何处理它以及如何在IDE上导入它:

enter image description here

enter image description here

enter image description here

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

我甚至试图从自定义ROM中克隆拨号器应用程序(在Github上搜索,here),但是遇到了类似的问题。

然而不知何故,开发人员设法使其发挥作用。如果您尝试ApkMirror的“Lineage OS Phone”应用程序,您很可能会让它正常工作,特别是如果您使用v11而不是v19(v19在Pixel 2上为我工作但在Note 8上没有,但v11同时适用于两者) 。

据说谷歌的拨号器现在可以在越来越多的设备上使用(here),但出于某种原因,我认为很多设备都没有(在Note 8上测试过)。

这让我想起了4年前我在Eclipse IDE时代尝试克隆启动器并创建自己的启动器(制作存储库here)时遇到的许多问题。这对我来说很奇怪,这对于发射器来说就像它一样难......

到目前为止,唯一对我有用的是使用其中一个示例存储库(here),并制作了一个工作分支(here),但正如我所写,它有各种问题,例如无法处理调用 - 日志,当我尝试更新其targetSdk时,它有一些数据库问题(比如写的here)。也许还有更多我没注意到的问题。

更新:找到另一个存储库,here ("Koler"),通常工作正常。不是AOSP,但在某些情况下可以帮助理解事情的运作方式。

问题

  1. 如何克隆最新版本的Dialer应用程序并使用它?实现可构建项目的步骤是什么?
  2. 为什么要这么难?您提供的解决方案是否适用于Android内部的其他类型的应用程序(例如启动器)?
  3. 除了Vanilla Android OS之外(意味着如果没有使用它的好方法),是否可以为自定义ROM进行更新,如Lineage OS?
android gradle android-source android-dialer
1个回答
2
投票

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

你不能。基于AOSP拨号程序的项目在很大程度上依赖于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,用于在外部构建Launcher。同样,你必须看看它是否有效。

除了Vanilla Android OS之外,是否可以为自定义ROM进行更新,如Lineage OS?

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

© www.soinside.com 2019 - 2024. All rights reserved.