Pokazywanie postów oznaczonych etykietą LockMe. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą LockMe. Pokaż wszystkie posty

czwartek, 26 kwietnia 2018

LockMe - Retro

(4L)

Liked:
  • w końcu skończyłam jakiś projekt - może mały, ale jednak
  • dużo się przy okazji nauczyłam
  • zrobiłam początkową wersję projektu i używając jej zauważyłam, że potrzebuję dodatkowej funkcji
Learned:
  • z pozoru prosty projekt może być bardzo skomplikowany
  • manifest projektu to bardzo ciekawe narzędzie
  • wiem już jak działają zadania w androidzie
Lacked:
  • czasu - choćby jednego stałego momentu w ciągu tygodnia
  • listy zadań do wykonania w projekcie (był straszny chaos)
  • blogowania na bierząco
  • nawyku commitowania codziennie
Long For:
  • mój pierwszy skończony projekt :)

Usprawnienia:
  • Zaplanowanie zadań na początku nowego projetu

LockMe - zakończenie

Pora na wydanie pierwszej wersji - LockMe 1.0

Repozytorium projektu:
Repo LockMe - GitHub

Instalka:
LockMe 1.0

czwartek, 12 kwietnia 2018

LockMe - java.lang.RuntimeException: Unable to instantiate receiver dmm.lockme.Lock$LockReceiver: java.lang.InstantiationException: java.lang.Class has no zero argument constructor

Taki mi się właśnie FATAL EXCEPTION trafił. A długo się zastanawiałam czemu mi się apka wywala zanim się jeszcze porządnie włączy, jak tylko dam jej prawa administratora, a później działa sobie normalnie i spokojnie. To przecież nie może być mój błąd, skoro później tak ładnie działa.

A jednak.
Problem wynikał z tego, że wydawało mi się, że ta aplikacja jest bardzo, bardzo prosta, na 3 linijki max. Wydawało mi się, że ja chcę tylko blokować ekran, to przecież nic ważnego, nic wielkiego, nic skomplikowanego. Dlatego z różnych przykładów brałam tylko to, co było niezbędne do uruchomienia aplikacji, nie kopiowałam wszystkiego bezmyślnie.

Aplikacja wymagała implementacji klasy, która miała rozszerzać DeviceAdminReceiver. To po to, żeby aplikacja mogła uzyskać uprawnienia administratora. Nie wiedziałam wtedy, że do manifestu nie można dodwać klas, które nie są statyczne i dlatego pojawił się ten wyjątek. Moja klasa nie miała robić nic szczególnego, dlatego mogłam spokojnie zadeklarować ją następująco:
public static class LockReceiver extends DeviceAdminReceiver{
    }


LockMe - java.lang.RuntimeException: Unable to create service dmm.lockme.FloatingWidgetService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@9a6db9d -- permission denied for window type 2002

Mój kolejny wyjątek.
Wystąpił przy okazji przygotowywania widgetu, który umożliwiałby mi blokowanie ekranu przy otwartej dowolnej aplikacji.
Znalazłam informację, że można zrobić taki element, który działałby na zasadzie alarmu. Niestety, żeby tak było użytkownik musiał wyrazić zgodę na takie działanie aplikacji.
No i zaczęły mi się robić pętle w pętlach, okazało się, że warunek nie został spełniony a ja tu chcę alarm wyświetlać (podobnie jak w sytuacji z adminem) i tak to się pojawił wyjątek.

Wniosek: następnym razem, gdy aplikacja będzie potrzebowała specjalnych uprawnień do wykonania działania muszę się upewnić, że je ma. Nie wystarczy założyć, że gdzieś wyżej w kodzie, wcześniej, poprosiliśmy o nie - zawsze przed użyciem funkcji, która potrzebuje specjalnych uprawnień sprawdź czy je ma.

poniedziałek, 9 kwietnia 2018

LockMe - java.lang.SecurityException: No active admin owned by uid 10088 for policy #3

To miało być takie proste. Przeczytałam ze (mam nadzieję) zrozumieniem co mam zrobić, dopasowałam ustawienia do swoich potrzeb, skompilowałam i... FATAL EXCEPTION

A raczej tak mi się wydawało.

Kluczowe okazało się sprawdzenie, czy aplikacja te uprawenienia ma i wywołanie funkcji blokowania TYLKO wtedy jeśli je ma - wszystko w jednej pętli if () oraz else() - wydawało mi się, że wystarczy samo sprawdzenie czy uprawnienia są (i oczywiście nadanie ich w przypadku braku) wystarczy a funkcję blokowania mogę dodać poza pętlą. Otórz nie mogę.

wtorek, 20 lutego 2018

LockMe has stopped

Taaaa... moja aplikacja działa właściwie dobrze. Po zaledwie 3 uruchomieniach już robi to co powinna.
Moja świeża jeszcze dusza programisty mówi Przecież działa.
Moja utrwalona, stara dusza QA mówi Aplikacja wyświetla "LockMe has stopped po pierwszym uruchomieniu. Ja tego nie zatwierdzę!
No więc szukam. Googlam oczywiście - że się zatrzymała, co wtedy robiła, nic nie znajduję. Aż gdzieś w końcu w jakimś komentarzu jakieś delikatne wspomnienie o logach. Logach. LOGI! No przecież! Dotąd nie dotrwałam jeszcze aż tak dalego z aplikacją (zawsze coś się psuło wczesniej) i nie pomyślałam nawet, że z tego będą logi.
Eh... już chciałam się usprawiedliwiać dlaczego o tym nie pamiętałam. Ale zamiast tego - zanotować i zapamietać - zawsze sprawdź logi.

poniedziałek, 22 stycznia 2018

LockMe - początki

Mój stary telefon ma wiele problemów - pęknięta szybka, często niestykające połączenie USB, niedziałający przycisk Power. Nauczyłam się już go uruchamiać bez tego przycisku poprzez tryb serwisowy, ale bez niego nie mogę też zablokować ekranu (a czasami nie mogę czekać aż minie timeout).
Postanowiłam więc napisać sobie apkę, która będzie wywoływać blokowanie ekranu.
Myślałam, że to będzie banalne - ot kilka linijek i tyle. Zaczęłam szukać odpowiednich komend - już samo to było trudniejsze niż myślałam - na hasło "lock screen" wyskoczyło wiele podpowiedzi, z któych żadna nie miała nic wspólnego z tym, czego szukałam. W końcu jednak znalazłam:
https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#lockNow()
I znów pomyślałam - no proszę - kilka linijek i będzie gotowe - już widziałam oczyma wyobrażni kilka wersji gotowej apki. A tu nie - okazało się, że to początek przygody z uprawnieniami administratorskimi :)
Znalazłam nawet to:
https://developer.android.com/guide/topics/admin/device-admin.html
O - pomyślałam - gotowy wzór, teraz to już prawie koniec.
I potem pojawiły się FATAL EXCEPTION...