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
原创粉丝点击