黑莓 - 模拟按键事件

3
我有一个黑莓应用程序,需要从相机拍摄照片并将它们发送到服务器。为了做到这一点,我调用本地相机应用程序并监听文件系统。一旦捕获图像并保存为新的JPEG文件,我会得到通知,恢复前台控制并继续我的业务。问题在第一次完成此循环后开始出现,因为现在当我决定再次调用相机应用程序时,它已经打开,用户现在看到的是上次拍摄的缩略图和几个按钮,允许他对其进行操作/管理。自然而然,我希望用户在再次拍照之前能够预览相机正在“看到”的内容,就像之前一样。
我想过各种方法来解决这个问题,包括每次杀死相机应用程序(我了解到这不能在程序中完成?),在调用应用程序时发送CameraArguments(似乎没有用),现在我正在考虑的一个解决方案是在切换回我的应用程序之前生成“返回”键事件,理论上可以关闭烦人的编辑屏幕。这真的可以做到吗?如果不行,您还有其他可能的解决方案吗?

你正在使用什么型号/操作系统版本? - Maksym Gontar
1个回答

4

一种黑客技巧...

  • 启动相机应用程序
  • 在TimerTask中检查相机应用程序是否已启动,以及它是否需要关闭(某个标志)
  • 如果是,则调用它(使其变为活动状态),并推送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);
    }
}

编辑: 不要忘记为设备释放设置权限:
选项 =>高级选项 =>应用程序 =>[您的应用程序] =>编辑默认权限 =>交互 =>按键注入


@MaxGontar,我也照你说的试了。injectKey方法是执行了,但是没有关闭相机。你可以帮我吗? - RVG
@MaxGontar,只是出于好奇,是否可以在其他应用程序中注入事件(甚至是系统应用程序),因为如果是Android的话,这将是一个安全异常。 - Its not blank

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