Question

J'ai une application BlackBerry qui a besoin de prendre des photos de l'appareil photo et de les envoyer à un serveur. Pour ce faire, j'invoque l'application de la caméra native et écouter le système de fichiers. Une fois qu'une image est capturée et enregistrée dans un nouveau fichier jpeg j'averti, reprendre le contrôle de premier plan et vaquer à mes affaires. Le problème commence survenant après la première fois ce cycle est terminé parce que maintenant quand je décide d'appeler l'application de la caméra à nouveau, il est déjà ouvert, et maintenant l'utilisateur voit une vignette de la dernière photo prise et plusieurs boutons lui permettant de manipuler /gérer. naturellement ce que je veux que l'utilisateur de voir un aperçu de ce que la caméra « voir » avant qu'il ne se mette une autre photo comme il le faisait auparavant.

Je l'ai pensé à différentes façons de résoudre ce y compris tuer l'application appareil photo chaque fois (je comprends cela ne peut se faire programatically?), L'envoi CameraArguments lors de l'invocation de l'application (qui semble être inutile), et maintenant je songeais une solution pourrait être aussi simple génération d'un événement clé « Retour » avant de revenir à mon application qui théoriquement rejeter l'écran d'édition ennuyeux. Cela pourrait-il vraiment être fait? et sinon est-il une autre solution possible, vous pouvez penser?

Était-ce utile?

La solution

Une sorte de pirater ...

  • start App appareil photo
  • dans TimerTask vérifier si l'appareil photo App a commencé et si besoin d'être fermé (certains drapeau)
  • si oui, l'invoquer (donc il est devenu actif) et pousser l'injection d'événements de touche ESC pour fermer

Jetez un oeil à ceci:

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

EDIT: Ne pas oublier de définir des autorisations pour la libération de l'appareil:
Options => Options avancées => Applications => [votre application] => Modifier les autorisations par défaut => Interactions => Injection pression de touche

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top