您的 SIM 卡上可能存在两种不同类型的小应用程序。
普通应用程序
普通应用程序以纯 JavaCard 编写。这是您从常见智能卡世界中所熟悉的应用程序类型。它有一个 process
方法,智能卡在通信中是被动主体:您的应用程序发送 APDU 命令,卡片响应。
您可以使用名为 SEEK for Android 的特殊 Android 库与这些应用程序通信。请参阅此教程,了解如何创建此类手机应用程序。
从 API 级别 21 开始,还可以通过电信管理器(Telephony Manager)与 SIM 卡通信。但是,有一个巨大的障碍:您的应用程序需要获得 MODIFY_PHONE_STATE
权限,该权限只能授予系统应用程序。普通的非系统应用程序不能使用它。
SIM 工具包应用程序
SIM 卡远不止是一张普通的智能卡,如果您想使用 SIM 卡提供的所有可能性编写 SIM 卡应用程序,这将比编写普通智能卡应用程序要复杂得多。我建议您阅读这篇论文 - 它是某人的毕业论文,但对于初学者来说是我在互联网上找到的最好的概述。我还建议观看DefConn 大会的这个视频。
安装在 SIM 卡上的应用程序的作用是不同的:应用程序不再是被动实体。手机定期询问您的应用程序:“我可以为您做些什么吗?”您的应用程序可以回答:“是的,请发送此短信”或“请告诉我现在几点”等。此外,您的应用程序可以成为某些事件的侦听器:来电、收到的短信、经过的时间间隔等。是的,从技术角度来看,SIM 卡似乎是被动的,但它的角色实际上是积极的:它是向手机发送命令的 SIM 卡。
这些命令称为“主动命令”或 SIM 应用程序工具包命令。结构相同-CLA INS P1 P2 LC 数据 LE;意义不同。
您可以使用名为 sim.toolkit
的特殊 JavaCard 包中的类从您的应用程序发送它们。
(SIM 应用程序工具包是一种标准,它以与全球平台指定应用程序的生命周期相同的方式指定了主动命令。)
SIM 工具包应用程序示例:
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) {
new STKTest().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu) {
if (selectingApplet()) {
return;
}
apdu.setIncomingAndReceive();
final byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS]) {
case (byte) 0x00:
break;
}
}
public void processToolkit(byte event) throws ToolkitException {
switch (event) {
case ToolkitConstants.EVENT_TIMER_EXPIRATION:
break;
}
}
}
是的,你应该学习Android - 这将帮助你使用SEEK库。你的问题非常广泛,如果需要任何详细信息,请随时向我提问。