Android外部儲存空間通常比較大像是SD卡
需要WRITE_EXTERNAL_STORAGE的權限
和Internel其實很像只是位置不同
只要記得private的是在/storage/SD卡名稱/Android/dara/package名稱/files/指定的資料夾
而使用方是就和Java ioㄧ樣
1. 先到官網http://developer.android.com/training/basics/data-storage/files.html
外部儲存空間的幾種狀況
a. 有可能會被移除, 像是拔掉SD卡
b. 在不被你控制下被讀取, 像是拔掉SD卡
然後再分析裡面的內容
c. 當放在public的空間內, 移除app並不會把資料刪掉
2. 而其中又分成兩種
a. Publuc files : 可以被其他使用者或app看到, 移除app時資料不會被移除
b. Private files : 不能被其他使用者或app看到, 移除app時資料會被移除
3. 首先要宣告權限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4. 接著介紹幾種儲存位置
//private 會一起被砍掉
Log.d("TAG", "Path = " + getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS));
//public 不會一起被砍掉
Log.d("TAG", "Path = " + Environment.getExternalStorageDirectory());
//public 不會一起被砍掉
Log.d("TAG", "Path = " + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
getExternalFilesDir 是指向private的External空間
位置是/storage/SD卡名稱/Android/dara/package名稱/files/指定的資料夾
再來
Environment.getExternalStorageDirectory() 是取得public的External空間的根目錄
位置是/storage/SD卡名稱
最後
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
是取得是取得public的External空間的預設資料夾的目錄
位置是/storage/SD卡名稱/指定的資料夾
5.模擬器的相對位置
/storage/emulated/0/Android/dara/package名稱/files/指定的資料夾
/storage/emulated/0/指定的資料夾
/storage/emulated/0/指定的資料夾
6. 用法就跟一般java io一樣
try {
File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "TEST.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("TEST CONTENT".getBytes());
fileOutputStream.close();
} catch (java.io.IOException e) {
e.printStackTrace();
}
7. 以下是private的位置
8. 以下是public的位置
9. 最後如果寫入成功卻無法看到檔案
通常是因為資料夾並無即時更新
所以要強制它重新掃描一次
範例如下:
MediaScannerConnection.scanFile(this,
new String[]{Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString()}
, null, null);