2015-03-04 11 views
6

Zajmuję się tworzeniem aplikacji, która pozwala użytkownikowi skanować kody kreskowe za pomocą zewnętrznego skanera kodów kreskowych podłączonego przez bluetooth. Skaner kodów paskowych działa jak klawiatura, czyli Android myśli, że zeskanowane kody kreskowe zostały wpisane na klawiaturze.Zezwalaj na wprowadzanie danych z klawiatury bluetooth, nawet jeśli ekran jest zablokowany

Aplikacja działa bez zarzutu, o ile ekran pozostaje włączony.

Po wyłączeniu ekranu mogę kontynuować skanowanie kodów kreskowych, ale zeskanowany tekst nie dociera już do aplikacji, a raczej wywołuje akcje na ekranie blokady.

Czy istnieje sposób na zezwolenie na wprowadzanie danych z zewnętrznej klawiatury do aplikacji, mimo że ekran został wyłączony?

Ewentualnie będę zmuszony pozostawić ekran włączony, ale to nie jest kuloodporne, ponieważ użytkownik może przypadkowo zablokować ekran.

UPDATE

Zrobiłem mały krok we właściwym kierunku za pomocą:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

To pokaże aplikację bez (niezabezpieczony) ekranu blokady, gdy nowe wejście z klawiatury jest przetwarzane. Niestety brakuje pierwszej litery. Musi to być spowodowane pierwszą listą budzącą ekran, a reszta wejścia faktycznie docierająca do EditText.

+0

dodać ten kod do swojej aktywności skanera 'getWindow() addFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);' i dodać to uprawnienie w oczywisty ' '. gotowe. –

+1

W zależności od wersji możesz utworzyć widżet do dodania na ekranie blokady. Może to przesłuchać keyboad (skaner BT) i wysłać dane do Twojej aktywności. – AxelH

Odpowiedz

1

Jeśli tracisz tylko pierwszą liczbę, możesz ją odzyskać, używając Check Digit.

Wiem, że to włamanie, ale powinno rozwiązać ten problem.

+0

Brakuje pierwszej cyfry dekodowanego kodu kreskowego (ostateczny ciąg znaków). Nie mam dostępu do tego, co czytnik kodów kreskowych faktycznie odczytał w pierwszej kolejności, tylko to, co zwraca jako klawiatura. Nie wiem też, jaki rodzaj kodu kreskowego otrzymuję. Obawiam się więc, że to nie jest opcja. – Baz

2

To działa dla mnie w podobnej sytuacji. Po prostu włącz ekran, gdy aplikacja znajduje się na pierwszym planie. .

getWindow().addFlags(
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
); 
+0

Kiedy użytkownik przypadkowo naciśnie przycisk zasilania swojego urządzenia, czy nadal będzie przekazywał zdarzenia wejściowe do aplikacji? – Baz

+0

Sądzę, że nie będzie podejścia opartego na kuloodporności. Co się stanie, jeśli inne działanie pojawi się na pierwszym planie? Czy nie wystarczyłoby echo potwierdzenia, czy otrzymano prawidłowy kod? – sstn

+0

@sstn Aplikacja już to robi, użytkownik może jednak wyłączyć tę funkcję. Różnica między zablokowaniem ekranu a przejściem do innej aplikacji polega na tym, że zablokowanie ekranu odbywa się łatwiej (ponieważ jest to przycisk sprzętowy, który jest łatwo klikany). Chyba nie mam szczęścia ... – Baz

Powiązane problemy