Android 如何在谷歌';s安卓最新的拨号器应用程序(或基于普通ROM的应用程序,如天堂操作系统)? 背景

Android 如何在谷歌';s安卓最新的拨号器应用程序(或基于普通ROM的应用程序,如天堂操作系统)? 背景,android,gradle,android-source,android-dialer,Android,Gradle,Android Source,Android Dialer,从安卓M开始,可以更换操作系统的拨号器应用程序,这意味着接听电话可以显示自己的定制用户界面 这是通过扩展类并具有处理拨号意图的活动来实现的: <service android:name="your.package.YourInCallServiceImplementation" android:permission="android.permission.BIND_INCALL_SERVICE"> <meta-data android:nam

从安卓M开始,可以更换操作系统的拨号器应用程序,这意味着接听电话可以显示自己的定制用户界面

这是通过扩展类并具有处理拨号意图的活动来实现的:

<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>
问题 API如此之大,以至于很少有应用程序尝试过这样的事情,而且当他们尝试时,与内置API相比,他们的实现非常简单。甚至与谷歌的拨号器相比

通话时只需查看拨号器的UI即可实现的功能示例:静音、键盘、扬声器、添加通话(会议)、保持、各种状态、视频通话(?)

我发现了什么 为了制定我自己的解决方案,我找到了一个示例库(“简单电话”),我自己制作了一个fork(),只是为了找出我应该实现多少东西才能使它至少与谷歌提供的功能一样丰富

我还搜索了其他人是否克隆了拨号程序,但只发现了2个,而且它们是拨号程序的非常旧的版本(一个没有通话期间的UI,另一个与通话日志有一些问题,并且使用了很多不推荐和禁止的东西),我已经停止了一些bug,甚至考虑使用.< /P> 所以我试着克隆我发现的Android本身的项目。遗憾的是,它有一个非常奇怪的文件夹结构,这使得它无法理解应该用它做什么,甚至无法在IDE上导入它:

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

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

然而,不知何故,开发人员设法使其工作。如果您试用ApkMirror的“沿袭操作系统手机”应用程序,您很可能会发现它运行良好,尤其是如果您使用而不是(v19在像素2上对我有效,但在注释8上对我无效,但v11在两者上都有效)

据说谷歌的拨号器现在可以在越来越多的设备上使用(),但由于某种原因,我看不到它可以在很多设备上使用(在注释8中测试)

这让我想起了4年前在EclipseIDE时代,当我试图克隆启动器并创建自己的启动器(madeRepository)时遇到的许多问题。这对我来说很奇怪,这会像对发射器一样困难

到目前为止,唯一对我有效的方法是使用一个示例存储库(),并制作了一个工作分支(),但正如我编写的那样,它有各种问题,例如无法处理调用日志,并且当我尝试更新其targetSdk时,它有一些DB问题(如编写的内容)。也许还有更多我没有注意到的问题

更新:找到了另一个存储库,通常运行良好。不是AOSP,但在某些情况下可以帮助理解事物是如何工作的

问题
  • 如何克隆拨号程序应用程序的最新版本并使用它?实现可构建项目的步骤是什么

  • 为什么要这么难?您提供的解决方案是否适用于Android内部的其他类型的应用程序(例如launcher)

  • 除了普通的Android操作系统(也就是说,如果没有很好的解决方案来使用它的话),是否有可能为一个定制的ROM做这件事,它会不时地更新,比如天堂操作系统


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

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


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

    在androidstudio中构建它不会有太大的进展,除非你投入大量的工作来修改或删除阻止你迁移到Gradle构建系统的东西

    为什么这么难?

    默认情况下,它并不打算在AOSP之外构建。谷歌工程师不在乎,他们有一个完整的AOSP结账。自定义ROM开发人员通常也不关心,他们中的大多数人也对修改后的源代码进行了完整的签出

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

    使用androidstudio构建它的唯一解决方案是使用Gradle(然后使用Import,正如您已经发现的那样)。有些应用程序包括build.gradle,你必须看看它是否有效。启动器(AOSP中的packages/apps/launchet3,CM/relegeos中的packages/apps/Trebuchet)提供了一个build.gradle,该build.gradle由谷歌制作(无论出于何种原因),用于在外部构建启动器。同样,你必须看看它是否有效

    除了普通的安卓操作系统之外,是否有可能对一个定制的ROM进行更新,比如天堂操作系统?


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

    您是否尝试在项目中创建jar或aar并将其导入当前项目?@Vodet没有这样的文件,即使有,我也对修改拨号程序感兴趣,而不仅仅是使用它。为什么会投反对票?“实现可构建项目的步骤是什么?”——如果“可构建项目”是指Android
    private fun offerReplacingDefaultDialer() {
        if (getSystemService(TelecomManager::class.java).defaultDialerPackage != packageName) {
            startActivity( Intent(ACTION_CHANGE_DEFAULT_DIALER)
                    .putExtra(EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName))
    
        }
    }