2010-08-09 15 views
8

Poszukuję sposobu zabezpieczenia hasłem mojej aplikacji Android podczas uruchamiania, tj. Po uruchomieniu/wznowieniu działania należącego do mojego pakietu apk zostanie wyświetlone okno dialogowe z hasłem.Zabezpieczenie hasłem uruchamianie aplikacji Android

Próbowałem niektóre podejścia do tego (rozszerzenie application class i tak dalej), ale żaden nie wydaje się działać. Albo nie działają w wątku UI, albo okno dialogowe nie jest wyświetlane przy każdej okazji uruchomienia/wznowienia.

// m

+0

Klasy aplikacji to sposób na wykonanie, proszę napisać, co/jak wypróbowałeś, kod. Może to być coś nie tak z tym. – Pentium10

Odpowiedz

13

To jest rozwiązanie, z którym się utknąłem. W mojej klasie aplikacji przechowuję długą zmienną z czasem systemowym, gdy działanie zostało ostatnio wstrzymane.

import android.app.Application; 
public class MyApplication extends Application { 
    public long mLastPause; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mLastPause = 0; 
     Log.w("Application","Launch"); 
    } 
} 

W każdej metodzie onPause aktualizuję tę wartość do bieżącego czasu.

@Override 
public void onPause() { 
    super.onPause(); 
    ((MyApplication)this.getApplication()).mLastPause = System.currentTimeMillis(); 
} 

I w każdym onResume porównuję go z bieżącym czasem. Jeśli upłynie określony czas (obecnie 5 sekund), wyświetli się mój monit o hasło.

@Override 
public void onResume() { 
    super.onResume(); 
    MyApplication app = ((MyApplication)act.getApplication()); 
    if (System.currentTimeMillis() - app.mLastPause > 5000) { 
     // If more than 5 seconds since last pause, prompt for password 
    } 
} 
+0

Dziękuję za to rozwiązanie, myślę, że brakuje trochę rzeczy: kod w funkcji 'onResume' powinien być również wykonany w funkcji' onStart' . Musiałem dodać tę część, aby uniknąć irytującego przypadku: blokada nie była wyświetlana po ponownym otwarciu aplikacji po czystym wyjściu. –

+1

@YoannHercouet Nie jestem pewien, czy jest potrzebny. Z tego co zrozumiałem, metoda onResume zostanie wywołana po metodzie onStart przy zimnym starcie. Zobacz tę ilustrację z dokumentacji systemu Android: https://developer.android.com/images/activity_lifecycle.png –

+1

Również zamiast modyfikować onResume i onPause wszystkich działań, możesz utworzyć klasę LockActivity z wymaganymi metodami Overidden i uczynić wszystko twoje działania rozszerzają tę klasę. –

3

Podklasa aplikacji i ustawić zmienną tam od tego, czy czas obok coś się dzieje w twojej aplikacji, należy skłonić się okno, czy nie.

W swojej Działalności, Służbie, itp. ... korzystając z otrzymanego Kontekstu, uzyskaj Aplikację, jeśli var jest ustawiony tak, aby wyświetlał okno dialogowe, z Twojego kodu Aktywności (oznaczającego Wątek UI) pokazuje okno dialogowe. Prawdopodobnie umieścisz to w swoim kodzie onResume.

W trybie onPause ustaw zmienną, aby następnym razem była wyświetlana. W onResume ustaw jako false.

+0

Dzięki za odpowiedź. Jedna rzecz jednak ... Wydaje się, że nie ma aplikacji w trybie onPause i onResume, co oznacza, że ​​muszę ustawić zmienną w każdym działaniu. Spowoduje to wyświetlenie okna dialogowego hasła za każdym razem, gdy nowe działanie zostanie uruchomione/wznowione. Samo ustawienie zmiennej w klasie Application "onCreate działa tylko wtedy, gdy aplikacja jest uruchamiana na zimno, co prawdopodobnie nie będzie zbyt częste. Popraw mnie, jeśli się mylę :-) –

+0

Będziesz musiał uczynić to nieco mądrzejszym. Mieć licznik zamiast wartości boolowskiej. Za każdym razem, gdy wystąpi zdarzenie onResume, zwiększ go, za każdym razem, gdy wystąpi inPause, zmniejsz go. Jeśli jej 0, gdy aktywność się rozpocznie, pokaż hasło. – Moncader

+0

OK, teraz zaimplementowałem twoje rozwiązanie i nadal nie działa, ponieważ na każdym starcie/wznowieniu działania (nawet jeśli wywołane z innej czynności) pojawi się monit o podanie hasła. Dzieje się tak, ponieważ działanie onPause z wywołaniem jest wykonywane przed uruchomieniem onResume, co oznacza, że ​​zmienna zawsze będzie miała wartość 0 podczas uruchamiania działania. onPause: ((MyApplication) this.getApplication()). MActivityCounter--; onResume: MyApplication app = ((MyApplication) act.getApplication()); if (app.mActivityCounter == 0) { // Sprawdź hasło } app.mActivityCounter ++; Każdy pomysł? –

Powiązane problemy