1. 保存数据到手机内存
因为直接保存到手机内存的app所在包下,所以不需要权限
主要的思路:
1、把EditText的内容取出来
2、把内容放在内存中,文件路径file为(app的包下,两种都可以,第一种是写死了,包名一改就会出错,第二种是动态获取包名):
"/data/data/com.zhansy.myonclick/user.txt"//com.zhansy.myonclick为包名
this.getFilesDir();// /data/data/包名/files
3、在oncreate中判断是否有上次保存的信息,有则显示出来
注:用到Map<String,String>,.put参数对应的key值与需要保存的内容,然后直接get它的key就可以取到内容
//getString(“number”,null);/number为key值
mainActivity:
package com.zhansy.myonclick;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Map;
public class MainActivity extends Activity implements View.OnClickListener{
private EditText editqq;
private EditText editpsw;
private CheckBox checkBox;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editqq = (EditText) findViewById(R.id.et_qq);
editpsw = (EditText) findViewById(R.id.et_psw);
checkBox = (CheckBox) findViewById(R.id.cb_psw);
btn = (Button) findViewById(R.id.btn_login);
btn.setOnClickListener(this);
//回显数据,当手机内存中存在用户登录信息时,显示出来
Map<String,String> userInfoMap = UserInfo.getUserInfo(this);
if (userInfoMap != null) {
editqq.setText(userInfoMap.get("number"));
editpsw.setText(userInfoMap.get("password"));
}
}
@Override
public void onClick(View view) {
//执行登陆操作
//1、取出号码和密码
String qq = editqq.getText().toString();//获得编辑框的QQ号码
String psw = editpsw.getText().toString();//获得编辑框的QQ密码
if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(psw)) {
Toast.makeText(this, "请正确输入账号密码", Toast.LENGTH_LONG).show();
return;
}
//2、判断记住密码是否被选中
if (checkBox.isChecked()) {
Log.e("记住密码", "账号为" + qq + "密码为" + psw);
boolean isSuccess = UserInfo.saveUserInfo(this,qq, psw);
if (isSuccess) {
Toast.makeText(this, "保存成功", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, "保存失败", Toast.LENGTH_LONG).show();
}
}
//3、登陆成功
Toast.makeText(this, "登陆成功", Toast.LENGTH_LONG).show();
}
}
保存用户信息的类:
package com.zhansy.myonclick;
import android.content.Context;
import android.text.TextUtils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Administrator on 2015/8/14.
*/
public class UserInfo {
/**
* 保存用户信息
*
* @param qq
* @param psw
* @return true 成功
*/
public static boolean saveUserInfo(Context context,String qq, String psw) {
try {
//this.getFilesDir(); // /data/data/包名/files
// String path = "/data/data/com.zhansy.myonclick/user.txt";
File fileDir = context.getFilesDir();
File path = new File(fileDir, "user.txt");
FileOutputStream fos = new FileOutputStream(path);
//用##分割开
String data = qq + "##" + psw;
fos.write(data.getBytes());
fos.flush();//刷新字符流
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static Map<String, String> getUserInfo(Context context) {
try {
// String path = "/data/data/com.zhansy.myonclick/user.txt";
File fileDir = context.getFilesDir();
File path = new File(fileDir, "user.txt");
//inputstream是一个一个字节读取的,每次读取都会执行一次IO,我们知道IO操作都是非常耗时的
FileInputStream fis = new FileInputStream(path);
//从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
String text = reader.readLine();//一行一行读取
if (!TextUtils.isEmpty(text)) {//不为空时,取内容出来,TextUtils.isEmpty如果参数为空,也是传回来false
String[] split = text.split("##");
Map<String, String> userInfoMap = new HashMap<String, String>();
userInfoMap.put("number", split[0]);
userInfoMap.put("password", split[1]);
return userInfoMap;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
布局文件xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<EditText
android:id="@+id/et_qq"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:layout_marginLeft="20dp"
android:hint="QQ号" />
<EditText
android:id="@+id/et_psw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:layout_marginLeft="20dp"
android:hint="密码" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cb_psw"
android:text="记住密码"/>
<Button
android:id="@+id/btn_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登陆" />
</LinearLayout>
2、当用户想保存在SD卡时:
把上面的UserInfo类中的两处改一句话:
//保存在手机内存中
File fileDir = context.getFilesDir();
//保存在sd卡
//File fileDir = Environment.getExternalStorageDirectory();
//我们用sd卡前可以先判断一下当前手机是否有sd卡:
//判断当前手机是否有sd卡
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
//已经挂载了sd卡
return false;
}
//保存在sd卡
File fileDir = Environment.getExternalStorageDirectory();
最后加一个读内存卡的权限:
<!--写入SD卡的权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
3、把数据存到SharedPreferences
//路径:/data/data/包名/share_prefs/user
SharedPreferences sp = context.getSharedPreferences("user", context.MODE_PRIVATE);//(文件名,权限)
//获得一个编辑对象
SharedPreferences.Editor editor = sp.edit();
///存数据
editor.putString("number", qq);//取数据就是getString("number",null);可以创建HashMap对象,把数据传出去
editor.putString("password", psw);
//提交,数据真正存储起来
editor.commit();