_037_Android_Android 存储到SD卡,获取SD的大小及可用空间

 使用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();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/poiuyppp/article/details/83717196