如何从存储中获取准确的容量

How to get exact capacity from storage

我想以编程方式从实习生存储中读取确切的容量。

我使用的是 Samsung Galaxy S7 Edge 32GB 设备。

在预装的 Samsung FileManager(德语:Eigene Dateien)中显示总容量为 32GB。 即使在菜单 => 设置 => 存储中它也显示 32GB。

(如截图所示)

当我使用下面的代码时,它显示总容量为 24.4GB。

(显示在post末尾的日志中)

问题:如何获取我的设备的确切 32GB 总容量?

截图

完整代码:

package spicysoftware.com.space;

import android.os.Environment;
import android.os.StatFs;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.text.DecimalFormat;

public class MainActivity extends AppCompatActivity {

    StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String InternalFreeSpace = convertBytes(getInternalFreeSpace());
        Log.v("InternalFreeSpace : ", InternalFreeSpace);

        String InternalTotalSpace = convertBytes(getInternalTotalSpace());
        Log.v("InternalTotalSpace : ", InternalTotalSpace);

        String InternalUsedSpace = convertBytes(getInternalUsedSpace());
        Log.v("InternalUsedSpace : ", InternalUsedSpace);

    }

    public long getInternalFreeSpace()    {
        //Get free Bytes...
        long bytesAvailable = stat.getBlockSizeLong() * stat.getAvailableBlocksLong();
        return bytesAvailable;
    }

    public long getInternalTotalSpace()    {
        //Get total Bytes
        long bytesTotal = (stat.getBlockSizeLong() * stat.getBlockCountLong());
        return bytesTotal;
    }

    public long getInternalUsedSpace()    {
        //Get used Bytes
        long bytesUsed = getInternalTotalSpace() - getInternalFreeSpace();
        return bytesUsed;
    }

    public static String convertBytes (long size){
        long Kb = 1  * 1024;
        long Mb = Kb * 1024;
        long Gb = Mb * 1024;
        long Tb = Gb * 1024;
        long Pb = Tb * 1024;
        long Eb = Pb * 1024;

        if (size <  Kb)                 return floatForm(        size     ) + " byte";
        if (size >= Kb && size < Mb)    return floatForm((double)size / Kb) + " KB";
        if (size >= Mb && size < Gb)    return floatForm((double)size / Mb) + " MB";
        if (size >= Gb && size < Tb)    return floatForm((double)size / Gb) + " GB";
        if (size >= Tb && size < Pb)    return floatForm((double)size / Tb) + " TB";
        if (size >= Pb && size < Eb)    return floatForm((double)size / Pb) + " PB";
        if (size >= Eb)                 return floatForm((double)size / Eb) + " EB";

        return "anything...";
    }

    public static String floatForm (double d)    {
        return new DecimalFormat("#.##").format(d);
    }
}

日志

When I use my code below it shows me a total capacity of 24,4GB.

这是包含 Environment.getExternalStorageDirectory() 的分区上 space 的数量。设备上还有其他分区,您将无法访问这些分区。

How to get the exact 32GB total capacity of my device?

没有办法做到这一点,除非在有根设备上。

1.First ,打开命令提示符。连接开发者选项打开的手机。在 cmd.You 上写入 "adb shell" 现在将出现在您的 phone 路径中。 2.Secondly,在cmd上写df -h,显示总共phone个存储被分成不同的磁盘路径。

3.See这张图片。enter image description here

  `  double size =
                    new File("/data").getTotalSpace() / (1024.0 * 1024 * 1024);


            double sizesystem =
                    new File("/system").getTotalSpace() / (1024.0 * 1024 * 1024);

            double sizedev =
                    new File("/dev").getTotalSpace() / (1024.0 * 1024 * 1024);

            double sizecache =
                    new File("/cache").getTotalSpace() / (1024.0 * 1024 * 1024);

            double sizemnt =
                    new File("/mnt").getTotalSpace() / (1024.0 * 1024 * 1024);

            double sizevendor =
                    new File("/vendor").getTotalSpace() / (1024.0 * 1024 * 1024);



            float total = (float) (sizemnt + sizedev + sizesystem + size + sizevendor + sizecache);
            Log.e("total111", String.valueOf(total));`

这里,使用所有盘路径,得到size.Then 全部汇总,得到一个phone的实际存储。 如果 phone 是 32 GB,您将看到 32 GB 的总存储空间。