2014-02-11 92 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()方法。

希望它可以帮助...干杯... :)

相关问题