android--登录例子,保存用户名和密码到这个应用所在文件中,从文件中读取用户名和密码

     登录例子,保存用户名和密码到这个应用所在文件中,从文件中读取用户名和密码

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



你可能感兴趣的:(Android)