java - 尽管我使用 SharedPrefs 自动登录,但它们似乎已被删除

标签 java android authentication sharedpreferences

我正在尝试保存到我的应用程序共享首选项,我保存了用户名和密码。

成功登录后,这些会被很好地存储。当我终止该应用程序,然后重新打开它时,它会自动登录,因为它应该使用共享首选项。

但是,当我导航到帐户管理 Activity 并尝试再次访问首选项时,找不到用户名和密码的 key ,并且返回默认值。我肯定使用正确的键值,因为如果首次启动时没有存储用户/密码首选项,则在需要手动登录时它可以完美地工作。

这真的让我很困惑,因为用户名和密码 key 显然存在,否则它不会自动登录。

一些代码:

这是我的帐户管理 Activity :

公共(public)类 AccManagement 扩展了 Activity {

TextView textName;
TextView textEmail;
String SharedUsername;
String SharedPassword;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_acc_management);
    textName = (TextView)findViewById(R.id.textviewName);
    textEmail = (TextView)findViewById(R.id.textviewEmail);

            //these return null, as if there are no shared prefs stored.
    SharedUsername= SharedPrefsWrapper.getFromPrefs(this, "USERNAME", null);
    SharedPassword= SharedPrefsWrapper.getFromPrefs(this, "PASSWORD", null);
}

我为共享首选项创建了一个包装类,它获取键/值对并将其放入共享首选项中。

这是我检查用户是否存在于我的主要 Activity 中的方法:

public void Checker()
{

    String SharedUsername= SharedPrefsWrapper.getFromPrefs(this, "USERNAME", null);
    String SharedPassword= SharedPrefsWrapper.getFromPrefs(this, "PASSWORD", null);

    if(SharedUsername== null || SharedPassword== null)
    {
        setContentView(R.layout.activity_main);
    }
    else
    {
        Login(url);
    }
}

登录执行http请求,完成后调用此方法:

   public void onTaskCompleted(String data) 
   {

    if(data.contains("name")) //a successful login will return a json string with "name".
    {
        Intent intent = new Intent(this, MenuActivity.class);
        SharedPrefsWrapper.saveToPref(this, "USERNAME", textusername);
        SharedPrefsWrapper.saveToPref(this, "PASSWORD", textpassword);
            startActivity(intent);
    }    
 }

成功登录后,用户将看到一个包含帐户管理按钮的菜单,单击后将进入帐户管理,其中显示用户名和密码。虽然这就是我的问题发生的地方。它找不到我在登录时保存的共享首选项。仅当应用程序使用共享首选项自动登录时才会发生这种情况。如果这是第一次登录,它似乎工作正常,并且当我尝试从我的帐户 Activity 中获取共享首选项时,它们似乎仍然存在。

感谢您的帮助

如果这个问题根本没有意义,我很抱歉!

:)

编辑:

SharedPrefs 类方法:

public static void saveToPref(Context context, String key, String value)
{
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    final SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getFromPrefs(Context context, String key, String defValue)
{
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    try
    {
        return prefs.getString(key, defValue);
    }
    catch(Exception ex)
    {
        return defValue;
    }
}

最佳答案

自动登录时,文本用户名和文本密码为空,因此这会清除您的首选项。

尝试尊重java naming conventions ,你的代码很难阅读。

关于java - 尽管我使用 SharedPrefs 自动登录,但它们似乎已被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23157100/

相关文章:

Android Studio - android.jar 和 rt.jar 冲突

c# - 使用外部 WCF 服务时,在 docker 内运行的 Dotnet 核心 Web api 无法进行身份验证

php - 如何要求 wordpress 登录以查看 wordpress 站点中的子目录?

authentication - Auth0 和 Angular2 : how to set callbackURL and catch the token?

java - 测试对象是否为空的通用代码?

java - 无法使用 gwtext 运行 Web 应用程序

java - 如何在查询前解析正斜杠

java - 如何制作带有角半径和起始颜色的android edittext样式?

android - FlexboxLayout 实现 GridView 效果

java - 使用 Hadoop 时如何解决 NoClassDefFoundError?