当前位置:   article > 正文

Android使用SharedPreferences保存账号密码_创建android项目,实现使用sharedpreferences保存输入的用户名和密码,并在第二个

创建android项目,实现使用sharedpreferences保存输入的用户名和密码,并在第二个ac

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

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

  1. <EditText
  2. android:id="@+id/number"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:inputType="number" />
  6. <EditText
  7. android:id="@+id/password"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:inputType="textPassword" />
  11. <Button
  12. android:id="@+id/save"
  13. android:text="保存"
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content" />

获取取控件

  1. private EditText number;
  2. private EditText password;
  3. private Button save;
  4. number = (EditText) findViewById(R.id.number);
  5. password = (EditText) findViewById(R.id.password);
  6. save = (Button) findViewById(R.id.save);

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

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

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

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

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

  1. //获取info文件的内容,第一参数为保存时的key,第二个是如果获取不到的默认值
  2. String numberStr1 = sp.getString("number","");
  3. String passwordStr2 = sp.getString("password","");
  4. number.setText(numberStr1);
  5. 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)直接可以获得数据

 加密

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

  1. /**
  2. * 加密方法
  3. * @param str 要加密的字符串
  4. * @param key 加密的密匙
  5. * @return 返回加密后的字符串
  6. */
  7. public String encryptionString(String str, int key) {
  8. char[] chars = str.toCharArray();
  9. for (int i = 0; i < chars.length; i++) {
  10. chars[i] = (char) (chars[i] + key);
  11. }
  12. return String.valueOf(chars);
  13. }
  14. /**
  15. * 解密方法
  16. * @param str 要解密的字符串
  17. * @param key 解密的密匙,跟加密一样
  18. * @return 返回解密后的字符串
  19. */
  20. public String decodeString(String str, int key) {
  21. char[] chars = str.toCharArray();
  22. for (int i = 0; i < chars.length; i++) {
  23. chars[i] = (char) (chars[i] - key);
  24. }
  25. return String.valueOf(chars);
  26. }

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

  1. public static final int DECODE_ENCRYPTION_KEY = 64;
  2. String passwordStr = password.getText().toString().trim();
  3. //对密码进行加密
  4. passwordStr = encryptionString(passwordStr, DECODE_ENCRYPTION_KEY);
  5. editor.putString("password", passwordStr);

显示密码前要对密码解密

  1. public static final int DECODE_ENCRYPTION_KEY = 64;
  2. String passwordStr2 = sp.getString("password", "");
  3. //对密码进行解密
  4. passwordStr2 = decodeString(passwordStr2,DECODE_ENCRYPTION_KEY);
  5. password.setText(passwordStr2);

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

整个代码如下:

  1. import android.content.SharedPreferences;
  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.EditText;
  7. import android.widget.Toast;
  8. public class MainActivity extends AppCompatActivity {
  9. private EditText number;
  10. private EditText password;
  11. private Button save;
  12. private SharedPreferences sp;
  13. public static final int DECODE_ENCRYPTION_KEY = 64;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. number = (EditText) findViewById(R.id.number);
  19. password = (EditText) findViewById(R.id.password);
  20. save = (Button) findViewById(R.id.save);
  21. //第一参数为保存的文件名,第二个为保存的模型,当文件存在就读取,如果不存在就创建
  22. sp = getSharedPreferences("info", MODE_PRIVATE);
  23. //获取info文件的内容,第一参数为保存时的key,第二个是如果获取不到的默认值
  24. String numberStr1 = sp.getString("number", "");
  25. String passwordStr2 = sp.getString("password", "");
  26. //对密码进行解密
  27. passwordStr2 = decodeString(passwordStr2,DECODE_ENCRYPTION_KEY);
  28. password.setText(passwordStr2);
  29. number.setText(numberStr1);
  30. save.setOnClickListener(new View.OnClickListener() {
  31. @Override
  32. public void onClick(View v) {
  33. //获取输入框的账号和密码
  34. String numberStr = number.getText().toString().trim();
  35. String passwordStr = password.getText().toString().trim();
  36. //对密码进行加密
  37. passwordStr = encryptionString(passwordStr, DECODE_ENCRYPTION_KEY);
  38. //判断是否为空
  39. if (numberStr.isEmpty() || passwordStr.isEmpty()) {
  40. Toast.makeText(getApplicationContext(), "账号或密码不能为空", Toast.LENGTH_SHORT).show();
  41. } else {
  42. //获取Editor
  43. SharedPreferences.Editor editor = sp.edit();
  44. //输入内容
  45. editor.putString("number", numberStr);
  46. editor.putString("password", passwordStr);
  47. //必须提交才会生效,也可以使用apply
  48. editor.commit();
  49. Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();
  50. }
  51. }
  52. });
  53. }
  54. /**
  55. * 加密方法
  56. * @param str 要加密的字符串
  57. * @param key 加密的密匙
  58. * @return 返回加密后的字符串
  59. */
  60. public String encryptionString(String str, int key) {
  61. char[] chars = str.toCharArray();
  62. for (int i = 0; i < chars.length; i++) {
  63. chars[i] = (char) (chars[i] + key);
  64. }
  65. return String.valueOf(chars);
  66. }
  67. /**
  68. * 解密方法
  69. * @param str 要解密的字符串
  70. * @param key 解密的密匙,跟加密一样
  71. * @return 返回解密后的字符串
  72. */
  73. public String decodeString(String str, int key) {
  74. char[] chars = str.toCharArray();
  75. for (int i = 0; i < chars.length; i++) {
  76. chars[i] = (char) (chars[i] - key);
  77. }
  78. return String.valueOf(chars);
  79. }
  80. }

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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/499944
推荐阅读
相关标签
  

闽ICP备14008679号