BlackBerry - имитация события KeyPress

У меня есть приложение BlackBerry, которое должно делать снимки с камеры и отправлять их на сервер. Для этого я вызываю собственное приложение камеры и слушаю файловую систему. Как только изображение захвачено и сохранено как новый файл JPEG, я получаю уведомление, возобновляю контроль переднего плана и занимаюсь своими делами. Проблема начинает возникать после первого завершения этого цикла, потому что теперь, когда я решил снова вызвать приложение камеры, оно уже открыто, и теперь пользователь видит эскиз последнего сделанного снимка и несколько кнопок, позволяющих ему манипулировать /Управляй этим. естественно, что я хочу, чтобы пользователь увидел предварительный просмотр того, что камера "видит", прежде чем он сделает еще одну фотографию, как он делал раньше.

Я думал о различных способах решения этой проблемы, в том числе каждый раз убивая приложение камеры (я так понимаю, это нельзя сделать программно?), Отправляя CameraArguments при вызове приложения (которое кажется бесполезным), и теперь я думал, что решение может быть простым генерацией события нажатия клавиши "Назад" перед переключением обратно в мое приложение, которое теоретически закрывает надоедливый экран редактирования. Может ли это быть действительно сделано? и если нет, то есть ли какое-либо другое возможное решение, о котором вы можете подумать?

1 ответ

Решение

Своего рода хак...

  • запустить приложение камеры
  • в 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);
    }
}

РЕДАКТИРОВАТЬ: Не забудьте установить разрешения для выпуска устройства:
Параметры => Дополнительные параметры => Приложения => [Ваше приложение] => Изменить разрешения по умолчанию => Взаимодействия => Инъекция клавиш

Другие вопросы по тегам