Android 4.4 之前,儲存空間:
Android 4.4 之後,儲存空間:
檢查外部儲存:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
for (File file : files) {
logger.error("main " + String.valueOf(file));
}
}
輸出
手機本身的外部儲存
/storage/emulated/0/Android/data/packname/files/mounted
外插 SD card 的外部儲存
/storage/B3E4-1711/Android/data/packname/files/mounted
/data
開頭的目錄,為內部儲存
/storage
開頭的目錄,為外部儲存
/system
開頭的目錄,存放系統文件;Environment.getRootDirectory()
取得
/cache
開頭的目錄,存放暫存文件;Environment.getDownloadCacheDirectory()
取得
此處的 Environment
為內建 static method,用於檔案路徑、目錄的檢查與存取
Example
// Android 系統的數據目錄
Environment.getDataDirectory().getPath():
// /data
// Android 系統的根目錄
Environment.getRootDirectory().getPath():
// /system
Environment.getStorageDirectory().getPath():
// /storage
// 系統下載快取目錄
Environment.getDownloadCacheDirectory().getPath():
// /data/cache
// 外部儲存設備上的公共儲存目錄(如音樂、照片等)
Environment.getExternalStoragePublicDirectory("").getPath():
// /storage/emulated/0
// // /storage/emulated/Music
// // /storage/emulated/Pictures
// // /storage/emulated/Download
// // /storage/emulated/DCIM
// // ... (可在手機的“檔案管理”實際看到這些對應的目錄)
// 外部儲存設備的根目錄
Environment.getExternalStorageDirectory().getPath():
// /storage/emulated/0
// // /storage/emulated/Music
// // /storage/emulated/Pictures
// // /storage/emulated/Download
// // /storage/emulated/DCIM
// // ... (可在手機的“檔案管理”實際看到這些對應的目錄)
// 應用程式的內部儲存目錄
getFilesDir().getPath():
// /data/user/0/com.maxkit.msicloud_android/files
// 應用程式的內部快取目錄
getCacheDir().getPath():
// /data/user/0/com.maxkit.msicloud_android/cache
// 應用程式的數據目錄
getDataDir().getPath():
// /data/user/0/com.maxkit.msicloud_android
// 取應用程式的外部快取目錄
getExternalCacheDir().getPath():
// /storage/emulated/0/Android/data/com.maxkit.msicloud_android/cache
// 應用程式的代碼快取目錄。應用程式的編譯代碼和優化的快取文件,通常不需要直接操作這個目錄。它是由 Android 系統管理
getCodeCacheDir().getPath():
// /data/user/0/com.maxkit.msicloud_android/code_cache
getExternalFilesDir(""):
// /storage/emulated/0/Android/data/com.maxkit.msicloud_android/files/mounted
// /storage/emulated/0/Android/data/com.maxkit.msicloud_android/files/shared_prefs
// 應用程式的外部檔案目錄
getExternalFilesDirs(""):
// /storage/emulated/0/Android/data/com.maxkit.msicloud_android/files
// 應用程式的外部快取目錄
getExternalCacheDirs():
// /storage/emulated/0/Android/data/com.maxkit.msicloud_android/cache
// 應用程式的外部媒體目錄列表
getExternalMediaDirs():
// /storage/emulated/0/Android/media/com.maxkit.msicloud_android
public static long getInternalTotalMemorySize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSizeLong();
long totalBlocks = stat.getBlockCountLong();
return totalBlocks * blockSize;
}
public static long getInternalAvailableMemorySize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSizeLong();
long availableBlocks = stat.getAvailableBlocksLong();
return availableBlocks * blockSize;
}
public static boolean isSDCardEnable() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
public static long getExternalTotalMemorySize() {
if (!isSDCardEnable()) {
return -1;
}
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSizeLong();
long totalBlocks = stat.getBlockCountLong();
return totalBlocks * blockSize;
}
public static long getExternalAvailableMemorySize() {
if (!isSDCardEnable()) {
return -1;
}
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long blockSize, availableBlocks;
availableBlocks = stat.getAvailableBlocksLong();
blockSize = stat.getBlockSizeLong();
return availableBlocks * blockSize;
}
public static void showCapacity() {
long internal_total_size = getInternalTotalMemorySize();
long internal_avl_size = getInternalAvailableMemorySize();
long external_total_size = getExternalTotalMemorySize();
long external_avl_size = getExternalAvailableMemorySize();
logger.debug(
"內部總共: " + internal_total_size + " (" + FileUtils.convertUnit(internal_total_size, FileUtils.SizeUnit_Auto) + "), " +
"內部剩餘: " + internal_avl_size + " (" + FileUtils.convertUnit(internal_avl_size, FileUtils.SizeUnit_Auto) + "), " +
"外部總共: " + external_total_size + " (" + FileUtils.convertUnit(external_total_size, FileUtils.SizeUnit_Auto) + "), " +
"外部剩餘: " + external_avl_size + " (" + FileUtils.convertUnit(external_avl_size, FileUtils.SizeUnit_Auto) + ")"
);
}
Android之获取手机内部及sdcard存储空间
细说Android的内部存储和外部存储
彻底搞懂Android文件存储–-内部存储,外部存储以及各种存储路径解惑
解析Android内部存储、外部存储的区别
IO相關
//設定隱藏標題 getSupportActionBar().hide(); //設定隱藏狀態 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); Ref. 【Android】隱藏標題列(Title Bar)與狀態列(Status Bar)
Jul 28, 2023角色GATT Server/ Peripheral: BLE device GATT Client/ Central: 手機 未配對情況下,BLE device 會一直廣播,直到手機發送 request 給 BLE device,等待 BLE device 回傳 response。 定義: uuid 0x2800 is Service uuid 0x2803 is Characteristics Ref.
May 25, 2023簡述 Service可以在背景不斷的工作,直到停止或是系統無法提供資源為止。 Service 需要透過某Activity 或者其他Context 物件來啟動。 Service不需要和 user 互動,所以沒有操作介面。 生命週期與Activity是各自獨立的,Activity就算關閉,Service仍然可以繼續執行。 類似 BroadcastReceiver,需要定義一個繼承 Service 的類別,並覆寫其中的生命週期函數,最後在AndroidManifest.xml中宣告才能使用 Service可以同時支援 Started 與 Bind 兩種模式。在這種情況下,Service 需要等到兩種模式都被關閉才會觸發onDestroy()事件。 Service 只有第一次被啟動時,會執行onCreate(),若重複啟動則不會執行onCreate()。 Service的運作優先權相當的高,一般來說除非系統資源耗盡,否則 Android 不會主動關閉一個已被啟動的Service。一旦系統有足夠的資源,被 Android 關閉的Service也會被重新啟動。 兩者都需要在AndroidManifest.xml宣告
May 9, 2023Ref 碼農日常-『Android studio』取得手機位置經緯度 LocationManager
Oct 21, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up