2017-02-17 47 views
0

我正在開發一個android文件管理器應用程序。 等主要活動我想顯示所有可用的存儲類型,如內部存儲和外部SD卡。獲取內部和外部存儲信息 - android

,所以我用這個代碼,

public static boolean externalMemoryAvailable() { 
    return android.os.Environment.getExternalStorageState().equals(
      android.os.Environment.MEDIA_MOUNTED); 
} 

public static long getAvailableInternalMemorySize() { 
    File path = Environment.getDataDirectory(); 
    StatFs stat = new StatFs(path.getPath()); 
    long blockSize = stat.getBlockSize(); 
    long availableBlocks = stat.getAvailableBlocks(); 
    return availableBlocks * blockSize; 
} 

public static long getTotalInternalMemorySize() { 
    File path = Environment.getDataDirectory(); 
    StatFs stat = new StatFs(path.getPath()); 
    long blockSize = stat.getBlockSize(); 
    long totalBlocks = stat.getBlockCount(); 
    return totalBlocks * blockSize; 
} 

public static long getAvailableExternalMemorySize() { 
    if (externalMemoryAvailable()) { 
     File path = Environment.getExternalStorageDirectory(); 

     StatFs stat = new StatFs(path.getPath()); 
     long blockSize = stat.getBlockSize(); 
     long availableBlocks = stat.getAvailableBlocks(); 
     return availableBlocks * blockSize; 
    } else { 
     return 0; 
    } 
} 

public static long getTotalExternalMemorySize() { 
    if (externalMemoryAvailable()) { 
     File path = Environment.getExternalStorageDirectory(); 
     StatFs stat = new StatFs(path.getPath()); 
     long blockSize = stat.getBlockSize(); 
     long totalBlocks = stat.getBlockCount(); 
     return totalBlocks * blockSize; 
    } else { 
     return 0; 
    } 
} 

但問題是,它給我相同的內存輸出,用於內部和外部存儲.. 實際上它給內部存儲正確的答案。但外部SD卡錯誤。

我覺得我錯在獲得ext sd卡的路徑。任何幫助? PLZ。

+0

'但錯誤的外置SD card'。確實。您的代碼中沒有涉及外部SD卡的內容。 – greenapps

+0

'它爲我提供了同樣的內存和外部存儲輸出.'。有趣。確認! – greenapps

回答

1

是SD卡位置路徑是android的不同品牌不同,不能得到保證。 我有一個解決方案,但這個工程用的minSdkVersion 19

static File dirs[]; 
dirs = ContextCompat.getExternalFilesDirs(context, null); 
//dirs[0] refers to internal memory and dirs[1] gives you external. Call the following methods to get total and available memory details. 


public static String getTotalExternalMemorySize(File dirs[]) { 
if (dirs.length > 1) { 
     StatFs stat = new StatFs(dirs[1].getPath()); 
     long blockSize = stat.getBlockSizeLong(); 
     long totalBlocks = stat.getBlockCountLong(); 
     return readableFileSize(totalBlocks * blockSize); 
    } else { 
     return "NA"; 
} 

public static String getAvailableExternalMemorySize(File[] dirs) { 
    if (dirs.length > 1) { 
     StatFs stat = new StatFs(dirs[1].getPath()); 
     long blockSize = stat.getBlockSizeLong(); 
     long availableBlocks = stat.getAvailableBlocksLong(); 
     return readableFileSize(availableBlocks * blockSize); 
    } else { 
     return "NA"; 
    } 
} 

public static String readableFileSize(long size) { 
    if(size <= 0) return "0"; 
    final String[] units = new String[] { "B", "kB", "MB", "GB", "TB" }; 
    int digitGroups = (int) (Math.log10(size)/Math.log10(1024)); 
    return new DecimalFormat("#,##0.##").format(size/Math.pow(1024, digitGroups)) + " " + units[digitGroups]; 
} 
+0

thanx @pavan。但你會告訴我,我怎麼能檢測到另一個USB存儲。意味着如果手機已經將USB筆驅動器連接到了otg,該怎麼辦。那麼我如何在這裏檢測到它? –

+0

意味着如果,手機已插入SD卡,以及pendrive連接? –

+0

您是否嘗試循環dirs []數組以檢查它是否返回了所有外部坐騎? 根據文檔** getExternalFilesDirs(context,type)**方法執行以下操作: **返回應用程序可以放置它擁有的持久性文件的所有外部存儲設備上應用程序特定的目錄的絕對路徑** – Pavan