您的 SIM 卡上可能有两种不同类型的小程序。
常用小程序
用普通 JavaCard 编写的普通小程序。这是您在普通智能卡世界中习惯使用的小程序类型。它具有process 方法,智能卡是通信中的被动主体:您的应用发送 APDU 命令和卡响应。
您可以使用一组名为 SEEK for Android 的特殊 Android 库与这些小程序进行通信。看看这个tutorial,了解如何创建这样的电话应用程序。
从 API 级别 21 开始,还有一种使用 Telephony Manager 与 SIM 通信的方法。但是,有一个巨大的障碍:您的应用程序需要MODIFY_PHONE_STATE 权限,该权限只能授予系统应用程序。不允许使用常规的非系统应用程序。
SIM 工具包小程序
SIM 卡不仅仅是一张普通的智能卡,如果您想使用 SIM 卡提供的所有可能性,为 SIM 卡编写小程序可能比普通智能卡复杂得多。我建议您阅读this paper - 这是某人的学士论文,但对于我在互联网上找到的初学者来说,这是最好的概述。我也推荐this video from the DefConn conference。
加载在 SIM 卡上的小程序的作用不同:小程序不再是被动实体。电话会定期询问您的小程序:“有什么我可以为您做的新事情吗?”并且您的小程序可以回复:“是的,请发送此短信”或“告诉我现在几点”等。此外,您的小程序可以成为某些事件的监听器:来电、收到短信、经过的时间间隔等。是的,SIM卡从技术上看似乎是被动的,但它的作用其实是主动的:向手机发送指令的是SIM卡。
这些命令称为“主动命令”或 SIM 应用程序工具包命令。结构相同——CLA INS P1 P2 LC数据LE;意思不一样。
您可以使用名为 sim.toolkit 的特殊 JavaCard 包中的类从您的小程序发送它们。
(SIM Application Toolkit 是一种标准,它指定主动命令的方式与 Global Platform 指定小程序生命周期的方式相同。)
SIM Toolkit 小程序示例:
import sim.toolkit.ToolkitInterface;
import sim.toolkit.ToolkitRegistry;
...
import javacard.framework.ISOException;
public class STKTest extends Applet implements ToolkitInterface {
public static void install(byte[] bArray, short bOffset, byte bLength) {
// GP-compliant JavaCard applet registration
new STKTest().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
//this method handles standard APDU commands
public void process(APDU apdu) {
// Good practice: Return 9000 on SELECT
if (selectingApplet()) {
return;
}
apdu.setIncomingAndReceive();
final byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS]) {
case (byte) 0x00:
//do something
break;
}
}
//this method handles the SIM Toolkit commands
public void processToolkit(byte event) throws ToolkitException {
switch (event) {
case ToolkitConstants.EVENT_TIMER_EXPIRATION:
//do something
break;
}
}
}
是的,您应该学习 Android - 您需要它才能使用 SEEK 库。您的问题非常广泛,如果需要,请向我询问任何详细信息。