2012-10-05 12 views
23

Teraz próbuję stworzyć jedną aplikację dla systemu Android, zakładam, że będzie to koncepcja "X". Więc tworzę jeden ekran logowania. To, co chcę zrobić, to od razu, gdy zaloguję się w tej aplikacji na moim telefonie komórkowym, zawsze powinienem być zalogowany, gdy tylko spróbuję uzyskać dostęp do tej aplikacji.Jak utrzymać, że aplikacje na Androida są zawsze zalogowane?

Na przykład nasi Facebook, g-mail i Yahoo itp .. w nasze telefony komórkowe

Co zrobić z tym?

Odpowiedz

53

Użyj preferencji współdzielonych dla funkcji automatycznego logowania. Gdy użytkownicy logują się do aplikacji, przechowuj status logowania w sharedPreference i usuwaj sharedPreference po wylogowaniu się użytkowników.

Sprawdź za każdym razem, gdy użytkownik wchodzi do wniosku, jeżeli status użytkownika z udostępnionego preferencja jest prawdziwa, to nie ma potrzeby, aby ponownie zalogować się w inny sposób bezpośrednio do strony logowania.

Aby to osiągnąć najpierw utworzyć klasę, w tej klasie trzeba napisać wszystkie funkcje dotyczące pobierania i ustawiania wartości w sharedpreference. Proszę spojrzeć na poniższy kod.

public class SaveSharedPreference 
{ 
    static final String PREF_USER_NAME= "username"; 

    static SharedPreferences getSharedPreferences(Context ctx) { 
     return PreferenceManager.getDefaultSharedPreferences(ctx); 
    } 

    public static void setUserName(Context ctx, String userName) 
    { 
     Editor editor = getSharedPreferences(ctx).edit(); 
     editor.putString(PREF_USER_NAME, userName); 
     editor.commit(); 
    } 

    public static String getUserName(Context ctx) 
    { 
     return getSharedPreferences(ctx).getString(PREF_USER_NAME, ""); 
    } 
} 

Teraz w głównej działalności (The „aktywny”, gdzie użytkownicy będą przekierowywane po zalogowaniu) najpierw sprawdzić

if(SaveSharedPreference.getUserName(MainActivity.this).length() == 0) 
{ 
    // call Login Activity 
} 
else 
{ 
    // Stay at the current activity. 
} 

Aktywność logowania czy logowania użytkownika udany następnie ustawić nazwa_użytkownika użyciu setUserName funkcji() .

+0

mogę prosić o wysłanie mi conajmniej jeden program przykładowy – Rohith

+0

Kiedy to zrobić i spróbować zalogować się ponownie, zwraca null – Sauron

+1

thi jest bardzo niebezpieczny, ponieważ możesz uzyskać dostęp do współdzielonych preferencji jako plik xml na telefonach zrootowanych – Choletski

0

po zalogowaniu się po naciśnięciu przycisku wstecz połączenia moveTaskToBack(true);

z tej aplikacji będzie w stanie w tle. nadzieję, że pomoże

-1

Po pierwsze po udanym logowaniu zapisać login/email i hasło SharedPreferences.

Po uruchomieniu aplikacji należy wykonać kod, który pobierze nazwę użytkownika i hasło z pliku sharedPrefernces, a następnie te dwie wartości mogą zostać przekazane jako parametr metody uwierzytelniania użytkownika.

+0

wystarczy zapisać plik cookie lub hash lub coś, co identyfikuje sesję ... zapisywanie użytkownika i hasła na widoku nie będzie dobre dla bezpieczeństwa ... – tyoc213

13

Możesz dodać następujące do pracy wylogowania w SaveSharedPreference.java:

public static void clearUserName(Context ctx) 
{ 
    Editor editor = getSharedPreferences(ctx).edit(); 
    editor.clear(); //clear all stored data 
    editor.commit(); 
} 
6

zawsze iw każdym razem ... więc wydaje się to zautomatyzowanego podejścia logowania. Aplikacja zostaje uruchomiona, użytkownik nie musi logować się ponownie po podaniu swoich informacji autoryzacyjnych. Można to osiągnąć na kilka sposobów. The Facebook API np. zapewnia mechanizm logowania bez użycia elementu formularza. W związku z tym należy utworzyć widok, w którym użytkownik może podać swoje informacje autoryzacyjne raz, zapisać je w SharedPreferences i zalogować się automatycznie następnym razem. Nawet jeśli nie ma takiego API - na podstawie loginu i trzeba użyć login - formularzu, czasami mógłby symulować Post -. Zgłoszenie do logowania w ten zależy od rzeczywistego serwera - wdrożenie stronie tego formularza. Ale pamiętaj: Jest to problem związany z bezpieczeństwem. Nigdy nie przechowuj poświadczeń autoryzacji w formacie czystego tekstu. Nie polegaj na szyfrowaniu go za pomocą zdefiniowanego klucza w aplikacji, ponieważ ten klucz może zostać wykryty przez inżynierię wsteczną pliku APK. Zamiast tego użyj wielu zbiorczych informacji o urządzeniu i kluczu, który użytkownik musi wprowadzić lub jest losowo generowany i przechowywany przez aplikację.

1

Korzystanie z SharedPreferences to sposób na zapisywanie i pobieranie danych par klucza i wartości w systemie Android oraz utrzymywanie sesji w całej aplikacji.

Aby pracować z SharedPreferences trzeba podjąć następujące kroki:

  1. inicjalizacji interfejsu SharedPreferences akcji przekazując dwa argumenty do konstruktora (String i Integer)

    // Sharedpref file name 
    private static final String PREF_NAME = "PreName"; 
    // Shared pref mode 
    int PRIVATE_MODE = 0; 
    

    // Inicjowanie SharedPreferences SharedPreferences pref = getApplicationContext(). GetSharedPreferences ("MyPref", 0); // 0 - dla trybu prywatnego

  2. Korzystanie z interfejsu edytora i jego metod, aby zmodyfikować wartości SharedPreferences i do przechowywania danych do późniejszego odzyskania

    //Initialising the Editor 
        Editor editor = pref.edit(); 
        editor.putBoolean("key_name", true); // Storing boolean - true/false 
    

    editor.putString („KEY_NAME”, „wartość ciągu”) ; // Zapisywanie ciągu znaków editor.putInt ("nazwa_funkcji", "wartość int"); // Zapisywanie liczby całkowitej editor.putFloat ("nazwa_klucza", "wartość zmiennoprzecinkowa"); // Przechowywanie float editor.putLong ("nazwa_klucza", "długa wartość"); // Przechowywanie długiego

    editor.commit(); // popełnić zmiany

  3. pobierania danych

Dane mogą być pobierane z zapisanymi preferencjami poprzez wywołanie metody() (STRING) getString. Pamiętaj, że ta metoda powinna być wywoływana w preferencjach współdzielonych, a nie w edytorze.

// returns stored preference value 
    // If value is not present return second param value - In this case null 
    pref.getString("key_name", null); // getting String 
    pref.getInt("key_name", null); // getting Integer 
    pref.getFloat("key_name", null); // getting Float 
    pref.getLong("key_name", null); // getting Long 
    pref.getBoolean("key_name", null); // getting boolean 
  1. Wreszcie polana/usuwanie danych, takich jak w przypadku wylogowania

Jeśli chcesz usunąć ze wspólnych upodobań można nazwać usunąć („KEY_NAME”), aby usunąć tę konkretną wartość. Jeśli chcesz usunąć wszystkie dane, zadzwoń jasne()

editor.remove("name"); // will delete key name 
editor.remove("email"); // will delete key email 

editor.commit(); // commit changes 

Following will clear all the data from shared preferences 
editor.clear(); 
editor.commit(); // commit changes 

proszę wykonać poniższe łącze, aby pobrać proste i przykład: http://www.androidhive.info/2012/08/android-session-management-using-shared-preferences/

Mam nadzieję, że nie poszły na zasadach i regulamin platformy do udostępniania tego linku.

//This is my SharedPreferences Class 
    import java.util.HashMap; 
import android.annotation.SuppressLint; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 

public class SessionManager { 
    // Shared Preferences 
    SharedPreferences pref; 
    // Editor for Shared preferences 
    Editor editor; 
    // Context 
    Context _context; 
    // Shared pref mode 
    int PRIVATE_MODE = 0; 
    // Sharedpref file name 
    private static final String PREF_NAME = "AndroidHivePref"; 
    // All Shared Preferences Keys 
    private static final String IS_LOGIN = "IsLoggedIn"; 
    // User name (make variable public to access from outside) 
    public static final String KEY_NAME = "name"; 
    // Email address (make variable public to access from outside) 
    public static final String KEY_EMAIL = "email"; 

    // Constructor 
    @SuppressLint("CommitPrefEdits") 
    public SessionManager(Context context) { 
     this._context = context; 
     pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); 
     editor = pref.edit(); 
    } 

    /** 
    * Create login session 
    */ 
    public void createLoginSession(String name, String email) { 
     // Storing login value as TRUE 
     editor.putBoolean(IS_LOGIN, true); 
     // Storing name in pref 
     editor.putString(KEY_NAME, name); 
     // Storing email in pref 
     editor.putString(KEY_EMAIL, email); 
     // commit changes 
     editor.commit(); 
    } 

    /** 
    * Check login method wil check user login status If false it will redirect 
    * user to login page Else won't do anything 
    */ 
    public void checkLogin() { 
     // Check login status 
     if (!this.isLoggedIn()) { 
      // user is not logged in redirect him to Login Activity 
      Intent i = new Intent(_context, MainActivity.class); 
      // Closing all the Activities 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

      // Add new Flag to start new Activity 
      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

      // Staring Login Activity 
      _context.startActivity(i); 
     } 

    } 

    /** 
    * Get stored session data 
    */ 
    public HashMap<String, String> getUserDetails() { 
     HashMap<String, String> user = new HashMap<String, String>(); 
     // user name 
     user.put(KEY_NAME, pref.getString(KEY_NAME, null)); 

     // user email id 
     user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null)); 

     // return user 
     return user; 
    } 

    /** 
    * Clear session details 
    */ 
    public void logoutUser() { 
     // Clearing all data from Shared Preferences 
     editor.clear(); 
     editor.commit(); 

     // After logout redirect user to Loing Activity 
     Intent i = new Intent(_context, MainActivity.class); 
     // Closing all the Activities 
     i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     // Add new Flag to start new Activity 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     // Staring Login Activity 
     _context.startActivity(i); 
    } 

    /** 
    * Quick check for login 
    **/ 
    // Get Login State 
    public boolean isLoggedIn() { 
     return pref.getBoolean(IS_LOGIN, false); 
    } 
} 


Finally, you will have to create an instance of this SessionManager class in the onCreate method of your activity class and then call the createLoginSession for the session that will be used throughout the entire session 



// Session Manager Class 
    SessionManager session; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Session Manager 
     session = new SessionManager(getApplicationContext()); 
session.createLoginSession("Username", intentValue); 
} 

Mam nadzieję, że to pomaga.

0

Xamarin.Android port Chirag Raval 's i LINTUism' s odpowiedzi:

public class SharedPreference 
{ 
    static ISharedPreferences get(Context ctx) 
    { 
     return PreferenceManager.GetDefaultSharedPreferences(ctx); 
    } 

    public static void SetUsername(Context ctx, string username) 
    { 
     var editor = get(ctx).Edit(); 
     editor.PutString("USERNAME", username); 
     editor.Commit(); 
    } 

    public static string GetUsername(Context ctx) 
    { 
     return get(ctx).GetString("USERNAME", ""); 
    } 

    public static void Clear(Context ctx) 
    { 
     var editor = get(ctx).Edit(); 
     editor.Clear(); 
     editor.Commit(); 
    } 
} 
Powiązane problemy