BlackBerry - 模拟 KeyPress 事件

Posted

技术标签:

【中文标题】BlackBerry - 模拟 KeyPress 事件【英文标题】:BlackBerry - Simulate a KeyPress event 【发布时间】:2010-11-20 13:02:57 【问题描述】:

我有一个 BlackBerry 应用程序,它需要从相机拍摄照片并将它们发送到服务器。为了做到这一点,我调用本机相机应用程序并监听文件系统。一旦图像被捕获并保存为新的 jpeg 文件,我就会收到通知,恢复前台控制并开始我的业务。问题在此循环第一次完成后开始发生,因为现在当我决定再次调用相机应用程序时,它已经打开,现在用户看到最后一张照片的缩略图和几个按钮允许他操作/管理它。自然,我希望用户看到的是在他像以前一样拍摄另一张照片之前相机“看到”的预览。

我想了很多方法来解决这个问题,包括每次都杀死相机应用程序(我知道这不能以编程方式完成?),在调用应用程序时发送CameraArguments(这似乎没用),现在我是认为解决方案可以简单地生成一个“Back”键事件,然后再切换回我的应用程序,理论上这会消除烦人的编辑屏幕。这真的可以做到吗?如果没有,您可能会想到其他可能的解决方案吗?

【问题讨论】:

您使用的是什么型号/操作系统版本? 【参考方案1】:

一种黑客...

启动相机应用 在 TimerTask 中检查 Camera App 是否已启动以及是否需要关闭(一些标志) 如果是,调用它(这样它就会激活)并按下 ESC 按键事件注入来关闭它

看看这个:

class Scr extends MainScreen 
    boolean killCameraApp = false;
    final String mCameraModuleName = "net_rim_bb_camera";
    final CameraArguments args = new CameraArguments();

    public Scr() 
        super();

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() 
            public void run() 
                if (isCameraRunning() && killCameraApp) 
                    getApplication().invokeAndWait(callCamera);
                    getApplication().invokeAndWait(killCamera);
                
            
        , 0, 100);
    

    Runnable callCamera = new Runnable() 
        public void run() 
            callCamera();
        

    ;

    Runnable killCamera = new Runnable() 
        public void run() 
            injectKey(Characters.ESCAPE);
            killCameraApp = false;
        
    ;

    private boolean isCameraRunning() 
        boolean result = false;
        ApplicationManager appMan = 
                ApplicationManager.getApplicationManager();
        ApplicationDescriptor[] appDes = appMan.getVisibleApplications();
        for (int i = 0; i < appDes.length; i++) 
            result = mCameraModuleName.equalsIgnoreCase(appDes[i]
                    .getModuleName());
            if (result)
                break;
        
        return result;
    

    private void callCamera() 
        Invoke.invokeApplication(Invoke.APP_TYPE_CAMERA, 
                new CameraArguments());
    

    private void injectKey(char key) 
        KeyEvent inject = new KeyEvent(KeyEvent.KEY_DOWN, key, 0);
        inject.post();
    

    protected void makeMenu(Menu menu, int instance) 
        menu.add(new MenuItem("start camera", 0, 0) 
            public void run() 
                callCamera();
                killCameraApp = false;
            
        );
        menu.add(new MenuItem("kill app", 0, 0) 
            public void run() 
                killCameraApp = true;
            
        );
        super.makeMenu(menu, instance);
    

编辑:不要忘记设置设备发布权限: Options => Advanced Options => Applications => [Your Application] =>Edit Default permissions =>Interactions =>key stroke Injection

【讨论】:

@MaxGontar 我也像你说的那样尝试过。 injectKey 方法被执行。但不要关闭相机。你能帮帮我吗。 @MaxGontar 只是好奇是否可以在其他应用程序(甚至是 sys 应用程序)中注入事件,因为如果它是 android,这将是一个安全异常。

以上是关于BlackBerry - 模拟 KeyPress 事件的主要内容,如果未能解决你的问题,请参考以下文章

我selenium IDE里 模拟按Tab 键

测试适用于 Android 或 BlackBerry 的移动网站

LWUIT 应用程序无法在 Blackberry 设备中启动

使用按键精灵自动输入游戏密码时提示密码错误,我试了saystring和keypress命令都不行,

iPhone/Android/BlackBerry 上的 jQuery

BlackBerry - 开发类似 Cropit 的应用程序