BlackBerry - simular um evento KeyPress
-
18-09-2019 - |
Pergunta
Eu tenho um aplicativo BlackBerry que precisa tirar fotos da câmera e enviá -las para um servidor. Para fazer isso, invoco o aplicativo de câmera nativa e ouço o sistema de arquivos. Depois que uma imagem é capturada e salva como um novo arquivo JPEG, sou notificado, retome o controle de primeiro plano e faça meus negócios. O problema começa a ocorrer após a primeira vez que esse ciclo é concluído, porque agora, quando eu decidir ligar para o aplicativo da câmera novamente, ele já está aberto, e agora o usuário está vendo uma miniatura da última foto que foi tirada e vários botões que permitem que ele manipule /gerencie. Naturalmente, o que eu quero que o usuário veja é uma prévia do que a câmera está "vendo" antes de tirar outra foto como ele fez antes.
Eu pensei em várias maneiras de resolver isso, incluindo matar o aplicativo de câmera cada vez (eu entendo que isso não pode ser feito programaticamente?), Enviando CameraArguments
Ao invocar o aplicativo (que parece ser inútil), e agora eu estava pensando que uma solução poderia ser tão simples gerando um "De volta"O evento -chave antes de voltar ao meu aplicativo, que teoricamente descartaria a tela de edição irritante. Isso poderia realmente ser feito? E se não houver alguma outra solução possível que você possa pensar?
Solução
Uma espécie de hack ...
- Inicie o aplicativo da câmera
- No Timertosk, verifique se o aplicativo da câmera começou e se precisar ser fechado (alguma bandeira)
- Se sim, invocará -lo (para que ele se torne ativo) e empurre a injeção de eventos escassos do ESC KeyPress para fechá -lo
Dê uma olhada neste:
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);
}
}
EDITAR: Não se esqueça de definir permissões para liberação do dispositivo:
Opções => Opções avançadas => Aplicações => [Seu aplicativo] => Editar Permissões padrão => Interações => Injeção de AVC da chave