黑莓 - 在拨号应用程序中运行菜单项目

3

我想分享我在supportforums.blackberry.com学到的一个技巧。

黑莓手机有一个原生的电话拨号应用程序。

这个技巧是在来电、呼叫失败或任何其他通话事件后,以编程方式运行拨号器菜单项。


我不得不从你的帖子中删除图片,因为ImageShack已经将它们删除并替换为广告。请参阅http://meta.stackexchange.com/q/263771/215468获取更多信息。如果可能的话,希望你能重新上传它们。谢谢! - Undo
1个回答

4

有一个PhoneListener接口,它可以监听来电和去电电话的状态。

请参阅监听并处理电话事件

来自supportforums.blackberry.com - Re: How to exit an Ui application (by simon_hain)的一句话:

监听器被添加到应用程序后会与该应用程序建立强引用关系。比喻地说,它们成为了RIM应用程序的一部分。

如果您将监听器添加到电话应用程序中,则该监听器将在电话应用程序的上下文中执行。
您可以通过在监听方法中使用Ui.getUiEngine().getActiveScreen()来检查这一点。返回的屏幕是电话应用程序的呼叫屏幕。

我使用这个功能来执行电话命令:
- 在呼叫初始化或连接时,我会存储对电话屏幕的引用。
- 我调用phoneScreen.getMenu(0)

现在我想执行一个命令:
- 我将语言环境更改为“en”
- 我使用menu.getSize()和menu.getItem(i)迭代菜单
- 我检查menuItem.toString是否等于我的命令
- 我调用menuItem.run()
- 如果已更改,我会将语言环境更改回来

您可以使用此功能来:
静音
取消静音
激活扬声器
查看快速拨号列表
结束通话(仅适用于4.5/4.6之前,不确定哪个版本)
还有很多其他的功能。只需打印可用的菜单项即可:)

这是一个示例代码,当有来电时将所有菜单打印到控制台,在接听电话时将电话静音,在结束通话时取消静音:

public class UseScreenMenu extends Application implements PhoneListener {
    String MENU_ITEM_MUTE = "Mute";
    String MENU_ITEM_UNMUTE = "Unmute";
    public UseScreenMenu() {
        Phone.addPhoneListener(this);
    }

    public static void main(String[] args) {
        UseScreenMenu app = new UseScreenMenu();
        app.enterEventDispatcher();
    }

    public void callIncoming(int callId) {
        printMenu();    
    }

    public void callAnswered(int callId) {
        runMenuItem(MENU_ITEM_MUTE);
    }

    public void callEndedByUser(int callId) {
        runMenuItem(MENU_ITEM_UNMUTE);  
    }

    private void printMenu() {      
        Screen screen = Ui.getUiEngine().getActiveScreen();
        Menu menu = screen.getMenu(0);
        System.out.println("Menu of BB Dialler - Begin");
        for (int i = 0, cnt = menu.getSize(); i < cnt; i++)
            System.out.println("Menu of BB Dialler - "
                +menu.getItem(i).toString());
        System.out.println("Menu of BB Dialler - End");     
    }

    private void runMenuItem(String menuItemText) {
        Screen screen = Ui.getUiEngine().getActiveScreen();
        Menu menu = screen.getMenu(0);
        for (int i = 0, cnt = menu.getSize(); i < cnt; i++)
            if(menu.getItem(i).toString().equalsIgnoreCase(menuItemText))
                menu.getItem(i).run();
    }


    public void callAdded(int callId) {}
    public void callConferenceCallEstablished(int callId) {}
    public void callConnected(int callId) {}
    public void callDirectConnectConnected(int callId) {}
    public void callDirectConnectDisconnected(int callId) {}
    public void callDisconnected(int callId) {}
    public void callFailed(int callId, int reason) {}
    public void callHeld(int callId) {}
    public void callInitiated(int callid) {}
    public void callRemoved(int callId) {}
    public void callResumed(int callId) {}
    public void callWaiting(int callid) {}
    public void conferenceCallDisconnected(int callId) {}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接