使用Sdcard注意事项:
1.权限问题:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.硬性编码问题:通过 Environment可以获取sdcard的路径
Environment.getExternalStorageDirectory().getPath();
3.使用前需要判断sdcard状态
if(!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)){
//sdcard状态是没有挂载的情况
Toast.makeText(mContext, "sdcard不存在或未挂载", Toast.LENGTH_SHORT).show();
return ;
}
4.需要判断sdcard剩余空间
//判断sdcard存储空间是否满足文件的存储
File sdcard_filedir = Environment.getExternalStorageDirectory();//得到sdcard的目录作为一个文件对象
long usableSpace = sdcard_filedir.getUsableSpace();//获取文件目录对象剩余空间
long totalSpace = sdcard_filedir.getTotalSpace();
//将一个long类型的文件大小格式化成用户可以看懂的M,G字符串
String usableSpace_str = Formatter.formatFileSize(mContext, usableSpace);
String totalSpace_str = Formatter.formatFileSize(mContext, totalSpace);
if(usableSpace < 1024 * 1024 * 200){//判断剩余空间是否小于200M
Toast.makeText(mContext, "sdcard剩余空间不足,无法满足下载;剩余空间为:"+usableSpace_str, Toast.LENGTH_SHORT).show();
return ;
}
/data/data: context.getFileDir().getPath();
是一个应用程序的私有目录,只有当前应用程序有权限访问读写,其他应用无权限访问。一些安全性要求比较高的数据存放在该目录,一般用来存放size比较小的数据。
/sdcard: Enviroment.getExternalStorageDirectory().getPath();
是一个外部存储目录,只用应用声明了<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>的一个权限,就可以访问读写sdcard目录;所以一般用来存放一些安全性不高的数据,文件size比较大的数据。
public class MainActivity extends AppCompatActivity {
private Button loginBtn;
private EditText userNameET;
private EditText passwordET;
private CheckBox rememberCB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
loginBtn=findViewById(R.id.loginBtn);
userNameET=findViewById(R.id.userNameET);
passwordET=findViewById(R.id.passwordET);
rememberCB=findViewById(R.id.rememberCB);
/*将数据存储到sd卡中,需要判断sd卡的状态,
只有在sd卡是否处于挂载的状态下,再去在sd卡中读数据或者写数据*/
/* File file = new File("/mnt/sdcard/info.txt");*/
File file = new File(Environment.getExternalStorageDirectory(),"info.txt");
if(file.exists()&&file.length()>0){
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String s = reader.readLine();
String[] split = s.split("#");
userNameET.setText(split[0]);
passwordET.setText(split[1]);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
loginBtn.setOnClickListener(new MyOnClickListener());
}
//登录的方法
public void login(){
String userName = userNameET.getText().toString().trim();
String password = passwordET.getText().toString().trim();
//判断是否已经输入了用户名和密码
if(TextUtils.isEmpty(userName)||TextUtils.isEmpty(password)){
Toast.makeText(this,"请输入qq号码和密码",Toast.LENGTH_SHORT).show();
return;
}
//判断是否已经勾选了checkbox,如果已经勾选了则保存userName和password
boolean checked = rememberCB.isChecked();
if(checked){
/*将数据存储到sd卡中,需要判断sd卡的状态,
只有在sd卡是否处于挂载的状态下,再去在sd卡中读数据或者写数据*/
//保存数据
OutputStream os = null;
//这里的state就是动态返回的的sd卡的状态
String state = Environment.getExternalStorageState();
try {
if(Environment.MEDIA_MOUNTED.equals(state)){
//返回可用的空闲的空间大小(单位byte)
long freeSpace = Environment.getExternalStorageDirectory().getFreeSpace();
String s = Formatter.formatFileSize(this, freeSpace);
Toast.makeText(this,"存储空间:"+s,Toast.LENGTH_SHORT).show();
/* File file = new File("/mnt/sdcard/info.txt");*/
File file = new File(Environment.getExternalStorageDirectory(),"info.txt");
if(freeSpace>file.length()){
os = new FileOutputStream(file);
String value=userName+"#"+password;
os.write(value.getBytes());
System.out.println("hello");
Toast.makeText(this,"勾选了,保存成功!",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"存储空间不足!",Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(this,"没有sd卡!",Toast.LENGTH_SHORT).show();
return;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}else{
Toast.makeText(this,"未勾选",Toast.LENGTH_SHORT).show();
}
}
private class MyOnClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
int id = v.getId();
if(id==R.id.loginBtn){
login();
}
}
}
}