BlackBerry - KeyListener с глобальным охватом
-
13-09-2019 - |
Вопрос
Я новичок в разработке приложений BlackBerry.Я хочу иметь возможность прослушивать события нажатия клавиш всякий раз, когда включен BlackBerry (в моем случае 8900), и на всех ли экранах это возможно?
Если это так, было бы здорово, если бы кто-нибудь направил меня в правильном направлении.Я уже просматриваю Interface KeyListener.
import net.rim.device.api.system.*;
Спасибо всем
Решение
Реализуйте keylistenerClass следующим образом:
импортируйте модель.Профиль;
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;
}
}
Затем в конструкторе вашего приложения
public Application() {
//Add the listener to the system for this application
addKeyListener(new ShortcutHandler());
}
Я подтверждаю, что это работает, когда приложение находится в фоновом режиме.
Другие советы
Как я понял, вы хотите прослушивать все ключевые события во всех приложениях, запущенных на устройстве, а не только в вашем приложении.
Я думаю, что это невозможно.
Обновить
Как работает клавиша увеличения и уменьшения громкости?– Пресс 11 часов назад
Если вы хотите сказать, что все приложения получают ключевые события от клавиш регулировки громкости, это неправда.RIM OS получит эти события, а затем обновит все аудиокомпоненты, такие как оповещение, аудио, проигрыватель и т.д.
вы можете легко проверить это с помощью этого образца:
Сделайте следующее:
- запустить образец
- введите некоторые ключевые события
- посмотрите на количество событий
- перейти к предыстории
- введите некоторые ключевые события
- вернитесь к образцу с помощью меню-> переключить приложение
- проверьте номер события, он все тот же
Код:
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();
}
};
}
Вот как я представляю, что это могло бы сработать
- создайте приложение, которое расширяет
UiApplication
или дажеApplication
- создайте реализацию
Keylistener
(что также могло бы расширитьThread
если ты хочешь) - добавьте свой
KeyListener
внедрение в ваше приложение черезaddKeyListener()
- Тогда делай все, что захочешь.
Приведенный выше код, безусловно, работает, но есть одна загвоздка.Вы не сможете перехватывать нажатия клавиш в нативных приложениях, таких как обработка вызовов, просмотр входящих sms и прочее.Поскольку система генерирует глобальное событие для этих приложений.Это похоже на то, что вы можете определить процедуру для кликов, когда ваше приложение работает в фоновом режиме, но функциональность этой процедуры локализована только для вашего приложения.Это не повлияет на другие приложения как таковые.