当前位置: 代码迷 >> Android >> Stk简介跟核心类(android4.0 RIL Framework Java 部分)
  详细解决方案

Stk简介跟核心类(android4.0 RIL Framework Java 部分)

热度:939   发布时间:2016-04-27 22:22:34.0
Stk简介和核心类(android4.0 RIL Framework Java 部分)

?STK 或者 UTK 就是 Sim Tool Kit (sim卡工具包),定制了一系列与运营商相关的应用(查询天气,话费,彩铃等),可以理解为安装在SIM卡上的应用。目前对用户来说,基本上没有什么实际作用,google 自带了一个stk 应用。运营商将相关应用保存在SIM卡中,stk应用需要从SIM卡中读取相关应用信息,SIM卡也会向stk应用主动上报应用信息。
?Stk应用和SIM卡之间的通信主要通过RIL层来实现,相关消息有?
?unsolicited response message:
?RIL_UNSOL_STK_SESSION_END // 当前菜单项目 结束
?RIL_UNSOL_STK_PROACTIVE_COMMAND? // 显示菜单
?RIL_UNSOL_STK_EVENT_NOTIFY?
?RIL_UNSOL_STK_CALL_SETUP?
?solicited response message
?RIL_REQUEST_STK_GET_PROFILE?
?RIL_REQUEST_STK_SET_PROFILE
?RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND // 打开子菜单
?RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE //获取子菜单信息
?RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM
1.AppInterface
AppInterface 是一个 接口,主要用于 Stk应用和 stk telephony 之间的通信。catService.java,UiccManager.java 以及RIL.java 是stk telephony 的核心组件。
?<1>AppInterface 定义了stk应用里的所有命令。
?? public static enum CommandType {
??????? DISPLAY_TEXT(0x21),
??????? GET_INKEY(0x22),
??????? GET_INPUT(0x23),
??????? LAUNCH_BROWSER(0x15),
??????? PLAY_TONE(0x20),
??????? REFRESH(0x01),
??????? SELECT_ITEM(0x24),
??????? SEND_SS(0x11),
??????? SEND_USSD(0x12),
??????? SEND_SMS(0x13),
??????? SEND_DTMF(0x14),
??????? SET_UP_EVENT_LIST(0x05),
??????? SET_UP_IDLE_MODE_TEXT(0x28),
??????? SET_UP_MENU(0x25),
??????? SET_UP_CALL(0x10),
??????? OPEN_CHANNEL(0x40),
??????? CLOSE_CHANNEL(0x41),
??????? RECEIVE_DATA(0x42),
??????? SEND_DATA(0x43),
??????? GET_CHANNEL_STATUS(0x44),
??????? PROVIDE_LOCAL_INFORMATION(0x26);
?<2> AppInterface定义了处理命令的方法,onCmdResponse 主要用于 stk应用向CatService 传递命令消息。
?<3> CatService 实现了AppInterface接口,在Stk应用的 StkAppService 中持有 AppInterface[] 对象,这个数组的大小和SIM卡的数量相等。
2.StkAppService
? StkAppService 是一个Service,stk应用中,所有的画面都会显示菜单,用户执行命令时,就是通过启动该Service,让Service 将用户的命令传递给CatService.
? StkAppService 持有 AppInterface[],AppInterface[] 从UiccManager 中获取,有几张SIM卡就有几个AppInterface,一张SIM卡对应一个 CatService,CatService 处于单独的HandlerThread中,(App->RIL)消息传递的路径就是这样的,StkMenuActivity->StkAppService->ServiceHandler->CatService,(RIL->App)消息传递路径就是这样的,CatService->StkAppService->ServiceHandler->StkMenuActivity.
3.UiccManager?
?UiccManager,本质上是一个Handler,它向RIL注册了一个卡状态变化的消息。
?for (int i = 0; i < mCi.length; i++) {
??????????? Integer index = new Integer(i);
??????????? mCi[i].registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, index);
??????????? mCi[i].registerForNotAvailable(this, EVENT_RADIO_UNAVAILABLE, index);
??????????? // TODO remove this once modem correctly notifies the unsols
??????????? mCi[i].registerForOn(this, EVENT_ICC_STATUS_CHANGED, index);

??????? }
?当SIM卡的状态发生变化时,会主动上报消息,RIL 收到 RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED,UiccManager处理该消息。
???? case EVENT_ICC_STATUS_CHANGED:
??????????????? Log.d(LOG_TAG, "Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus"
?????????????????????? + " on index " + index);
??????????????? mCi[index].getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, index));
?向RIL请求获取 SIM卡状态,获取状态后,交给 UiccManager的 EVENT_GET_ICC_STATUS_DONE处理。
?case EVENT_GET_ICC_STATUS_DONE:
??????????????? Log.d(LOG_TAG, "Received EVENT_GET_ICC_STATUS_DONE on index " + index);
??????????????? AsyncResult ar = (AsyncResult)msg.obj;
??????????????? onGetIccCardStatusDone(ar, index);
??????????????? break;
?UiccManager 会将相关消息交给CatService.
?4.CatService 接收UiccManager 传递过来的消息,或者直接接收RIL 传递过来的信息,将信息传递到Stk 应用。Stk 应用也是通过 CatService 将相关动作发送给 stk telephony。
?不同于通话和网络模块的主动上报信息是交给TelephonyRegistry,Stk的主动上报信息是交给CatService 上报的。
?CatService 是在UiccManager 中初始化的,一张SIM卡对应一个CatService,Stk 应用也是通过 UiccManager 获取CatService 的。
?CatService 处理完主动上报的信息后,通过发送广播,将消息发送到Stk 应用。
?CatService 收到Stk应用发出的命令请求后,直接向RIl发送消息。
?5.RilMessageDecoder?
? RilMessageDecoder 是一个状态机,stk telephony 从SIM卡读取的信息是需要解码的,RilMessageDecoder可以看作是一个解码工具,解码完成后,它会将解码结果交给CatService.

  相关解决方案