【问题标题】:How to launch browser with url from Sim Toolkit in Java Card如何使用 Java Card 中 Sim Toolkit 的 url 启动浏览器
【发布时间】:2019-01-10 15:27:03
【问题描述】:

如果技术上可行,我的工作已经分配给我一份研究工作

使用 Java Card 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 Card 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;
    }

【问题讨论】:

  • 你确定MEProfile.check(PROFILE_LAUNCH_BROWSER)返回true吗?
  • 你在什么事件上调用这个主动命令?能否提供完整的源代码?
  • @vojta 嗨,MEProfile.check(PROFILE_LAUNCH_BROWSER) 确实返回 true。我添加了大量的 try catch 来查看它到底在哪里失败,因为我无法调试并且我编辑了我的帖子以放置更完整的代码。如果你看到了,try catch 的最后一个在成功时返回 S S 并且它确实返回它,除非浏览器没有真正被调用。
  • @vojta 嗨,抱歉回复晚了,在我使用ProactiveResponseHandler 之后,send()getGeneralResult() 返回0。我删除了ph.init(PRO_CMD_LAUNCH_BROWSER, ...)send() 之间的所有displayText。但是浏览器仍然无法启动。
  • @vojta 你好,有一段时间了。我尝试了各种安卓手机,从 Galaxy Note 4 到一些安卓版本从 4.4.4 到 6.x.x 的华硕手机。但是我今天拿到了一部低端的索尼爱立信手机(LT15i),安卓版本为 2.3.4,它确实有效!大声笑

标签: java javacard sim-card sim-toolkit


【解决方案1】:

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

【讨论】:

  • 您知道哪些手机支持此功能吗?我正在尝试编译一个列表。
  • 你好约翰,很遗憾我们没有大量的手机库存,但我可以说大部分是三星主流系列,如 J、S 系列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
相关资源
最近更新 更多