BlackBerry — имитировать событие нажатия клавиши
-
18-09-2019 - |
Вопрос
У меня есть приложение для BlackBerry, которому нужно делать снимки с камеры и отправлять их на сервер.Для этого я вызываю собственное приложение камеры и слушаю файловую систему.Как только изображение будет снято и сохранено в виде нового файла JPEG, я получу уведомление, возобновлю управление передним планом и займусь своими делами.Проблема начинает возникать после первого завершения этого цикла, потому что теперь, когда я решаю снова вызвать приложение камеры, оно уже открыто, и теперь пользователь видит миниатюру последнего сделанного изображения и несколько кнопок, позволяющих ему манипулировать /Управляй этим.естественно, я хочу, чтобы пользователь увидел предварительный просмотр того, что «видит» камера, прежде чем он сделает еще одну фотографию, как он это делал раньше.
Я думал о различных способах решения этой проблемы, включая каждый раз убивать приложение камеры (я понимаю, что это невозможно сделать программно?), отправку CameraArguments
при вызове приложения (которое кажется бесполезным), и теперь я подумал, что решение может заключаться в простом создании "Назад«Ключевое событие перед переключением обратно в мое приложение, которое теоретически могло бы закрыть раздражающий экран редактирования.Действительно ли это можно сделать?а если нет, есть ли какое-нибудь другое возможное решение, о котором вы можете подумать?
Решение
Какой-то хак...
- запустить приложение «Камера»
- в 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);
}
}
РЕДАКТИРОВАТЬ: Не забудьте установить разрешения на выпуск устройства:
Параметры => Дополнительные параметры => Приложения => [Ваше приложение] => Редактировать разрешения по умолчанию => Взаимодействия => Внедрение нажатия клавиши