Android使用SharedPreferences保存账号密码

有很多的应用都会有保存密码和账号的功能,比如QQ。接下来就讲讲使用SharedPreferences来保存密码和账号,也许有些人会考虑的数据库,但是我个人认为对于保存简单的数据,使用的数据库就大材小用了,SharedPreferences比较轻量级

首先写好布局,只有两个输入框和一个按钮

<EditText
        android:id="@+id/number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/save"
        android:text="保存"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

获取取控件

    private EditText number;
    private EditText password;
    private Button save;

     number = (EditText) findViewById(R.id.number);
     password = (EditText) findViewById(R.id.password);
     save = (Button) findViewById(R.id.save);

在获取控件之后,还要获取SharedPreferences,第一参数为保存的文件名,第二个为保存的模型,当文件存在就读取,如果不存在就创建

private SharedPreferences sp;
//第一参数为保存的文件名,第二个为保存的模型,当文件存在就读取,如果不存在就创建
sp = getSharedPreferences("info",MODE_PRIVATE);

增加按钮点击事件,点击按钮保存账号和密码

save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取输入框的账号和密码
                String numberStr = number.getText().toString().trim();
                String passwordStr = password.getText().toString().trim();
                //判断是否为空
                if (numberStr.isEmpty() || passwordStr.isEmpty()){
                    Toast.makeText(getApplicationContext(),"账号或密码不能为空",Toast.LENGTH_SHORT).show();
                }else {
                    //获取Editor
                    SharedPreferences.Editor editor = sp.edit();
                    //输入内容
                    editor.putString("number",numberStr);
                    editor.putString("password",passwordStr);
                    //必须提交才会生效,也可以使用apply
                    editor.commit();
                    Toast.makeText(getApplicationContext(),"保存成功",Toast.LENGTH_SHORT).show();
                }
            }
        });

当我们保存账号和密码后,想要在第二次打开应用时直接写密码和账号,还有在加载页面时获取数据

//获取info文件的内容,第一参数为保存时的key,第二个是如果获取不到的默认值
        String numberStr1 = sp.getString("number","");
        String passwordStr2 = sp.getString("password","");
        number.setText(numberStr1);
        password.setText(passwordStr2);

效果图

 

这个info.xml的文件保存在data/data/包名/shared_prefs/info.xml,可以看到是以XML格式保存的

 

最后再来理一理整个思路

保存

①通过getSharedPreferences("文件名",模式)获得SharedPreferences

②通过sp.edit()获取Editor

③使用editor调用putXXX(key,value)保存数据

④使用editor调用apply()或者commit()才会生效

读取

①通过getSharedPreferences("文件名",模式)获得SharedPreferences

②通过sp.getXXX(key,defValue)直接可以获得数据

 加密

明文保存好像很不安全,那我们就对密码简单加密,下面是加密和解密的方法

    /**
     * 加密方法
     * @param str 要加密的字符串
     * @param key 加密的密匙
     * @return 返回加密后的字符串
     */
    public String encryptionString(String str, int key) {
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] + key);
        }
        return String.valueOf(chars);
    }

    /**
     * 解密方法
     * @param str 要解密的字符串
     * @param key 解密的密匙,跟加密一样
     * @return 返回解密后的字符串
     */
    public String decodeString(String str, int key) {
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] - key);
        }
        return String.valueOf(chars);
    }

在保存密码前要对密码加密

public static final int DECODE_ENCRYPTION_KEY = 64;

String passwordStr = password.getText().toString().trim();
//对密码进行加密
passwordStr = encryptionString(passwordStr, DECODE_ENCRYPTION_KEY);
editor.putString("password", passwordStr);

显示密码前要对密码解密

public static final int DECODE_ENCRYPTION_KEY = 64;

String passwordStr2 = sp.getString("password", "");
//对密码进行解密
passwordStr2 = decodeString(passwordStr2,DECODE_ENCRYPTION_KEY);
password.setText(passwordStr2);

