1.写登录界面activity_main.xml
String.xml中代码如下:
login
Hello world!
Settings
请输入密码
请输入用户名
登录
记住我
2.在MainActivity.java中获取相应的值,注册点击事件
package com.etc.login;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
/*定义一个静态常量,在控制台中加入自定义的Filter,想要在控制台输出语句时,可以直接用Log.d("debug模式")
/Log.e("error模式")等模式输出,判断错误也较为方便
* Log.d(MYTAG, "点击了按钮"+name+","+pass);
* */
public static final String MYTAG = "mytag";
private Button btn;
private EditText tname;
private EditText tpass;
private CheckBox chk;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通过id获取一些输入框,按钮等元素
tname = (EditText) findViewById(R.id.tname);
tpass = (EditText) findViewById(R.id.tpass);
chk = (CheckBox) findViewById(R.id.chk);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);//按钮注册点击事件
//FileUtil.readFromFile(this,tname,tpass);//从文件中读取用户名和密码
//FileUtil.readFromSDCard(this, tname, tpass);//从sd卡中读取用户名和密码
//FileUtil.readFromFile2(this, tname, tpass);
FileUtil.readFromPre(this, tname, tpass);
}
//实现 了android.view.View中的OnClickListener接口,必须实现的方法
@Override
public void onClick(View v) {
//通过获取id来进行多个事件,此处只为按钮添加了判断登录事件
switch (v.getId()) {
case R.id.btn:
doLogin();//点击按钮时,做登录判断
break;
}
}
private void doLogin() {
//toString()不能少,getText()是一个EditText对象
String name = tname.getText().toString();
String pass = tpass.getText().toString();
Log.d(MYTAG, "点击了按钮"+name+","+pass);
//将输入框输入的用户名和密码保存到本地的文件中
if(chk.isChecked())//如果选中了"记住我"的多选框,就将用户名和密码保存,否则不保存
{
//FileUtil.saveToFile(this,name,pass);
//FileUtil.savtToSDCard(this,name,pass);
//FileUtil.saveToFile2(this, name, pass);
FileUtil.saveToPre(this, name, pass);
}
//登录完之后做一个提示,.show()不可少
Toast.makeText(this,"success",1000).show();
}
}
3.在封装的FileUtil.java类中写保存和读取的方法
package com.etc.login;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Environment;
import android.util.Log;
import android.widget.EditText;
public class FileUtil {
/**
* 第一种方法:
* 将输入的用户名和密码保存在这个应用的某个文件中
* @param context Activity的上面的某一层是Context,所以传值过来的是一个Activity,此处可以写成Context
* @param name 输入的用户名
* @param pass 输入的密码
*/
public static void saveToFile(Context context, String name, String pass) {
File dir = context.getFilesDir(); //查找这个应用下的所有文件所在的目录
FileWriter writer;
try {
writer = new FileWriter(dir.getAbsolutePath() + "/userinfo.txt");
writer.append(name + "," + pass);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 从这个应用下的文件中读取保存的用户名和密码,再次登录时自动显示在输入框中
* @param context
* @param tname
* @param tpass
*/
public static void readFromFile(Context context, EditText tname, EditText tpass) {
File dir = context.getFilesDir();//目录为:/data/data/com.etc.login/files
FileReader reader;
try {
reader = new FileReader(dir.getAbsolutePath() + "/userinfo.txt");
BufferedReader breader = new BufferedReader(reader);
String line = breader.readLine();
String strs[] = line.split(",");
tname.setText(strs[0]);
tpass.setText(strs[1]);
breader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 第二种方法:
* 将输入的用户名和密码保存到sdcard中
* @param context
* @param name
* @param pass
*/
public static void savtToSDCard(Context context, String name, String pass) {
File sdcardDir = Environment.getExternalStorageDirectory();
Log.d("mytag",sdcardDir.toString());//目录为:/storage/emulated/0
/**
* 但是使用cmd工具查找文件时,不再这个目录下,而是在/mnt/sdcard目录下
*
*/
FileWriter writer;
try {
writer = new FileWriter(sdcardDir.getAbsolutePath() + "/userinfo.txt");
writer.append(name + "," + pass);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 从sdcard中读取保存的用户名和密码
* @param context
* @param tname
* @param tpass
*/
public static void readFromSDCard(Context context, EditText tname, EditText tpass) {
File sdcardDir = Environment.getExternalStorageDirectory();
FileReader reader;
try {
reader = new FileReader(sdcardDir.getAbsolutePath() + "/userinfo.txt");
BufferedReader breader = new BufferedReader(reader);
String line = breader.readLine();
String strs[] = line.split(",");
tname.setText(strs[0]);
tpass.setText(strs[1]);
breader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 第三种方法:
* 使用文件api进行保存用户名和密码,不必得到对应的目录
* @param context
* @param name
* @param pass
*/
public static void saveToFile2(Context context, String name, String pass) {
try {
FileOutputStream out = context.openFileOutput("userinfo2.txt",context.MODE_PRIVATE);
OutputStreamWriter writer = new OutputStreamWriter(out);
writer.append(name+","+pass);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 使用文件api进行读取保存的用户名和密码
* @param context
* @param tname
* @param tpass
*/
public static void readFromFile2(Context context, EditText tname, EditText tpass) {
try {
FileInputStream in = context.openFileInput("userinfo2.txt");
InputStreamReader reader = new InputStreamReader(in);
BufferedReader breader = new BufferedReader(reader);
String line = breader.readLine();
String strs[] = line.split(",");
tname.setText(strs[0]);
tpass.setText(strs[1]);
breader.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 最为通用的第四种方法:
* 使用SharedPreference进行保存用户名和密码,可以实现拆分,不必手动的以,为分隔符进行拆分,
* 如果用,进行拆分,那么一旦用户登录的时候输入了,号,程序就会出错,现在以Map的形式保存用户名和密码,
* 就不用再担心这个问题
* @param context
* @param name
* @param pass
*/
public static void saveToPre(Context context, String name, String pass) {
SharedPreferences sharedPreferences = context.getSharedPreferences("userinfo",context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();
editor.putString("name",name);
editor.putString("pass",pass);
editor.commit();
}
/**
* 使用SharedPreference进行读取保存的用户名和密码
* @param context
* @param tname
* @param tpass
*/
public static void readFromPre(Context context, EditText tname, EditText tpass) {
SharedPreferences sharedPreferences = context.getSharedPreferences("userinfo",context.MODE_PRIVATE);
String name = sharedPreferences.getString("name","");
String pass = sharedPreferences.getString("pass","");
tname.setText(name);
tpass.setText(pass);
}
}
利用cmd工具,adb命令读取保存的用户名和密码
首先要配置安卓的环境,ANDROID_HOME-->sdk所在的目录 -->F:\Anroid Software\sdk-19\sdk-19\sdk
然后在path的环境变量后面加入:;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;
最后将sdk目录下的platform-tools下的adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll文件复制到tools目录下
然后在任意一个盘下都可以直接写adb命令,而不需要转到sdk所在的目录下,才能使用adb命令。
C:Users\Administrator>adb shell
root@android:/ # cd data/data/com.etc.login 到达com.etc.login目录下
cd data/data/com.etc.login
root@android:/data/data/com.etc.login #cd files 到达files目录下
cd files
root@android:/data/data/com.etc.login/files #ll 显示这个目录下的所有文件
ll
-rw------- u0a36 u0a36 7 2016-08-02 08:03 userinfo.txt
root@android:/data/data/com.etc.login/files #cat userinfo.txt 显示这个文件的内容
cat userinfo.txt
aa,bb12root@android:/data/data/com.etc.login/files # (Ctrl+C退出)
C:\Users\Administrator>adb pull /data/data/com.etc.login/files/userinfo.txt 将文件拉出来
2KB/s (7bytes in 0.229s)
C:\Users\Administrator>explorer . 显示文件所在的目录
之后便会自动弹出这个文件所在的文件夹处,可以看到userinfo.txt,用记事本打开,可以看到所保存的用户名和密码
C:Users\Administrator>adb shell
root@android:/ # cd /storage
cd /storage
root@android:/storage #ll
ll
dr-xr-xr-x root root 2016-08-02 08:50 emulated
lrwxrwxrwx root root 2016-08-02 08:50 sdcard0->/storage/emulated/legacy
root@android:/storage #cd emulated
cd emulated
root@android:/storage/emulated # ll
ll
lrwxrwxrwx root root 016-08-02 08:50 sdcard0->/mnt.shell/emulated/0
root@android:/storage/emulated # cd 0 //刚开始,想要到/storage/emulated/0目录下查找userinfo.txt文件,发现一直找不到,于是到他的映射目录下去查找
cd 0
/system/bin/sh:cd /storage/emulated/0:No such file or directory
root@android:/storage/emulated #cd /mnt
cd /mnt
root@android:/mnt #ll
ll
d--------- system system 2016-08-02 08:50 USB
lrwxrwxrwx root root 2016-08-02 08:50 sdcard-->/storage/emulated/legacy
root@android:/mnt #cd sdcard
cd sdcard
root@android:/mnt/sdcard #ll
ll
-rw-rw---- root root sdcard_r 9 2016-08-02 09:11 userinfo.txt //最终在/mnt/sdcard目录下找到userinfo.txt文件
root@android:/mnt/sdcard # cat userinfo.txt
cat userinfo.txt
aa12,bb12root@android:/mnt/sdcard