【发布时间】:2018-04-11 12:57:32
【问题描述】:
我正在尝试使用电话管理器类与我的 java 卡小程序进行通信。有人可以帮我吗? 基本上我想建立一个连接,然后向 UICC 发送 APDU 命令,反之亦然,为此我需要执行以下步骤(如果我错了,请纠正我):
- 将 google SDK IccOpenLogicalChannelResponse 与 applet 应用程序 ID 结合使用
- 从 IccOpenLogicalChannelResponse 获取打开状态和逻辑通道
- 通过 iccTransmitApduLogicalChannel 发送 apdu 并获取字符串响应
- Android 应用销毁必须通过 iccCloseLogicalChannel 关闭频道
PS - 我成功实现了“Seek for android” - org.simalliance.openmobileapi 并且我的目标已经实现,但是继续为 API 级别超过 21 的 android 设备提供支持,我需要在其中实现 Telephony Manager 类安卓。
有人可以帮助我了解 Telephony Manager 功能的代码级用法吗: iccOpenLogicalChannel, iccCloseLogicalChannel, iccTransmitApduLogicalChannel, iccTransmitApduBasicChannel。
提前致谢!
【问题讨论】:
-
您知道您的应用需要
MODIFY_PHONE_STATE权限或运营商权限吗? -
是的,因为我得到的异常是: java.lang.SecurityException: No Carrier Privilege 在我的代码中的这一行 IccOpenLogicalChannelResponse response = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE).iccOpenLogicalChannel(some byte[]);
-
这就是为什么 TelephonyManager 很少用于现实世界的应用程序(用于与 UICC 通信)。
-
除了 TelephonyManager 之外还有其他方法吗?
-
要绕过 No Carrier Privilege 例外,您必须使用与卡相同的签名来签署您的应用程序。您可以使用 Android Studio 为您的应用签名。例如:developer.android.com/studio/publish/app-signing.html。原因是Android 5.1引入了Carrier Privileges (source.android.com/devices/tech/config/uicc)
标签: android android-studio javacard telephonymanager apdu