Telecom服务
来源:互联网 发布:华为 海思 媒体算法 编辑:程序博客网 时间:2024/05/29 04:15
telecom服务概述
android5.0之后通信系统重构比较大,framework和app层都加入了Telecomm包。
framework是frameworks/base/telecomm/,app是packages/services/Telecomm
telecomm继原先的phone服务之后又加入了telecom服务,客户端使用的文件是:
frameworks/base/telecomm/java/com/android/internal/telecom/ITelecomService.java
/** * @see TelecomServiceImpl#silenceRinger */ void silenceRinger(String callingPackage);该类中有很多方法,例如该文件中定义了silenceRinger方法,功能是停止来电响铃。熟悉更早版本代码的同学会知道该方法原先是phone服务中实现的,5.0后转到了telecom服务。
服务实现和启动
服务实现在packages/services/Telecomm/src/com/android/server/telecom/TelecomServiceImpl.java
private final ITelecomService.Stub mBinderImpl = new ITelecomService.Stub() { ... /** * @see android.telecom.TelecomManager#silenceRinger */ @Override public void silenceRinger(String callingPackage) { synchronized (mLock) { enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); long token = Binder.clearCallingIdentity(); try { Log.i(this, "Silence Ringer requested by %s", callingPackage); mCallsManager.getRinger().silence(); } finally { Binder.restoreCallingIdentity(token); } } } ...}
public ITelecomService.Stub getBinder() { return mBinderImpl; }该类有个getBinder函数,被packages/services/Telecomm/src/com/android/server/telecom/components/TelecomService.java使用
public class TelecomService extends Service implements TelecomSystem.Component { @Override public IBinder onBind(Intent intent) { Log.d(this, "onBind"); initializeTelecomSystem(this); synchronized (getTelecomSystem().getLock()) { return getTelecomSystem().getTelecomServiceImpl().getBinder(); } } ...}在AndroidManifest.xml中:
<service android:name=".components.TelecomService" android:singleUser="true" android:process="system"> <intent-filter> <action android:name="android.telecom.ITelecomService" /> </intent-filter> </service>可见该TelecomService就是Android四大组件中的Service,不过特殊之处是运行在system进程中
至于这个Service是谁启动的,而telecom服务怎么通过ServiceManager.addService添加到系统服务中,见 android 5.1 TelecomService启动过程,懒得重复劳动了
服务使用
frameworks/base/telecomm/java/android/telecom/TelecomManager.java
private ITelecomService getTelecomService() { return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE)); }
public void silenceRinger() { try { if (isServiceConnected()) { getTelecomService().silenceRinger(mContext.getOpPackageName()); } } catch (RemoteException e) { Log.e(TAG, "Error calling ITelecomService#silenceRinger", e); } }与TelephonyManager类似,通过binder调用telecom服务。有趣的是TelephonyManager也使用了该方法:
public void silenceRinger() { try { getTelecomService().silenceRinger(getOpPackageName()); } catch (RemoteException e) { Log.e(TAG, "Error calling ITelecomService#silenceRinger", e); } }这个就纯粹是历史原因了,因为这个方法本来就是在TelephonyManager中的,而且用的是phone服务。之前有很多代码已经写了,这个方法目前实在是不好删除啊。
和phone服务的关系
telecom服务和phone服务的关系其实就是Telecomm.apk和TeleService.apk之间的关系。
telecomm是一个更一般的通讯框架,从它运行在system进程中就可以看出它的地位,gsm,cdma等蜂窝电话的技术细节和规范实现被保留在TeleService中。
除了这两个基本的通信方式外,还有国外比较普及的SIP通话,wifi通话,将来5G要普及的数据信号通话(目前还是模拟信号为主,微信qq等的语音或视频通话算是数字信号但是并不普及,没有运营商主干网的支撑效果也不好。目前国内移动已经开始推进融合通信,例如新的预装融合通信apk的运营商手机发短信就是和微信一样是走数据流量了,不会再是一条一毛钱了,但是通话这块好像还是没有动静,继续走Volte)。
技术细节被保留在TeleService或者其他模块后,telecom维护的就是最一般的通信状态,例如不管什么通信方式都会有连接对方的动作(拨号)、结束和对方通信(挂断电话)、对方请求和你通讯(电话来电,响铃等)。TeleService中的phone对象作为一个或者几个账户(一般情况:国内双卡机器就是两个账户,单卡机器一个)登记注册到Telecom模块中,其他的通话方式也可以作为一个账户登记到telecom中,这样用户拨号时候可以选择其它的通信方式通话,苹果的facetime类似于这个理念。例如设想下,微信就可以注册到telecom中(虽然目前好像并没有实现这个),这样和对方通话可以直接选择微信通话电话,不过这要求双方android5.0版本以上手机、联网,类似苹果的imessage理念(要求双方苹果手机、联网且都登录苹果账号,然后发短信会优先选择数据流量)。
捎带提及的是UI层在5.0后也被分离了出去,代码在packages/apps/InCallUI中(7.0 挪到了Dialer目录下),这样原先5.0之前的一个apk被拆分成了三块:负责通信初始化和通话技术细节维护的Telephony,负责一般通讯状态实现和维护的Telecomm,和通话界面InCallUI;framework由原先4.x(具体小版本号是多少忘记了)之前的frameworks/base/telephony也拆成了三块:telecom框架层代码frameworks/base/telecomm/,三方也用的通讯层(如SignalStrength,状态栏显示信号会用;TelephonyManager,专门给三方用的啊)代码frameworks/base/telephony,通信类apk(如Telephony,Mms,TelephonyProvider)才用的代码frameworks/opt/telephony/
目前除通信模块相关代码外framework中原本调用phone服务的地方基本都会调用telecomm服务了。和通信模块相关但非通话相关的继续用TelephonyManager,例如获取imei;和通话相关的用TelecomManager就对了,如停止响铃和判断当前是否是incall状态。
0 0
- Telecom服务
- [Telecom] Telecom相关收藏
- telecom dict
- The Great Telecom Meltdown
- Telecom for Dummies
- Telecom for Dummies
- China Telecom SMS(SGIP)
- UVa145 Gondwanaland Telecom
- UVa 145 - Gondwanaland Telecom
- Telecom - 002 - CallsManager
- Telecom指令源码
- POJ 1215 Gondwanaland Telecom 笔记
- http://www.huihoo.com/telecom/sip_rtp_stack.html
- Linux Gains Momentum in Telecom @ JDJ
- Webster's New World Telecom Dictionary
- 时曦科技 - ITU TELECOM ASIA 2002
- Android N Telecom对Audio的管理
- How to deal with telecom fraud?
- 性能测试分析
- ExpandableListView三级列表的实现
- 安装配置zabbix-server
- Hinton Neural Network课程笔记9f:Mackay的设定正则化系数方法
- 字符串转表方法
- Telecom服务
- zabbix简介及安装
- 开源项目地址
- Android 跳往 魅族 小米权限管理自启动(6.0)
- Oracle12c -Invisible Columns 测试
- ButterKnife失效的解决办法
- 为IObservable实现自己的运算符
- 监控利器---Zabbix(一)
- c++语言中类型的转换