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,而是在某些情况下可以帮助您了解事物的工作方式。
如何克隆最新版本的Dialer应用并使用它?实现可构建项目的步骤是什么?
为什么必须这么难?您提供的解决方案是否可以用于Android内部的其他类型的应用程序(例如启动器)?
除了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 上游还没有使用任何东西。
| 归档时间: |
|
| 查看次数: |
890 次 |
| 最近记录: |