1. 程式人生 > >_037_Android_Android 儲存到SD卡,獲取SD的大小及可用空間

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