?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.
详细解决方案
Stk简介跟核心类(android4.0 RIL Framework Java 部分)
热度:939 发布时间:2016-04-27 22:22:34.0
相关解决方案
- java 乱码 汉字是 ? 如何转换成汉字
- java web 登录次数限制,该如何解决
- java 工商银行网银支付 B2B的 都亟需什么,需要注意什么
- Java Applet程序从JDK6升级到7时遇到的有关问题
- java web 视频相干
- 请教一个关于链接后缀的有关问题(java web 应用)
- java 系统单点登录解决方案
- java.lang.NumberFormatException: For input string: "id"该如何处理
- java.lang.NoSuchMethodException: setId([Ljava.lang.String;)解决方法
- java 获取客户端IP解决办法
- JAVA 后台怎么获得前台页面FCKedit编辑器中的内容以及内容的样式
- java 正则化匹配有关问题
- java web 受阻
- java.lang.IllegalStateException: No output folder,该怎么解决
- java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccess,该如何解决
- java 乱码有关问题 急求大神
- java EE错误如何解决阿,都是过了,没有能解决的!
- java 工程打包有关问题 多谢各位大神!多谢
- JAVA WEB导航条,该怎么处理
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password,该如何处理
- java 中Node 有关问题
- 关于 java 引述传递和值传递,你的知否
- 吐了,java Timer 终止不了。
- Java Web 学习中有关问题,请高手指教
- java web中的url地址小疑点。
- java web开发解决办法
- java.lang.NullPointerException解决方法
- 关于 java cast 有关问题,你明白不
- java ftp 下传和上载乱码有关问题
- java web项目上的一些文件