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