0

I am hoping someone can help. Still very new to Android/Java. I have an application with multiple activities. When the user click a specific button, I want them to be required to log in before continuing.

I am trying to make it so if the password is NULL it will prompt to create a password and after successfully creating the password it would continue on to the activity. And from that point forward it would ask them for the password they created to get to that activity if the application is restarted.

Here is what I have. I can not seem to get it to SET a password. It always stays NULL. I'm sure I have other issues with this code, but I'm trying to take it one step at a time.

package com.soboapps.todos;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Password extends Activity implements OnClickListener {

public static final String PASSWORD_PREF_KEY ="PasswordSharedPreferences";
public static final String PREFS_PRIVATE = "PREFS_PRIVATE";
public static final String KEY_PRIVATE = "KEY_PRIVATE";
public static final String PREFS_READ = "PREFS_READ";
public static final String KEY_READ = "KEY_READ";
public static final String PREFS_WRITE = "PREFS_WRITE";
public static final String KEY_WRITE = "KEY_WRITE";
public static final String PREFS_READ_WRITE = "PREFS_READ_WRITE";
public static final String KEY_READ_WRITE = "KEY_READ_WRITE";

EditText pass1, password, passwordEditText;
TextView messages, passHint;
//EditText pass1;
Button btnSubmit;

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


    PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    SharedPreferences settings = this.getSharedPreferences("PasswordSharedPreferences", MODE_PRIVATE);
    String password1 = settings.getString("User Password", "");

    messages = (TextView) findViewById (R.id.text1);
    pass1 = (EditText) findViewById(R.id.txtPassword);
    btnSubmit = (Button) findViewById(R.id.btnSubmit);
    passHint = (TextView) findViewById(R.id.textView1);

    //passHint.setText(password1);
    passwordEditText = (EditText) findViewById(R.id.password);

    if(password1.isEmpty()) {
        passHint.setText("Set a Secure Password");
    }   
    btnSubmit.setOnClickListener(this);
} 

    public void onClick(View v) {
        // TODO Auto-generated method stub
        //PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        SharedPreferences settings = this.getSharedPreferences("PasswordSharedPreferences", MODE_PRIVATE);
        final String password1 = settings.getString("User Password", "");
        final String p1 = pass1.getText().toString();

        if(password1.isEmpty()) {
        //switch(v.getId()){
        //case R.id.btnSubmit:

            if (p1.toLowerCase().equals("password")) {
                pass1.setText("");
                messages.setText("Password cannot be \"password\"");
            }

            if (p1.length() < 3) {
                messages.setText("Password must be at least 3 characters");
            }

            else {

                settings.edit().putString("User Password", p1).apply();
                Toast customToast = new Toast(getBaseContext());
                customToast = Toast.makeText(getBaseContext(), "Password has been set!", Toast.LENGTH_SHORT);
                customToast.setGravity(Gravity.CENTER|Gravity.CENTER, 0, 0);
                customToast.show();
                StartGallery();
            }
        }
            else if(p1.equals(password1)) {

                StartGallery();
                }
                else {
                    Toast customToast = new Toast(getBaseContext());
                    customToast = Toast.makeText(getBaseContext(), "Incorrect Password!", Toast.LENGTH_SHORT);
                    customToast.setGravity(Gravity.CENTER|Gravity.CENTER, 0, 0);
                    customToast.show(); {
                    }
                }
        }

    public void StartGallery(){
            Intent intent = new Intent(this, GalleryActivity.class);
            startActivity(intent);
        }

        public boolean onCreateOptionsMenu(Menu menu){
            super.onCreateOptionsMenu(menu);
            MenuInflater Password = getMenuInflater();
            Password.inflate(R.menu.prefs_menu, menu);
            return true;
        }

        public boolean onOptionsItemSelected(MenuItem item){
            switch(item.getItemId()){
            case R.id.menuPrefs:

            startActivity(new Intent("com.soboapps.todos.PASSPREFS"));
            return true;
        }
            return false;
        }


}
4

5 に答える 5

2

At several places you use settings.getString(password1, null). Shouldn't this be settings.getString(PASSWORD_PREF_KEY, null)?

As you write it, you use the content of variable password1 as key into the preferences, which is probably not what you want.

于 2012-08-26T18:45:46.080 に答える
2

I recommend a few changes.

  • Don't use the SharedPreferences file name as the key for your password, this is confusing.
    You should use a unique string for the password key, this way you can eventually have different password for different users.

  • You overrode the OnClickListener regardless of whether the password succeeded or failed...

  • You were only checking against "password"; not "Password", "PASSWORD", "PaSsWoRd", etc.

  • When the password is set, I think the next Activity should open right away. I don't think the user should have to click "Submit" twice. I left a suggestion in the code about this.

Here is a revised OnClickListener:

public void onClick(View v) {
    SharedPreferences settings = this.getSharedPreferences("PasswordSharedPreferences", MODE_PRIVATE);
    final String password1 = settings.getString("User Password", "");
    final String p1 = pass1.getText().toString();

    // No password exists, try to set one
    if(password1.isEmpty()) {
        // Forbid any variation of "password", "Password", "PASSWORD", etc
        if (p1.toLowerCase().equals("password")) {
            pass1.setText("");
            messages.setText("Password cannot be \"password\"");
        }
        // Minimum length requirement
        else if (p1.length() < 3) {
            messages.setText("Password must be at least 3 characters");
        }
        // Set input as password
        else {
            settings.edit().putString("User Password", p1).apply();
            messages.setText("Password set!");

            // You could displayed "Password set!" is a Toast and start the next activity immediately
            //StartGallery();
        }
    }
    else if(p1.equals(password1)) {
        StartGallery();
    }
}
于 2012-08-26T19:12:38.217 に答える
0

演算子ではなく使用したいかもしれません。あなたのメッセージは、パスワードをパスワードとして入力しないようにユーザーを制限しようとしていることを示唆しています

if (!p1.equals("password"))

それ以外の

if (p1.equals("password"))

編集:

また、行を削除します

if(settings.getString(password1, null) != null) 

これは必須ではありません

于 2012-08-26T18:11:09.127 に答える
0

Change this line:

if(settings.getString(password1, null) != null) {

To this:

if(password1.equals(null)) {

You already stored the value of the preference in passward1. there is no need to get it again. And above all that, You should use equals() with the Strings, not !=.

于 2012-08-26T18:47:12.507 に答える
0

If i got you right, them your problem is that you can't save the password to the preferences. If this right you can try this.

于 2012-08-26T19:05:59.120 に答える