gpt4 book ai didi

java - 在考虑 Galaxy 设备的边缘情况时,如何获得正确的设备内部和外部空间量?

转载 作者:行者123 更新时间:2023-11-29 09:01:02 31 4
gpt4 key购买 nike

我想获取设备内部和外部空间的数量,在浏览了 StackOverflow 上的几篇文章后,我发现这很容易。我可以使用这个获取内部空间量:

StatFs sfsInternal = new StatFs(Environment.getRootDirectory().getAbsolutePath());
return Long.valueOf(sfsInternal.getBlockCount()) * Long.valueOf(sfsInternal.getBlockSize());

...我可以使用这个获取外部空间量:

StatFs sfsExternal = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
return Long.valueOf(sfsExternal.getBlockCount()) * Long.valueOf(sfsExternal.getBlockSize());

当我读到“内部”存储时,我假设它是设备上不可移动的板载存储,而“外部”是可移动闪存卡存储,但情况并非完全如此。

我发现三星设备 e.e. Galaxy Note 2,将大量内部存储显示为外部存储。这是一个讨论同一件事的答案。 https://stackoverflow.com/a/12087556/304151

如何在考虑三星 Galaxy 设备的边缘情况时获取内部存储量(板载和不可移动)和外部存储量(闪存和可移动)。我还没有在 StackOverflow 上找到为这种情况提供完整工作解决方案的答案。我的代码适用于 API 级别 17。

谢谢。

最佳答案

这是在不同设备上获取可用空间的代码,我已经在 samsung GALAXY Tab7 2.2 Froyo 和 Nexus 7 4.2.2 Jelly Beans 上测试了该代码

    // calculate frespace on external storage
public static int getExternalStorageFreeSpace(String storagePath)
{
try
{
File file = new File(storagePath);
StatFs stat = new StatFs(file.getPath());
double sdAvailSize = (double) stat.getAvailableBlocks() * (double) stat.getBlockSize();
int valueinmb = (int) (sdAvailSize / 1024) / 1024;
return valueinmb;
}
catch (Exception e)
{
System.out.println("Message//////" + e.getMessage() + "Cause555555555555" + e.getCause());
}
return 0;
}

为了区分内部和外部存储,我使用了这个类和一些逻辑

public class GetRemoveableDevices
{
private final static String TAG = "GetRemoveableDevice";

public GetRemoveableDevices()
{
}

public static String[] getDirectories()
{
Log.d(TAG, "getStorageDirectories");
File tempFile;
String[] directories = null;
String[] splits;
ArrayList<String> arrayList = new ArrayList<String>();
BufferedReader bufferedReader = null;
String lineRead;

try
{
arrayList.clear(); // redundant, but what the hey
bufferedReader = new BufferedReader(new FileReader("/proc/mounts"));

while ((lineRead = bufferedReader.readLine()) != null)
{
Log.d(TAG, "lineRead: " + lineRead);
splits = lineRead.split(" ");

// System external storage
if (splits[1].equals(Environment.getExternalStorageDirectory().getPath()))
{
arrayList.add(splits[1]);
Log.d(TAG, "gesd split 1: " + splits[1]);
continue;
}

// skip if not external storage device
if (!splits[0].contains("/dev/block/"))
{
continue;
}

// skip if mtdblock device

if (splits[0].contains("/dev/block/mtdblock"))
{
continue;
}

// skip if not in /mnt node

if (!splits[1].contains("/mnt"))
{
continue;
}

// skip these names

if (splits[1].contains("/secure"))
{
continue;
}

if (splits[1].contains("/mnt/asec"))
{
continue;
}

// Eliminate if not a directory or fully accessible
tempFile = new File(splits[1]);
if (!tempFile.exists())
{
continue;
}
if (!tempFile.isDirectory())
{
continue;
}
if (!tempFile.canRead())
{
continue;
}
if (!tempFile.canWrite())
{
continue;
}

// Met all the criteria, assume sdcard
arrayList.add(splits[1]);
}

}
catch (FileNotFoundException e)
{
}
catch (IOException e)
{
}
finally
{
if (bufferedReader != null)
{
try
{
bufferedReader.close();
}
catch (IOException e)
{
}
}
}

// Send list back to caller

if (arrayList.size() == 0)
{
arrayList.add("sdcard not found");
}
directories = new String[arrayList.size()];
for (int i = 0; i < arrayList.size(); i++)
{
directories[i] = arrayList.get(i);
}
return directories;
}

}

现在我向你展示我的逻辑

String[] dirs = GetRemoveableDevices.getDirectories();
ArrayList<String> directories=new ArrayList<String>();
for(String directory:dirs)
{
if(!directory.contains("."))
directories.add(directory);
}
String externalStorage = "";
String internalStorage = "";
if (directories.size()>= 2)
{
internalStorage = directories.get(0).toString();
externalStorage = directories.get(1).toString();
}
else if (directories.size() < 2)
{
internalStorage = directories.get(0).toString();
externalStorage = null;
}

希望对你有帮助

关于java - 在考虑 Galaxy 设备的边缘情况时,如何获得正确的设备内部和外部空间量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17402929/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com