簡體   English   中英

如何基於谷歌最新的 Android 撥號器應用程序(或基於原版的 ROM,如 Lineage OS)制作撥號器?

[英]How to make a dialer based on Google's Android latest dialer app (or of a Vanilla based ROM such as Lineage OS)?

背景

從 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,但在某些情況下可以幫助理解事情是如何運作的。

問題

  1. 如何克隆最新版本的 Dialer 應用程序並使用它? 實現可構建項目的步驟是什么?

  2. 為什么一定要這么難? 您提供的解決方案是否適用於 Android 內部的其他類型的應用程序(例如啟動器)?

  3. 作為 Vanilla Android OS 的替代方案(意思是如果沒有好的解決方案來使用它),是否可以為不時更新的自定義 ROM 執行此操作,例如 Lineage OS ?

如何克隆最新版本的 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?

如前所述,大多數自定義 ROM 開發人員都有完整的源代碼檢查,因此他們通常不關心使用 Gradle(或 Android Studio)。 一些 LineageOS 應用程序(Jelly/Browser、Eleven/Music 和其他一些)獲得了 Gradle 支持,允許貢獻者在沒有完整的源代碼檢查(可能是 70GB 或更多)的情況下測試更改,但這僅發生在 LineageOS 自己的應用程序上,所以到目前為止,還沒有 AOSP 在上游使用的任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM