2013-12-19 3 views
11

Может кто-нибудь сказать мне, как поддерживать сеанс для входа в систему. Например, когда пользователь подписывается на приложение, он должен быть подписан, если пользователь не выйдет из системы или не удалит приложение, подобное gmail в android.Как поддерживать сеанс в Android?

+2

Вы пробовали использовать [SharedPreferences] (Http: // разработчик. android.com/reference/android/cont ent/SharedPreferences.html) в качестве хранилища сеансов? Не совсем уверен в вопросах безопасности/безопасности, но это может быть то, что вам нужно. –

ответ

26

сделать один класс для вашего SharedPreferences

public class Session { 

    private SharedPreferences prefs; 

    public Session(Context cntx) { 
     // TODO Auto-generated constructor stub 
     prefs = PreferenceManager.getDefaultSharedPreferences(cntx); 
    } 

    public void setusename(String usename) { 
     prefs.edit().putString("usename", usename).commit(); 
    } 

    public String getusename() { 
     String usename = prefs.getString("usename",""); 
     return usename; 
    } 
} 

Теперь после того, как делает этот класс, если вы хотите использовать его, использовать, как это: сделать объект этого класса, как

private Session session;//global variable 
session = new Session(cntx); //in oncreate 
//and now we set sharedpreference then use this like 

session.setusename("USERNAME"); 

Теперь, когда вы хотите для получения имени пользователя, то такая же работа должна быть выполнена для объекта сеанса и называть это

session.getusename(); 

Выполняйте то же самое для пароля

+2

Какова цель prefsCommit(); –

+3

Рассмотрите возможность использования apply(); commit() немедленно записывает свои данные в постоянное хранилище, тогда как apply() будет обрабатывать его в фоновом режиме. –

+0

Я получаю красную линию на prefsCommit(); –

2

Вы можете использовать логическое значение в SharedPreferences.

Загрузите его перед регистрацией, чтобы проверить, требуется ли логин.

Сохраните его после авторизации.

0

Вы можете получить это поведение несколькими способами, я предпочитаю устанавливать флаг в общих привилегиях. когда пользователь регистрируется при проверке, когда приложение запускается, если вы получаете значение по умолчанию, которое пользователь не зарегистрировал, иначе вы должны установить свой флаг (я использую имя пользователя) и избежать раздела входа в систему.

2

У меня есть простой способ, а не поддерживать сеанс.

i.e. Просто сохраните одну переменную boolean с вашим именем пользователя и паролем. по умолчанию установленное значение равно false.

После первого успешного входа в систему значение true.

Затем просто проверьте его значение на вашем Mainactivity, если оно верно, а затем перейдите к следующему действию, иначе перейдите к активности входа.

+0

Вы считаете его безопасным? –

+0

Да, конечно, поскольку общие настройки всегда хранятся в данных. поэтому никто не может импортировать данные из «УСТРОЙСТВ». Тем не менее, вы не удовлетворены, тогда вы можете хранить имя пользователя и пароль в зашифрованном виде. @ Swap-IOS-Android – Andrain

0

сохранить пользовательские данные в общих предпочтениях до выхода пользователя из системы. Как только пользователь выйдет из системы, очистите данные из общих настроек.

+0

сможет ли пользователь поддерживать сеанс даже после закрытия приложения без выхода из системы? – june

+0

есть. он сможет. вы очищаете sharedprefs только в том случае, если он нажимает кнопку выхода из системы. пока только sharedprefs не будут сохранены внутри вашего приложения. – Yogamurthy

5

Вы можете добиться этого с помощи менеджеру аккаунта - click here КОДИРУЙТЕ // ственного образца метода, чтобы добавить учетную запись .. частных аннулируются addAccount (String имя пользователь, String пароль) {

AccountManager accnt_manager = AccountManager 
      .get(getApplicationContext()); 

    Account[] accounts = accnt_manager 
      .getAccountsByType(getString(R.string.account_type));//account name identifier. 

    if (accounts.length > 0) { 
     return; 
    } 
    final Account account = new Account(username, 
      getString(R.string.account_type)); 

    accnt_manager.addAccountExplicitly(account, password, null); 

    final Intent intent = new Intent(); 
    intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, username); 
    intent.putExtra(AccountManager.KEY_PASSWORD, password); 
    intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, 
      getString(R.string.account_type)); 
    // intent.putExtra(AccountManager.KEY_AUTH_TOKEN_LABEL, 
    // PARAM_AUTHTOKEN_TYPE); 
    intent.putExtra(AccountManager.KEY_AUTHTOKEN, "token"); 
    this.setAccountAuthenticatorResult(intent.getExtras()); 
    this.setResult(RESULT_OK, intent); 
    this.finish(); 

} 

// метод извлекать учетную запись. частное логическое validateAccount() {

AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() { 

     @Override 
     public void run(AccountManagerFuture<Bundle> arg0) { 
      Log.e("calback", "msg"); 

      try { 
       Bundle b = arg0.getResult(); 
       if (b.getBoolean(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE)) { 
        //User account exists!!.. 
       }  

      } catch (OperationCanceledException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (AuthenticatorException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    }; 

    AccountManager accnt_manager = AccountManager 
      .get(getApplicationContext()); 

    Account[] accounts = accnt_manager 
      .getAccountsByType(getString(R.string.account_type)); 

    if (accounts.length <= 0) { 
     return false; 
    } else { 

     loginNameVal = accounts[0].name; 
     loginPswdVal = accnt_manager.getPassword(accounts[0]); 
     return true; 

    } 

} 
+1

Это правильный способ обработки сеансов. Спасибо! – Jalal

0

Используйте следующий код.

SessionManager.java

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 = "Pref"; 

    // 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 
    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, LoginActivity.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, LoginActivity.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); 
    } 
} 

И в MainActivity сделать как в следующем.

public class MainActivity extends Activity { 

    // Email, password edittext 
    EditText txtUsername, txtPassword; 

    // login button 
    Button btnLogin; 

    // Alert Dialog Manager 
    AlertDialogManager alert = new AlertDialogManager(); 

    // Session Manager Class 
    SessionManager session; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 

     // Session Manager 
     session = new SessionManager(getApplicationContext());     

     // Email, Password input text 
     txtUsername = (EditText) findViewById(R.id.txtUsername); 
     txtPassword = (EditText) findViewById(R.id.txtPassword); 

     Toast.makeText(getApplicationContext(), "User Login Status: " + session.isLoggedIn(), Toast.LENGTH_LONG).show(); 


     // Login button 
     btnLogin = (Button) findViewById(R.id.btnLogin); 


     // Login button click event 
     btnLogin.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Get username, password from EditText 
       String username = txtUsername.getText().toString(); 
       String password = txtPassword.getText().toString(); 

       // Check if username, password is filled     
       if(username.trim().length() > 0 && password.trim().length() > 0){ 
        // For testing puspose username, password is checked with sample data 
        // username = test 
        // password = test 
        if(username.equals("test") && password.equals("test")){ 

         // Creating user login session 
         // For testing i am stroing name, email as follow 
         // Use user real data 
         session.createLoginSession("ABC", "[email protected]"); 

         // Staring MainActivity 
         Intent i = new Intent(getApplicationContext(), MainActivity.class); 
         startActivity(i); 
         finish(); 

        }else{ 
         // username/password doesn't match 
         alert.showAlertDialog(LoginActivity.this, "Login failed..", "Username/Password is incorrect", false); 
        }    
       }else{ 
        // user didn't entered username or password 
        // Show alert asking him to enter the details 
        alert.showAlertDialog(LoginActivity.this, "Login failed..", "Please enter username and password", false); 
       } 

      } 
     }); 
    }   
} 
1

Использование общих ресурсов. код для сохранения значения в sharedpreferences:

SharedPreferences sp=getSharedPreferences("key", Context.MODE_PRIVATE); 
SharedPreferences.Editor ed=sp.edit(); 
ed.putInt("value", your_value); 
ed.commit(); 

код, чтобы получить значение из sharedpreferences:

SharedPreferences sp=getSharedPreferences("key", Context.MODE_PRIVATE); 
int value = sp.getInt("value", default_value); 

Вы можете проверить логин и выход из системы с использованием этого значения.

0
public class Session { 

    private SharedPreferences prefs; 

    public Session(Context cntx) { 
     // TODO Auto-generated constructor stub 
     prefs = PreferenceManager.getDefaultSharedPreferences(cntx); 
     editor = prefs.edit(); 
    } 

    public void setusename(String usename) { 
     editor.putString("usename", usename).commit(); 

    } 

    public String getusename() { 
     String usename = prefs.getString("usename",""); 
     return usename; 
    } 
} 
0

Исходный код

https://drive.google.com/open?id=0BzBKpZ4nzNzUcUZxeHo0UnJ5UHc

Fetch Предыдущий Войти ID в андроида enter image description here

**After Login save Email ID is SharedPreferences** 

    emaidId = et_Email.getText().toString().trim(); 

    SharedPreferences ss = getSharedPreferences("loginSession_key", 0); 
    Set<String> hs = ss.getStringSet("set", new HashSet<String>()); 
    hs.add(emaidId); 
    SharedPreferences.Editor edit = ss.edit(); 
    edit.clear(); 
    edit.putStringSet("set", hs); 
    edit.commit(); 

===================onCreate()==================== 
===================AutoCompleteTextView set Adapter=================== 

**Fetch PRevious Login Email id in email EditText** 

SharedPreferences sss = getSharedPreferences("loginSession_key", 0);   // todo loginSession_key key name ALWAYS SAME 
Log.i("chauster", "2.set = " + sss.getStringSet("set", new HashSet<String>())); 
Log.e("Session", "Value->" + sss.getStringSet("set", new HashSet<String())); 
ArrayList<String> al = new ArrayList<>(); 
al.addAll(sss.getStringSet("set", new HashSet<String>())); 
//Creating the instance of ArrayAdapter containing list of language names 
ArrayAdapter<String> adapter = new ArrayAdapter<String> 
       (this, android.R.layout.select_dialog_item, al); 
//Getting the instance of AutoCompleteTextView 
et_Email.setThreshold(1);//will start working from first character 
et_Email.setAdapter(adapter);//setting the adapter data into the 
Смежные вопросы