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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top