2012-09-19 11 views
9

Moja aplikacja zawiera poufne informacje o użytkowniku i musimy zaimplementować ekran hasła, który będzie wyświetlany za każdym razem, gdy użytkownik otworzy aplikację. Oto dwa podejścia, które próbowałem po przeczytaniu this post.Wdrożenie blokady kodu dostępu dla aplikacji Android

  1. użyć zmiennej statycznej i przywrócić go w onStop() każdej aktywności i sprawdzić je ponownie w onStart() każdego działania i pokazać ekran hasło jeśli czas przekroczył minimum progu powiedzenia 1-2 sek. Problem z tym podejściem polega na tym, że moja aplikacja używa także intencji do wywoływania skanerów aparatów i kodów kreskowych, a użytkownicy mogą spędzać dłuższe okresy w tych zewnętrznych aplikacjach. Mogę zwiększyć próg w tym przypadku, ale to sprawia, że ​​obliczenia są skomplikowane i nie jest to bardzo dobre rozwiązanie.

  2. Próbowałem inne podejście przy użyciu tej metody.

    protected boolean isAppOnForeground(final Context context) { 
    List<RunningAppProcessInfo> appProcesses = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses(); 
    
        if (appProcesses == null) { 
         return false; 
        } 
    
        final String packageName = context.getPackageName(); 
    
        for (RunningAppProcessInfo appProcess : appProcesses) { 
         if ((appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) && 
          appProcess.processName.equals(packageName)) { 
          return true; 
         } 
        } 
        return false; 
    } 
    

Ale to zawsze zwróci true, gdy sprawdzam go w metodzie onStart każdej aktywności, ponieważ proces już rozpoczętej przez czasu jest w onStart

Czy istnieją inne podejście Mogę wykonać wyświetlenie hasła, gdy użytkownik otworzy aplikację? Powinien być wyświetlany, nawet gdy użytkownik kliknie na ekranie głównym, aby wyjść z aplikacji, a następnie powraca do aplikacji z ostatnich aplikacji.

+0

nie jestem pewien, ale jeśli możesz zrobić usługę, a każda wypowie 1 lub 2 sekund wywołania isapponforeground, i zmienić zmienną na true/false, aw aktywności po wznowieniu, po prostu sprawdź true/false – Amit

+0

Dla # 1, co o zaszyfrowanym ciągu znaków sesji/typu cookie przechowywanym w * prywatnej * udostępnionej subskrypcji - możesz ustawić limit czasu na kilka minut, co może pozwolić użytkownikom na opuszczenie i powrót do Twojej aplikacji. – pjco

+0

Innym możliwym rozwiązaniem jest administrator urządzenia do korzystania z blokady urządzenia zamiast niestandardowej blokady aplikacji. może być lepiej lub gorzej w zależności od tego, jak na to patrzysz. jeśli masz wiele aplikacji wymagających zabezpieczeń, jest to pojedyncza blokada dla wszystkich aplikacji. jeśli masz tylko jedną aplikację, użytkownicy są zirytowani, ponieważ Twoja aplikacja wymusza na nich blokadę ekranu. –

Odpowiedz

4

Zaimplementowałem tę funkcję. Zasadniczo zrobiłem twoje # 1, ale w trochę czystszy sposób.

to, co napisałem, to streszczenie podklasy abstrakcyjnej Activity i zastąpienie onResume(). tam, zdecyduj, czy chcesz pokazać ekran blokady pinów. jeśli to zrobisz, skończ się i zacznij aktywność blokady pinów. wszystkie twoje działania rozszerzają tę aktywność.

aby zapamiętać, w którym miejscu byłeś, możesz dodać "początkowe intencje" do intencji użytej do rozpoczęcia działania blokady pin. kiedy aplikacja jest odblokowana, aktywacja blokady pinów może wykorzystać tę dodatkową wartość, aby umieścić użytkownika z powrotem tam, gdzie był.

jeśli Twoja aplikacja była oparta na fragmentach, byłoby to proste. po wznowieniu działania, które obsługuje wszystkie fragmenty, wyświetla się fragment kodu PIN. to wszystko.

Problem z aplikacją zawierającą kilka czynności polega na tym, że nie ma jednoznacznego określenia momentu "uruchomienia" aplikacji. koncepcja nie istnieje. jest to zasadniczo problem, który znalazłeś w swoim # 1 rozwiązaniu. onResume() wydaje się być dobrym wyborem, ale można go nazwać z wielu powodów. na przykład użytkownik uruchamia działanie A, które rozpoczyna działanie B. teraz wycofują się. pokazać blokadę sworznia, czy nie?

Każde rozwiązanie wykorzystujące wątek sprawdzający procesy pierwszoplanowe to straszny pomysł ze względu na wpływ baterii.

Wreszcie, możesz chcieć zakwestionować wymóg posiadania blokady pinowej za każdym razem, gdy aplikacja zostanie przeniesiona na pierwszy plan. Wydaje się przesadne, gdy odbijam się, aby przeczytać wiadomość tekstową i wracam 10 sekund później, jestem zmuszony ponownie wprowadzić pinezkę. czas wydaje się bardziej odpowiedni.

+0

Jedyna różnica z 'onResume()' vs 'onStart()' polega na tym, że 'onResume()' może zostać wywołane po zamknięciu okna dialogowego. To może być zaleta lub wada, jak sądzę. – pjco

+0

@pjco Myślę, że 'onStart/Stop()' jest prawdopodobnie lepszym wyborem z podanego powodu. –

+0

@Jeff: Dziękuję. Właściwie to robiłem BaseActivity, z którego prawie wszystkie moje działania są subklasowane i wdrażam sprawdzanie kodu dostępu w metodach onStart i onStop. Nie obchodzi mnie to, gdy użytkownicy otwierają okna dialogowe, ponieważ są już w aplikacji. Całkowicie zgadzam się na kwestię wpływu baterii i zdecydowanie nie skorzystałbym z podejścia polegającego na obsłudze w tle dla tego testu. A jeśli chodzi o wymaganie hasła, to jest to bardzo ważne dla mojej aplikacji. Użytkownicy faktycznie tego żądają i dają negatywne opinie, ponieważ ich nie mam. Oczywiście zrobię to opcjonalnie dla tego, kto tego chce. – achie

Powiązane problemy