代码:
<?xml version="1.0"?> -<LinearLayout android:paddingTop="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:orientation="vertical" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"> <EditText android:id="@+id/et_username" android:layout_height="wrap_content" android:layout_width="fill_parent" android:hint="@string/input_username"/> <EditText android:id="@+id/et_password" android:layout_height="wrap_content" android:layout_width="fill_parent" android:hint="@string/input_password" android:inputType="textPassword" android:layout_marginBottom="10dp" android:layout_marginTop="10dp"/> -<RelativeLayout android:layout_height="wrap_content" android:layout_width="fill_parent"> <CheckBox android:id="@+id/cb_rem" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/rem_password" android:layout_alignParentLeft="true" android:layout_centerVertical="true"/> <Button android:id="@+id/bt_login" android:paddingRight="50dp" android:paddingLeft="50dp" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/login" android:layout_centerVertical="true" android:layout_alignParentRight="true"/> </RelativeLayout> </LinearLayout>
java代码
1 package com.itheima.login; 2 3 import java.io.File; 4 import java.util.Map; 5 6 import android.annotation.SuppressLint; 7 import android.app.Activity; 8 import android.content.Context; 9 import android.os.Build; 10 import android.os.Bundle; 11 import android.os.Environment; 12 import android.text.TextUtils; 13 import android.text.format.Formatter; 14 import android.view.View; 15 import android.view.View.OnClickListener; 16 import android.widget.Button; 17 import android.widget.CheckBox; 18 import android.widget.EditText; 19 import android.widget.Toast; 20 21 import com.itheima.login.util.UserInfoUtil; 22 import com.itheima.login_sdcard.R; 23 24 public class MainActivity extends Activity implements OnClickListener{ 25 26 private EditText et_username; 27 private EditText et_password; 28 private CheckBox cb_rem; 29 private Button bt_login; 30 private Context mContext; 31 32 @Override 33 protected void onCreate(Bundle savedInstanceState) { 34 super.onCreate(savedInstanceState); 35 setContentView(R.layout.activity_main); 36 mContext = this; 37 et_username = (EditText) findViewById(R.id.et_username); 38 et_password = (EditText) findViewById(R.id.et_password); 39 cb_rem = (CheckBox) findViewById(R.id.cb_rem); 40 bt_login = (Button) findViewById(R.id.bt_login); 41 //b.设置按钮的点击事件 42 bt_login.setOnClickListener(this); 43 44 45 //f.回显用户名密码 ?? 46 Map<String, String> map = UserInfoUtil.getUserInfo(mContext);//获取用户名密码 47 if(map != null){ 48 String username = map.get("username"); 49 String password = map.get("password"); 50 et_username.setText(username);//设置用户名 51 et_password.setText(password); 52 cb_rem.setChecked(true);//设置复选框选中状态 53 } 54 55 } 56 57 @SuppressLint("NewApi") 58 private void login(){ 59 60 //c.在onclick方法中,获取用户输入的用户名密码和是否记住密码 61 62 String username = et_username.getText().toString().trim(); 63 String password = et_password.getText().toString().trim(); 64 boolean isrem = cb_rem.isChecked(); 65 //d.判断用户名密码是否为空,不为空请求服务器(省略,默认请求成功) 66 if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){ 67 Toast.makeText(mContext, "用户名密码不能为空", Toast.LENGTH_SHORT).show(); 68 return ; 69 } 70 71 //请求服务器,后面讲。。。。。。。。。。 72 73 //e.判断是否记住密码,如果记住,将用户名密码保存本地。???? 74 if(isrem){ 75 76 //判断Sdcard状态是否正常 77 if(!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)){ 78 //sdcard状态是没有挂载的情况 79 Toast.makeText(mContext, "sdcard不存在或未挂载", Toast.LENGTH_SHORT).show(); 80 return ; 81 } 82 83 84 //判断sdcard存储空间是否满足文件的存储 85 File sdcard_filedir = Environment.getExternalStorageDirectory();//得到sdcard的目录作为一个文件对象 86 long usableSpace = sdcard_filedir.getUsableSpace();//获取文件目录对象剩余空间 87 long totalSpace = sdcard_filedir.getTotalSpace(); 88 //将一个long类型的文件大小格式化成用户可以看懂的M,G字符串 89 String usableSpace_str = Formatter.formatFileSize(mContext, usableSpace); 90 String totalSpace_str = Formatter.formatFileSize(mContext, totalSpace); 91 if(usableSpace < 1024 * 1024 * 200){//判断剩余空间是否小于200M 92 Toast.makeText(mContext, "sdcard剩余空间不足,无法满足下载;剩余空间为:"+usableSpace_str, Toast.LENGTH_SHORT).show(); 93 return ; 94 } 95 96 boolean result = UserInfoUtil.saveUserInfo(mContext,username,password); 97 if(result){ 98 Toast.makeText(mContext, "用户名密码保存成功", Toast.LENGTH_SHORT).show(); 99 }else{ 100 Toast.makeText(mContext, "用户名密码保存失败", Toast.LENGTH_SHORT).show(); 101 } 102 103 }else{ 104 Toast.makeText(mContext, "无需保存", Toast.LENGTH_SHORT).show(); 105 } 106 107 108 109 } 110 111 @Override 112 public void onClick(View v) { 113 switch (v.getId()) { 114 case R.id.bt_login: 115 login(); 116 break; 117 118 default: 119 break; 120 } 121 } 122 123 124 }
里面包的代码:
1 package com.itheima.login.util; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.InputStreamReader; 8 import java.util.HashMap; 9 import java.util.Map; 10 11 import android.content.Context; 12 import android.os.Environment; 13 14 public class UserInfoUtil { 15 //保存用户名密码 16 public static boolean saveUserInfo(Context context,String username, String password) { 17 18 try{ 19 String userinfo = username + "##"+ password;//封装用户名密码 20 // String path = "/mnt/sdcard/";//指定保存的路径 21 //通过Environment获取sdcard的目录 22 String path = Environment.getExternalStorageDirectory().getPath(); 23 24 System.out.println("...............:"+path); 25 File file = new File(path,"userinfo.txt");//创建file 26 FileOutputStream fileOutputStream = new FileOutputStream(file);//创建文件写入流 27 fileOutputStream.write(userinfo.getBytes());//将用户名密码写入文件 28 fileOutputStream.close(); 29 return true; 30 }catch (Exception e) { 31 e.printStackTrace(); 32 } 33 34 return false; 35 } 36 37 //获取用户名密码 38 public static Map<String ,String> getUserInfo(Context context){ 39 40 try{ 41 //通过Environment获取sdcard的目录 42 String path = Environment.getExternalStorageDirectory().getPath(); 43 44 System.out.println("...............:"+path); 45 File file = new File(path,"userinfo.txt");//创建file 46 FileInputStream fileInputStream = new FileInputStream(file); 47 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); 48 //读取一行中包含用户密码,需要解析 49 String readLine = bufferedReader.readLine(); 50 String[] split = readLine.split("##"); 51 HashMap<String, String> hashMap = new HashMap<String ,String>(); 52 hashMap.put("username", split[0]); 53 hashMap.put("password", split[1]); 54 bufferedReader.close(); 55 fileInputStream.close(); 56 return hashMap; 57 58 }catch (Exception e) { 59 e.printStackTrace(); 60 } 61 return null; 62 63 } 64 65 }
*在sd卡中存储 我的笔记
1.如何新赋值一个项目呢?
2.在res的string处修改app的名字
3.studio如何修改包名呢?eclipse在 android tools里面的Rename application package里面修改的
4.修改sd卡路径时,会报黄,怎么办,在清单里面修改用户权限
5.与上面一样,获得私有目录也是靠方法,但最后都要getpath()
6.可以考打印,知道是那个目录,真的是这个目录,打印看真实,还是很有用的
7.在开发文档搜,Evironment ,会有这两个方法
8.我们还需要sd卡存不存在,如果不存在,就不需要弄了,也就是说,我们需要判断sd卡的状态
9.那我们在哪里添加sd卡状态的判断呢?
我们用这个功能是保存数据,那么这个判断当然是在保存数据的前面判断了
1.判断sd开的状态,用到equals方法,E.gES与那个EM里面的属性比较,相等。sd卡就登陆,就存在
2.判断剩余空间是否满足存储
3.调用其中一个方法时,可能要@加上新的注解
4.1M1024*1024
5. //获得sd卡总空间的大小
long total = file.getTotalSpace();
//转换数据大小的数据单位,让我们能看懂
String totalSize = Formatter.formatFileSize(this, total);
//获得sd卡剩余空间的大小
long usable = file.getUsableSpace();
String usableSize = Formatter.formatFileSize(this, usable);
*/
10.两种存储方法的优略
1.私有路径,安全 缺:不能存太大的数据
2.sd卡,只能不安全的数据,不能存密码 优点:多大都可以存
/*老师笔记
存储到SD卡(重点)
异常信息:
09-21 23:25:32.068: W/System.err(24718): java.io.FileNotFoundException: /storage/sdcard/info.txt: open failed: EACCES (Permission denied)
步骤:
1、 在SD卡上创建一个文件,
2、创建一个输出流往sd卡上写数据
String data = "dsfdsae";
File file = new File(Environment.getExternalStorageDirectory(), "info.txt");
FileOutputStream fos = new FileOutputStream(file);
fos.write(data.getBytes());
fos.close();
3、在清单文件中添加访问SD卡的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
#7.获取SD的大小及可用空间
//获得sd卡的目录对象
File file = Environment.getExternalStorageDirectory();
//获得sd卡总空间的大小
long total = file.getTotalSpace();
//转换数据大小的数据单位
String totalSize = Formatter.formatFileSize(this, total);
//获得sd卡剩余空间的大小
long usable = file.getUsableSpace();
String usableSize = Formatter.formatFileSize(this, usable);
tv.setText(usableSize+"/"+totalSize);
*/