2009-11-03 14 views
5

Soy nuevo en el desarrollo de la aplicación BlackBerry. Quiero poder escuchar los eventos de pulsación de tecla siempre que el BlackBerry (8900 en mi caso) esté encendido y en todas las pantallas ¿es esto posible?BlackBerry - KeyListener con alcance global

Si es así, sería genial que alguien me dirija en la dirección correcta. Ya estoy echando un vistazo a Interface KeyListener.

import net.rim.device.api.system.*; 

Gracias a todos

Respuesta

6

Implementar una keylistenerClass like:

modelo de importación.Perfil;

import net.rim.device.api.system.KeyListener; 
import net.rim.device.api.ui.Keypad; 


public final class ShortcutHandler implements KeyListener { 

    public boolean keyChar(char key, int status, int time) { 
     return false; 
    } 

    public boolean keyDown(int keycode, int time) { 
     if (Keypad.KEY_ESCAPE == Keypad.key(keycode)) { 
         // Consume the event. 
         // Here I'm consuming the event for the escape key 
      return true; 
     } 
       //let the system to pass the event to another listener. 
     return false; 
    } 

    public boolean keyRepeat(int keycode, int time) { 
     return false; 
    } 

    public boolean keyStatus(int keycode, int time) { 
     return false; 
    } 

    public boolean keyUp(int keycode, int time) { 
     return false; 
    } 

} 

Luego, en el constructor de la aplicación

confirmo que está funcionando cuando la aplicación está en el fondo.

+0

Guau, gracias por confirmar eso, lo intentaré. – Abs

1

Esto cómo me imagino que podría trabajar

+0

Tu keyListener solo recibiría eventos clave cuando tu aplicación esté en primer plano. – Richard

+0

que no es cierto, pero gracias por el voto a la baja – jitter

3

Según tengo entendido, quiere escuchar todos los eventos clave en todas las aplicaciones que se ejecutan en el dispositivo, no solo en su aplicación.
Creo que no es posible.

ACTUALIZACIÓN

¿Cómo funciona el volumen hacia arriba y hacia abajo obra clave? - Abs hace 11 horas

Si desea decir que todas las aplicaciones reciben eventos clave de las teclas de volumen, no es así. RIM OS recibirá esos acontecimientos y luego actualizar todos los componentes de audio como de alerta, audio, etc. jugador

easely puede comprobar que con esta muestra:
alt text

hacer lo siguiente:

  • plazo muestra
  • entrar en algunos eventos clave
  • vistazo a varios eventos
  • ir backgro und
  • entrar en algunos eventos clave
  • volver a la muestra por menu-> aplicación Transfer número
  • eventos de revisión, que sigue siendo el mismo Código

:

import net.rim.device.api.system.KeyListener; 
import net.rim.device.api.ui.MenuItem; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.component.LabelField; 
import net.rim.device.api.ui.component.Menu; 
import net.rim.device.api.ui.container.MainScreen; 

public class KeyListenerApp extends UiApplication implements KeyListener { 

    Scr mScreen; 

    public KeyListenerApp() { 
     mScreen = new Scr(); 
     pushScreen(mScreen); 
     addKeyListener(this); 
    } 

    public static void main(String[] args) { 
     KeyListenerApp app = new KeyListenerApp(); 
     app.enterEventDispatcher(); 
    } 

    private void updateScreen(final String text) { 
     mScreen.addLine(text); 
    } 

    public boolean keyChar(char key, int status, int time) { 
     updateScreen("keyChar " + key); 
     return true; 
    } 

    public boolean keyDown(int keycode, int time) { 
     updateScreen("keyDown " + keycode); 
     return true; 
    } 

    public boolean keyRepeat(int keycode, int time) { 
     updateScreen("keyRepeat " + keycode); 
     return true; 
    } 

    public boolean keyStatus(int keycode, int time) { 
     updateScreen("keyStatus " + keycode); 
     return true; 
    } 

    public boolean keyUp(int keycode, int time) { 
     updateScreen("keyUp " + keycode); 
     return true; 
    } 
} 

class Scr extends MainScreen { 
    int mEventsCount = 0; 
    LabelField mEventsStatistic = new LabelField("events count: " 
      + String.valueOf(mEventsCount)); 

    public Scr() { 
     super(VERTICAL_SCROLL | VERTICAL_SCROLLBAR); 
     add(mEventsStatistic); 
    } 

    public void addLine(final String text) { 
     getApplication().invokeLater(new Runnable() { 
      public void run() { 
       mEventsStatistic.setText("events count: " 
         + String.valueOf(++mEventsCount)); 
       insert(new LabelField(text), 1); 
      } 
     }); 
    } 

    protected void makeMenu(Menu menu, int instance) { 
     super.makeMenu(menu, instance); 
     menu.add(goBGMenuItem); 
    } 

    MenuItem goBGMenuItem = new MenuItem("go backgroun", 0, 0) { 
     public void run() { 
      getApplication().requestBackground(); 
     } 
    }; 
} 
+0

¿Cómo funciona la tecla subir y bajar el volumen? – Abs

+1

Gracias por la explicación y el código, me ayuda a entender todo esto. – Abs

+0

¡De nada! –

1

El código dado arriba ciertamente funciona, pero hay una trampa. No podrás atrapar las teclas presionadas en las aplicaciones nativas, como la gestión de llamadas, la navegación entrante y demás. A medida que el sistema genera eventos globales para estas aplicaciones. Es como si pudieras definir una rutina para clics cuando tu aplicación está en segundo plano, pero la funcionalidad de esa rutina se localiza únicamente en tu aplicación. No afectará otras aplicaciones como tal.