此文乃是轉載,原文在這裡連結
SD卡作為手機的擴充儲存設備,在手機中充當硬碟角色,可以讓我們手機存放更多的資料以及多媒體等大體積檔案。是以檢視SD卡的記憶體就跟我們檢視硬碟的剩餘空間一樣,是我們經常操作的一件事,那麼在Android開發中,我們如何能擷取SD卡的記憶體容量呢?
1、判斷手機是否插入SD卡
Java代碼
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
doSth();
//....
}
2、然後才能操作SD卡
File path = Environment.getExternalStorageDirectory();
這個PATH就是你要操作的路徑,當然你在操作的時候最好對SD卡的使用做個檢測判斷,當SD卡有存儲空間時才可以進行存儲操作。
StatFs statfs =newStatFs(path.getPath());
擷取BLOCK的SIZE
longblocSize = statfs.getBlockSize();
擷取BLOCK數量
longtotalBlocks = statfs.getBlockCount()
空閑的Block的數量
longavailaBlock = statfs.getAvailableBlocks();
最後别忘了,要擷取SD卡上面的資訊,必須先對SD卡有通路的權限,是以最後一件事就是需要添加通路擴充裝置的權限,更多權限請通路:Android 應用程式開發權限一覽表。
XML/HTML代碼
android:name="android.permission.WRITE_EXTERNAL_STORAGE">
2、獲得SD卡目錄
sdCardDir = Environment.getExternalStorageDirectory();//擷取SDCard目錄
3、寫入檔案
File f = Environment.getExternalStorageDirectory();//擷取SD卡目錄
File fileDir =newFile(f,"test.txt");
FileOutputStream os =newFileOutputStream(fileDir);
try{
os.write(text.getBytes());
os.close();
showToast("儲存到SD卡中");
}catch(IOException
e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
4、讀取檔案
File f = Environment.getExternalStorageDirectory();//擷取SD卡目錄
File fileDir =newFile(f,"test.txt");
is =newFileInputStream(fileDir);
ByteArrayOutputStream bos =newByteArrayOutputStream();
byte[] array =newbyte[1024];
intlen = -1;
while(
(len = is.read(array)) != -1){
bos.write(array,0,len);
}
bos.close();
is.close();
returnbos.toString();
5、讀取權限
在AndroidManifest.xml中加入通路SDCard的權限如下:
要往SDCard存放檔案,程式必須先判斷手機是否裝有SDCard,并且可以進行讀寫。
6、其它方法
getCacheDir()方法用于擷取/data/data//cache目錄。
getFilesDir()方法用于擷取/data/data//files目錄。
其實就是普通的檔案操作,不過還是有些地方需要注意。比如:
1.加入sdcard操作權限;
2.确認sdcard的存在;
3.不能直接在非sdcard的根目錄建立檔案,而是需要先建立目錄,再建立檔案;
在AndroidManifest.xml添加sdcard操作權限
變量聲明:
private final static String PATH = "/sdcard/digu";
private final static String FILENAME = "/notes.txt";
向sdcard寫檔案
private void onWrite() {
try {
Log.d(LOG_TAG, "Start Write");
//1.判斷是否存在sdcard
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
//目錄
File path = new File(PATH);
//檔案
File f = new File(PATH + FILENAME);
if(!path.exists()){
//2.建立目錄,可以在應用啟動的時候建立
path.mkdirs();
}
if (!f.exists()) {
//3.建立檔案
f.createNewFile();
}
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream(f));
//4.寫檔案,從EditView獲得文本值
osw.write(editor.getText().toString());
osw.close();
}
} catch (Exception e) {
Log.d(LOG_TAG, "file create error");
}
}
接着我們在使用SDcard進行讀寫的時候 會用到Environment類下面的幾個靜态方法
1: getDataDirectory() 擷取到Androi中的data資料目錄
2:getDownloadCacheDirectory() 擷取到下載下傳的緩存目錄
4:getExternalStorageState() 擷取外部設定的目前狀态 一般指SDcard,
android系統中對于外部設定的狀态,我們比較常用的應該是MEDIA_MOUNTED(SDcard存在并且可以進行讀寫)MEDIA_MOUNTED_READ_ONLY(SDcard存在,隻可以進行讀操作) 當然還有其他的一些狀态,可以在文檔中進行查找到
5:getRootDirectory() 擷取到Android Root路徑
6:isExternalStorageEmulated() 傳回Boolean值判斷外部設定是否有效
7:isExternalStorageRemovable() 傳回Boolean值,判斷外部設定是否可以移除
【注】上面進行紅色标記的方法,我們會常用
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 代碼中這句:我們對SDcard的狀态進行判斷,
下面看實作SDCard進行檔案讀寫操作的Demo:
packagecom.jiangqq.sdcard;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
publicclassSDcardActivityextendsActivity {
privateButton bt1, bt2;
privateEditText et1, et2;
privatestaticfinalString FILENAME = "temp_file.txt";
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt1 = (Button)this.findViewById(R.id.bt1);
bt2 = (Button)this.findViewById(R.id.bt2);
et1 = (EditText)this.findViewById(R.id.et1);
et2 = (EditText)this.findViewById(R.id.et2);
bt1.setOnClickListener(newMySetOnClickListener());
bt2.setOnClickListener(newMySetOnClickListener());
}
privateclassMySetOnClickListenerimplementsOnClickListener {
@Override
publicvoidonClick(View v) {
File file =newFile(Environment.getExternalStorageDirectory(),
FILENAME);
switch(v.getId()) {
caseR.id.bt1://使用SDcard寫操作
if(Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
try{
FileOutputStream fos =newFileOutputStream(file);
fos.write(et1.getText().toString().getBytes());
fos.close();
Toast.makeText(SDcardActivity.this, "寫入檔案成功",
Toast.LENGTH_LONG).show();
}catch(Exception e) {
Toast.makeText(SDcardActivity.this, "寫入檔案失敗",
Toast.LENGTH_SHORT).show();
}