Domanda

Ho un'applicazione BlackBerry che ha bisogno di prendere le immagini dalla fotocamera e inviarle a un server. Per fare questo invoco l'applicazione fotocamera nativa e ascoltare il file system. Una volta che l'immagine viene catturata e salvata come nuovo file jpeg riceve la notifica, riprendere il controllo di primo piano e andare sulla mia attività. Il problema inizia che si verificano dopo la prima volta che questo ciclo è completato perché ora quando decido di chiamare di nuovo l'applicazione della fotocamera è già aperto, e ora l'utente sta vedendo una miniatura del l'ultima foto che è stata presa e diversi pulsanti che gli permette di manipolare /gestirlo. naturalmente quello che voglio all'utente di vedere è un'anteprima di quello che la macchina è "vedere" prima che scatta un'altra foto come faceva prima.

Ho pensato a diversi modi per risolvere questo compreso uccidendo l'applicazione della fotocamera ogni volta (ho capito questo non può essere fatto programatically?), L'invio di CameraArguments quando si richiama l'applicazione (che sembra essere inutile), e ora stavo pensando una soluzione potrebbe essere semplice generazione di un " Indietro " evento chiave prima di tornare al mio app che teoricamente chiudere la schermata di modifica fastidioso. Questo potrebbe davvero essere fatto? e se non c'è qualche altra soluzione possibile si può pensare?

È stato utile?

Soluzione

Una sorta di mod ...

  • avviare Camera App
  • in TimerTask controllare se Camera App avviato e se si ha bisogno di essere chiuso (alcuni bandiera)
  • Se sì, invocarlo (quindi sarà diventato attivo) e spingere ESC iniezione evento keypress per chiuderla

Date un'occhiata a questo:

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);
    }
}

Modifica Non dimenticare di impostare le autorizzazioni per il rilascio del dispositivo:
Opzioni => Opzioni avanzate => Applicazioni => [vostra applicazione] => Modifica autorizzazioni predefinite => Interazioni => tasto ictus iniezione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top