2009-08-18 7 views
3

J'ai une application BlackBerry qui doit prendre des photos à partir de l'appareil photo et les envoyer à un serveur. Pour ce faire, j'appelle l'application de caméra native et j'écoute le système de fichiers. Une fois qu'une image est capturée et enregistrée en tant que nouveau fichier jpeg, je reçois une notification, reprend le contrôle du premier plan et vaquer à mes occupations. Le problème commence à se produire après la première fois que ce cycle est terminé parce que maintenant quand je décide d'appeler à nouveau l'application caméra, 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 voit est un aperçu de ce que la caméra "voit" avant de prendre une autre photo comme il le faisait auparavant.BlackBerry - Simulation d'un événement KeyPress

J'ai pensé à plusieurs façons de résoudre cela, y compris tuer l'application de la caméra à chaque fois (je comprends que cela ne peut être fait par programme?), En envoyant CameraArguments en invoquant l'application (qui semble inutile), et maintenant je pensais une solution pourrait être aussi simple que de générer un événement clé "Back" avant de revenir à mon application qui pourrait théoriquement rejeter l'écran d'édition ennuyeux. Cela pourrait-il vraiment être fait? et sinon, y a-t-il une autre solution possible à laquelle vous pourriez penser?

+0

Quelle est la version du modèle/os que vous utilisez? –

Répondre

4

Une sorte de bidouille ...

  • si oui, App Caméra début
  • dans TimerTask vérifier si l'appareil photo App a commencé et si elle a besoin d'être fermé (certains drapeau)
  • invoquer (de sorte qu'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 => Course clé Injection

+0

Oui! semble très bon, je vais essayer cette approche. Je vous remercie. –

+0

Vous êtes les bienvenus)) –

+0

@MaxGontar Je suis également essayé comme vous l'avez dit. Les méthodes injectKey sont exécutées. Mais ne ferme pas la caméra. Pourriez-vous m'aider. – RVG

Questions connexes