我一直在研究Android电话功能的源代码,我有点迷失了。我基本上都认为,除非你是Google或OEM,否则无法处理CDMA / GSM设备。现在我只想弄清楚OEM在哪里放置他们的代码来处理电话,即他们从/实现什么类/接口。
在浏览手机应用的InCallScreen
活动时,我将结束通话按钮的点击处理程序追溯到PhoneUtils.hangup(CallManager)
,最终拨打com.android.internal.telephony.Call.hangup()
。由于com.android.internal.telephony.Call
是一个抽象类,com.android.internal.telephony.Call.hangup()
是一个抽象方法,我想知道这是否是OEM为提供电话服务而覆盖的类之一。在黑暗中更多的一个镜头是询问是否有人知道这个类的任何开源实现,所以我可以更深入地了解幕后发生的事情。
答案 0 :(得分:7)
你是对的。它确实是OEM实现的com.android.internal.telephony.Call
接口。更具体地说,需要实现com.android.internal.telephony.Phone
接口,它使用Call
,Connection
和更多接口。
对于您的第二个问题,Google / ASOP(Android开源项目)实际上确实为GSM和CDMA提供了所有这些类的实现。因此GSMPhone
接口的android源代码中有CDMAPhone
和Phone
实现。
如果您不想克隆整个Android源代码,可以克隆git https://android.googlesource.com/platform/frameworks/base
。在(frameworks/base)/telephony/java/com/android/internal/telephony/
或gsm/
文件夹中查看cdma/
下的内容。在这里你会发现例如GSMCall.java
这是您询问的com.android.internal.telephony.Call
接口的实现。
android电话堆看起来大概是这样的:
+------------------------------------+
| Phone | Contacts | (other apps) |
+------------------------------------+
|android internal telephony framework|
+------------------------------------+
| Radio Interface Layer (RIL) |
+------------------------------------+
| GSM/CDMA modem |
+------------------------------------+
GSM / CDMA调制解调器通常由某些供应商提供,而RIL层需要针对所使用的特定GSM / CDMA调制解调器进行定制。因此,在实践中,供应商不必修改Call
包中Connection
,Phone
,com.android.internal.telephony
等接口的现有实现,除非他们想要提供支持与GSM / CDMA手机不同的东西。