2014-02-11 100 views
2

我正在寫一個具有登錄詳細信息(用戶名和密碼)的應用程序。
我想這樣做,以便當用戶關閉應用程序並稍後啓動它時,他/她不必再次輸入他/她的用戶名和密碼。Android。如何在應用程序關閉後保存用戶名和密碼?

所以這裏是我的代碼到目前爲止。它似乎沒有記住密碼或用戶名,不幸的是我:

protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    mPrefs = getSharedPreferences(PREFS, 0); 
    final CheckBox rememberMeCbx = (CheckBox)findViewById(R.id.saveLoginCheckBox); 

    boolean rememberMe = mPrefs.getBoolean("rememberMe", false); 



    if (android.os.Build.VERSION.SDK_INT > 9) 
    { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
    } 
    mXmlRpcClient = new XMLRPCClient(mXmlRpcUri); 

    // Set up the login form. 
    //mUsername = getIntent().getStringExtra(EXTRA_EMAIL); 
    mUsernameView = (EditText) findViewById(R.id.username); 
    mUsernameView.setText(mUsername); 

    mPasswordView = (EditText) findViewById(R.id.password); 
    mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
       @Override 
       public boolean onEditorAction(TextView textView, int id, 
         KeyEvent keyEvent) { 
        if (id == R.id.login || id == EditorInfo.IME_NULL) { 
         attemptLogin(); 
         return true; 
        } 
        return false; 
       } 
      }); 

    mLoginFormView = findViewById(R.id.login_form); 
    mLoginStatusView = findViewById(R.id.login_status); 
    mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message); 

    findViewById(R.id.sign_in_button).setOnClickListener 
    (
      new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View view) 
       { 
        if(rememberMeCbx.isChecked()) 
        { 
         attemptLogin(); //function to check if fields are filled correctly 
         saveLoginDetails(); 
        } 
        else 
        { 
         attemptLogin(); 
         removeLoginDetails(); 
        } 

       } 
      }); 

    if(rememberMe == true) 
    { 
     //get previously stored login details 
     String login = mPrefs.getString("mUsername", null); 
     String upass = mPrefs.getString("mPassword", null); 

     if(login != null && upass != null) 
     { 
      //fill input boxes with stored login and pass 
      EditText loginEbx = (EditText)findViewById(R.id.username); 
      EditText passEbx = (EditText)findViewById(R.id.password); 
      loginEbx.setText(login); 
      passEbx.setText(upass); 

      //set the check box to 'checked'     
      rememberMeCbx.setChecked(true); 
     } 
    } 
} 



/** 
* Represents an asynchronous login/registration task used to authenticate 
* the user. 
*/ 
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... params) { 
     try { 
      mSessionID = (String)mXmlRpcClient.call(mLoginFuncName, mUsername, mPassword); 
      return true; 
     } catch (Exception e) { 
      return false; 
     } 
    } 

    @Override 
    protected void onPostExecute(final Boolean success) { 
     mAuthTask = null; 
     showProgress(false); 

     if (success) { 
      finish(); 
      Intent intent = new Intent(LoginActivity.this, MainWindow.class); 
      intent.putExtra("SessionID", mSessionID); 
      intent.putExtra("XmlRpcUrl", mXmlRpcUrl); 
      intent.putExtra("LoginFuncName", mLoginFuncName); 
      intent.putExtra("LogoutFuncName", mLogoutFuncName); 
      intent.putExtra("GetDevicesFuncName", mGetDevicesFuncName); 
      intent.putExtra("SendPositionFuncName", mSendPositionFuncName); 
      intent.putExtra("GetSavedTripFunc", mGetSavedTripFunc);    
      startActivity(intent); 
     } else { 
      mPasswordView 
        .setError(getString(R.string.error_incorrect_password)); 
      mPasswordView.requestFocus(); 
     } 
    } 


} 

