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