如何在Java卡中使用Sim Toolkit中的url启动浏览器

如何在Java卡中使用Sim Toolkit中的url启动浏览器,java,javacard,sim-card,sim-toolkit,Java,Javacard,Sim Card,Sim Toolkit,我的工作分配给了我一份工作,如果技术上可行的话,我可以进行研究 使用Java卡2.2.1从SIM卡应用程序工具包启动具有特定URL的浏览器 我尝试使用sim.toolkit库中的ProactiveHandler。从中启动浏览器的确切代码如下所示 我的测试小程序只是在屏幕上显示菜单项,当我点击它时,它应该会启动浏览器。编辑以获取更完整的源代码: 我处理事件的部分 private final byte[] GOOGLE = {(byte) 'h', (byte) 't', (byte) 't', (

我的工作分配给了我一份工作,如果技术上可行的话,我可以进行研究

使用Java卡2.2.1从SIM卡应用程序工具包启动具有特定URL的浏览器

我尝试使用sim.toolkit库中的ProactiveHandler。从中启动浏览器的确切代码如下所示

我的测试小程序只是在屏幕上显示菜单项,当我点击它时,它应该会启动浏览器。编辑以获取更完整的源代码:

我处理事件的部分

private final byte[] GOOGLE = {(byte) 'h', (byte) 't', (byte) 't', (byte) 'p', (byte) ':', (byte) '/', (byte) '/', (byte) 'w', (byte) 'w', (byte) 'w', (byte) '.', (byte) 'g', (byte) 'o', (byte) 'o', (byte) 'g', (byte) 'l', (byte) 'e', (byte) '.', (byte) 'c', (byte) 'o', (byte) 'm'};

public void processToolkit(byte event) throws ToolkitException {
        switch (event) {
            case EVENT_MENU_SELECTION:
                displayText(TEXT, (byte) 0, (byte) TEXT.length);
                sendToBrowser(GOOGLE);
                break;
            case EVENT_FORMATTED_SMS_PP_ENV:
                handleSMSComand();
                break;
            default:
                return;
        }
    }
我这样做是为了当我点击菜单项时,它会调用我的sendToBrowser函数。displayText功能只在屏幕上显示文本。我的完整功能代码如下:

private byte sendToBrowser(byte[] data) throws ToolkitException {
    if (MEProfile.check(PROFILE_LAUNCH_BROWSER)) {
        try {
            ProactiveHandler ph = ProactiveHandler.getTheHandler();
            displayText(new byte[]{(byte) 'H', (byte) 'S'}, (byte) 0, (byte) 2);
            try {
                ph.init(PRO_CMD_LAUNCH_BROWSER, (byte) 0x00, DEV_ID_ME);
                displayText(new byte[]{(byte) 'C', (byte) 'S'}, (byte) 0, (byte) 2);
                try {
                    ph.appendTLV(TAG_URL, data, (short) 0, (short) data.length);
                    displayText(new byte[]{(byte) 'T', (byte) 'S'}, (byte) 0, (byte) 2);
                    try {
                        ph.send();
                        return displayText(new byte[]{(byte) 'S', (byte) 'S'}, (byte) 0, (byte) 2);
                    } catch (Exception te){
                        return displayText(new byte[]{(byte) 'S'}, (byte) 0, (byte) 1);
                    }
                } catch (Exception te) {
                    return displayText(new byte[]{(byte) 'T'}, (byte) 0, (byte) 1);
                }
            } catch (Exception te) {
                return displayText(new byte[]{(byte) 'C'}, (byte) 0, (byte) 1);
            }
        } catch (Exception te) {
            return displayText(new byte[]{(byte) 'H'}, (byte) 0, (byte) 1);
        }
    } else {
        return displayText(new byte[]{(byte) 'M'}, (byte) 0, (byte) 1);
    }
}
代码在非iOS设备上运行,但不会启动浏览器。它不会抛出任何错误和ph.send();即使浏览器未启动,也能成功运行。所以我猜这种方法在最新的手机上不再有效了?我的测试手机都是高端安卓设备

是否有其他方法可以使用Java卡2.2.1启动浏览器?如果不是的话,我会报告说这在技术上是不可能的,而且之前的方法在新手机上不起作用

这是我的displayText函数,但可能与此无关

private byte displayText(byte[] messageBuffer, short offset, short length) {
        byte result = RES_ERROR_CMD_DATA_NOT_UNDERSTOOD;
        try {
            if (length == 0) {
                return 0;
            }
            ProactiveHandler ph = ProactiveHandler.getTheHandler();
            ph.initDisplayText((byte) 0x81, DCS_8_BIT_DATA, messageBuffer,
                    offset, length);
            result = ph.send();
        } catch (Exception te) {
            result = RES_ERROR_CMD_DATA_NOT_UNDERSTOOD;
        }
        return result;
    }

当我们对SIM小程序进行测试,以使用相关的主动命令(
LAUNCH browser
)在终端上启动浏览器时,我们意识到,尽管终端对命令返回肯定响应,但浏览器并未在屏幕上弹出。此功能依赖终端供应商,尽管返回了ACK,但某些手机不支持此功能

您确定
MEProfile.check(PROFILE\u LAUNCH\u BROWSER)
返回
true
?在什么情况下称此主动命令?您能提供完整的源代码吗?@vojta Hi,MEProfile.check(PROFILE\u LAUNCH\u BROWSER)返回true。我添加了大量的try-catch来查看它到底在哪里失败,因为我没有调试的方法,所以我编辑了我的文章来添加更完整的代码。如果您看到,try-catch的最后一个在成功时返回S,并且它确实返回S,除非浏览器没有真正调用。@vojta hi,很抱歉在我使用
ProactiveResponseHandler
之后,在
send()
之后,
getGeneralResult()
返回
0
。我删除了
ph.init(PRO\u CMD\u LAUNCH\u BROWSER,…)
send()之间的所有
displayText
。但浏览器仍然无法启动。@vojta你好,有一段时间了。我试过各种安卓手机,从galaxy note 4到一些安卓版本在4.4.4到6.x.x之间的华硕手机。但是今天我得到了一款低端的索尼爱立信手机(LT15i),它的安卓版本是2.3.4,它真的很管用!你知道哪些手机支持这个功能吗?我正试图整理一个列表。你好,约翰,不幸的是,我们没有大的手机库存,但我可以说的是,大多数主流三星系列,如J,S系列。