private void saveLoginDetails() 
{ 
    //fill input boxes with stored login and pass 
    EditText loginEbx = (EditText)findViewById(R.id.username); 
    EditText passEbx = (EditText)findViewById(R.id.password); 
    String login = loginEbx.getText().toString(); 
    String upass = passEbx.getText().toString(); 

    Editor e = mPrefs.edit(); 
    e.putBoolean("rememberMe", true); 
    e.putString("login", login); 
    e.putString("password", upass); 
    e.commit(); 
} 

private void removeLoginDetails() 
{ 
    Editor e = mPrefs.edit(); 
    e.putBoolean("rememberMe", false); 
    e.remove("login"); 
    e.remove("password"); 
    e.commit(); 
} 

}

你能告訴我什麼是錯我的代碼,我怎麼能改善它使用戶名和密碼在應用程序關閉並重新打開後保存和檢索?

+0

在活動'的onPause()'保存在'Preference'數據和加載數據上的活動'的onResume()' –

+0

所以你的意思是我應該把onPause()中的saveLoginDetails()方法和onResume()中的「if(rememberMe == true)」檢查? – user3182266

+0

嘗試按照我的回答 –

回答

6

試試這個方法:定義Preferences第一

private static final String PREFS_NAME = "preferences"; 
private static final String PREF_UNAME = "Username"; 
private static final String PREF_PASSWORD = "Password"; 

private final String DefaultUnameValue = ""; 
private String UnameValue; 

private final String DefaultPasswordValue = ""; 
private String PasswordValue; 

而且的onPause()

@Override 
public void onPause() { 
    super.onPause(); 
    savePreferences(); 

} 

而且的onResume()

@Override 
public void onResume() { 
    super.onResume(); 
    loadPreferences(); 
    } 

這裏savePreferences()

private void savePreferences() { 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 
      Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = settings.edit(); 

    // Edit and commit 
    UnameValue = edt_username.getText(); 
    PasswordValue = edt_password.getText(); 
    System.out.println("onPause save name: " + UnameValue); 
    System.out.println("onPause save password: " + PasswordValue); 
    editor.putString(PREF_UNAME, UnameValue); 
    editor.putString(PREF_PASSWORD, PasswordValue); 
    editor.commit(); 
} 

這裏loadPreferences()

private void loadPreferences() { 

    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 
      Context.MODE_PRIVATE); 

    // Get value 
    UnameValue = settings.getString(PREF_UNAME, DefaultUnameValue); 
    PasswordValue = settings.getString(PREF_PASSWORD, DefaultPasswordValue); 
    edt_username.setText(UnameValue); 
    edt_password.setText(PasswordValue); 
    System.out.println("onResume load name: " + UnameValue); 
    System.out.println("onResume load password: " + PasswordValue); 
} 
+0

嗯這看起來很有希望,但我有一個複選框,所以我想保存細節,如果複選框被選中,而不是如果它不是 – user3182266

+0

@ user3182266共享偏好是方式 – Raghunandan

+0

@ user3182266然後你需要存儲支票簿狀態並加載它並檢查它。這就是它 –

0

我高不建議你的邏輯!我建議您登錄AccountManager API來驗證並存儲用戶憑證,或者編寫自己的客戶經理,始終使用AccountManager,該帳戶只存儲您的授權令牌。

對於您的邏輯至少嘗試以安全的方式使用SharedPreferences,否則以root訪問我們可以從手機獲取SharedPreferences數據!

0

目前爲止確定我認爲你的代碼是正確的,但你不知道在哪裏實現它。

所以應該有一個點,你的登錄成功,你想在你的應用程序中打開另一個Activity,並且你必須調用Intent

因此,您只需要在成功登錄時觸發Intent,就可以調用saveLoginDetails()這種方法。

if(*successful login condition*){ 
    Intent intent=new Intent(CurrentActivity.this,NextActivity.class); 
    saveLoginDetails(); 
    startActivity(intent); 
} 

,每當用戶註銷你可以實現你的removeLoginDetails()方法。

希望它可以幫助...乾杯... :)

相關問題