2009-08-18 12 views
3

Ich habe eine BlackBerry-Anwendung, die Bilder von der Kamera aufnehmen und an einen Server senden muss. Um dies zu tun, rufe ich die native Kameraanwendung auf und höre auf das Dateisystem. Sobald ein Bild erfasst und als neue JPEG-Datei gespeichert wurde, werde ich benachrichtigt, nehme die Vordergrundkontrolle wieder auf und gehe über mein Geschäft. Das Problem tritt nach dem ersten Mal auf, wenn dieser Zyklus abgeschlossen ist, denn jetzt, wenn ich mich entscheide, die Kameraanwendung erneut aufzurufen, ist sie bereits geöffnet, und jetzt sieht der Benutzer ein Miniaturbild des letzten Bildes und mehrere Knöpfe, die ihn manipulieren lassen/Manage es. Natürlich möchte ich dem Benutzer eine Vorschau dessen anzeigen, was die Kamera "sieht", bevor er ein anderes Foto wie zuvor aufnimmt.BlackBerry - Simulieren eines KeyPress-Ereignisses

Ich habe an verschiedene Möglichkeiten gedacht, dies zu lösen, einschließlich das Töten der Kamera App jedes Mal (ich verstehe das nicht programmatisch?), Senden CameraArguments beim Aufruf der App (die nutzlos scheint), und jetzt habe ich nachgedacht Eine Lösung könnte so einfach sein, ein "Zurück" Schlüsselereignis zu generieren, bevor ich zu meiner App zurückwechsle, was theoretisch den lästigen Bearbeitungsbildschirm verwerfen würde. Konnte das wirklich gemacht werden? Und wenn nicht, gibt es eine andere mögliche Lösung, an die Sie denken könnten?

+0

Welche Modell-/Betriebssystemversion verwenden Sie? –

Antwort

4

Eine Art Hack ...

  • Start Kamera App
  • in Timertask überprüfen, ob die Kamera App gestartet und wenn es (etwas Flagge) geschlossen werden müssen
  • wenn ja, rufen Sie es (so wird es aktiv wurde) und drücken sie ESC keypress Ereignis Injektion schließen es

Werfen sie einen Blick auf diese:

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: Vergessen Sie nicht Berechtigungen für die Gerätemitteilung einzustellen:
Optionen => Erweiterte Optionen => Anwendungen => [Ihre Anwendung] => Standardberechtigungen bearbeiten => Interaktionen => Tastenhub Injection

+0

Ja! sieht sehr gut aus, ich werde diesen Ansatz versuchen. Vielen Dank. –

+0

Gern geschehen)) –

+0

@MaxGontar Ich bin auch versucht, wie du gesagt hast. InjectKey-Methoden werden ausgeführt. Aber schließe die Kamera nicht. Könntest du mir helfen? – RVG