SharedPreferences存储源码(QQlogin2):https://github.com/liuchenyang0515/QQlogin2
文件存储源码(QQlogin):https://github.com/liuchenyang0515/QQlogin
界面如下:
MainActivity.java
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
/**
* 定义一个共享参数(存放数据方便的api)
*/
private SharedPreferences sp;
private String TAG = "MainActivity";
private EditText et_qqnumber;
private EditText et_passwd;
private CheckBox cb_remember;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_qqnumber = (EditText) findViewById(R.id.et_qqnumber);
et_passwd = (EditText) findViewById(R.id.et_passwd);
cb_remember = (CheckBox) findViewById(R.id.cb_remember);
sp = this.getSharedPreferences("config", MODE_PRIVATE);
restoreInfo();
}
/**
* 根据原来保存的文件信息,把QQ号码和密码信息显示到界面
*/
private void restoreInfo() {
String qq = sp.getString("qq", "");
String passwd = sp.getString("passwd", "");
boolean isRemember = sp.getBoolean("remember", false);
Log.d(TAG, "qq:" + qq);
Log.d(TAG, "passwd:" + passwd);
et_qqnumber.setText(qq);
et_passwd.setText(passwd);
cb_remember.setChecked(isRemember); // 恢复时也把记住密码的勾选上
}
/**
* 登录按钮的点击事件
*
* @param view
*/
public void login(View view) {
String qq = et_qqnumber.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(passwd)) {
Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
return;
} else {
// 登录操作,模拟登陆,数据应该提交给服务器比较是否正确
if ("10000".equals(qq) && "123456".equals(passwd)) {
// 是否需要记住密码
// 将数据保存到sp文件中
SharedPreferences.Editor edit = sp.edit();
if (cb_remember.isChecked()) {
edit.putString("qq", qq);
edit.putString("passwd", passwd);
edit.putBoolean("remember", true);
} else {
edit.clear(); // 没有勾选记住密码就清空SharedPreferences文件数据
}
edit.apply(); // 提交数据,类似于关闭流,事务
Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show();
}
}
}
}
xml文件参考如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@drawable/qq" />
<EditText
android:id="@+id/et_qqnumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="请输入QQ号码"
android:inputType="number"
android:selectAllOnFocus="false" />
<EditText
android:id="@+id/et_passwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="请输入QQ密码"
android:inputType="textPassword" />
<CheckBox
android:id="@+id/cb_remember"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="记住密码" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="login"
android:text="登录" />
</LinearLayout>
存储config.xml如下:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity {
private EditText et_qqnumber;
private EditText et_passwd;
private CheckBox cb_remember;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_qqnumber = (EditText) findViewById(R.id.et_qqnumber);
et_passwd = (EditText) findViewById(R.id.et_passwd);
cb_remember = (CheckBox) findViewById(R.id.cb_remember);
restoreInfo();
}
/**
* 根据原来保存的文件信息,把QQ号码和密码信息显示到界面
*/
private void restoreInfo() {
// File file = new File(this.getFilesDir(), "info.txt");
// 用openFileInput就不需要判断file.exists() && file.length() > 0了
// 函数封装会处理的
// 自动关流写法要jdk1.7及以上
try (//FileInputStream fis = new FileInputStream(file);
FileInputStream fis = openFileInput("info.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis));) {
String line = br.readLine();
if (line != null){
String[] info = line.split("##");
String qq = info[0];
String pwd = info[1];
et_qqnumber.setText(qq);
et_qqnumber.setSelection(qq.length());
et_passwd.setText(pwd);
cb_remember.setChecked(true);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 登录按钮的点击事件
*
* @param view
*/
public void login(View view) {
String qq = et_qqnumber.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(passwd)) {
Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
return;
} else {
// 是否需要记住密码
try (
//FileOutputStream fos = new FileOutputStream(new File(this.getFilesDir(), "info.txt"));
FileOutputStream fos = openFileOutput("info.txt", MODE_PRIVATE);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos));) {
// 登录操作,模拟登陆,数据应该提交给服务器比较是否正确
if ("10000".equals(qq) && "123456".equals(passwd)) {
Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
if (cb_remember.isChecked()) {
// 被选中状态,需要记住密码
String info = qq + "##" + passwd;
//fos.write(info.getBytes());
writer.write(info);
} else {
writer.write(""); // 空文件
}
} else {
Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
笔记批注:如果想要修改文件的权限的话,可以进入到相应的目录,然后例如:chmod 777 private.txt就可以把权限改为
-rwxrwxrwx,每一个权限组都是3位2进制数。
更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》
1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路
敲代码不易,关注一下吧。?( ′・?・` ) 🤔