在保存后,就算别人看到也不知道真实的密码是什么,下面的图是加密后的,真实密码是654321

整个代码如下:

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText number;
    private EditText password;
    private Button save;
    private SharedPreferences sp;
    public static final int DECODE_ENCRYPTION_KEY = 64;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        number = (EditText) findViewById(R.id.number);
        password = (EditText) findViewById(R.id.password);
        save = (Button) findViewById(R.id.save);

        //第一参数为保存的文件名,第二个为保存的模型,当文件存在就读取,如果不存在就创建
        sp = getSharedPreferences("info", MODE_PRIVATE);

        //获取info文件的内容,第一参数为保存时的key,第二个是如果获取不到的默认值
        String numberStr1 = sp.getString("number", "");
        String passwordStr2 = sp.getString("password", "");
        //对密码进行解密
        passwordStr2 = decodeString(passwordStr2,DECODE_ENCRYPTION_KEY);
        password.setText(passwordStr2);
        number.setText(numberStr1);


        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取输入框的账号和密码
                String numberStr = number.getText().toString().trim();
                String passwordStr = password.getText().toString().trim();
                //对密码进行加密
                passwordStr = encryptionString(passwordStr, DECODE_ENCRYPTION_KEY);
                //判断是否为空
                if (numberStr.isEmpty() || passwordStr.isEmpty()) {
                    Toast.makeText(getApplicationContext(), "账号或密码不能为空", Toast.LENGTH_SHORT).show();
                } else {
                    //获取Editor
                    SharedPreferences.Editor editor = sp.edit();
                    //输入内容
                    editor.putString("number", numberStr);
                    editor.putString("password", passwordStr);
                    //必须提交才会生效,也可以使用apply
                    editor.commit();
                    Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    /**
     * 加密方法
     * @param str 要加密的字符串
     * @param key 加密的密匙
     * @return 返回加密后的字符串
     */
    public String encryptionString(String str, int key) {
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] + key);
        }
        return String.valueOf(chars);
    }

    /**
     * 解密方法
     * @param str 要解密的字符串
     * @param key 解密的密匙,跟加密一样
     * @return 返回解密后的字符串
     */
    public String decodeString(String str, int key) {
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] - key);
        }
        return String.valueOf(chars);
    }
}

项目源代码:https://resource.doiduoyi.com/#u3uu757

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个简单的示例代码,演示如何使用 SharedPreferences 将用户的用户名密码保存Android Studio 中: ```java public class LoginActivity extends AppCompatActivity { private EditText mUsernameEditText; private EditText mPasswordEditText; private Button mLoginButton; private SharedPreferences mSharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); mUsernameEditText = findViewById(R.id.username_edit_text); mPasswordEditText = findViewById(R.id.password_edit_text); mLoginButton = findViewById(R.id.login_button); // 获取 SharedPreferences 对象 mSharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE); // 检查是否已经保存用户名密码 String savedUsername = mSharedPreferences.getString("username", null); String savedPassword = mSharedPreferences.getString("password", null); if (savedUsername != null && savedPassword != null) { mUsernameEditText.setText(savedUsername); mPasswordEditText.setText(savedPassword); } mLoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 保存用户名密码 String username = mUsernameEditText.getText().toString(); String password = mPasswordEditText.getText().toString(); SharedPreferences.Editor editor = mSharedPreferences.edit(); editor.putString("username", username); editor.putString("password", password); editor.apply(); // 进行登录操作 // ... } }); } } ``` 在这个示例中,我们首先获取了一个 SharedPreferences 对象,该对象用于保存键值对。然后,我们检查是否已经保存用户名密码,如果是,则将这些值设置为文本框的文本。最后,当用户点击“登录”按钮时,我们将用户名密码保存SharedPreferences 中。请注意,我们使用 `apply()` 方法异步提交更改,以避免阻塞 UI 线程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨飘零1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值