Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这段代码错误地报告了我的Android设备上的可用空间?_Java_Android - Fatal编程技术网

Java 为什么这段代码错误地报告了我的Android设备上的可用空间?

Java 为什么这段代码错误地报告了我的Android设备上的可用空间?,java,android,Java,Android,我的带有32GB SD卡的三星X-Cover2 GT-S7710在“设置”>“存储”中报告了正确的空间,但此代码或以下代码仅为0.6 GB: 这是为什么?我如何才能正确地发现真正的可用空间?试试这个: StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCo

我的带有32GB SD卡的三星X-Cover2 GT-S7710在“设置”>“存储”中报告了正确的空间,但此代码或以下代码仅为0.6 GB:

这是为什么?我如何才能正确地发现真正的可用空间?

试试这个:

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
System.out.println("Megs :"+megAvailable);
getBlockCount()
-返回SD卡的大小
getAvailableBlocks()
-返回正常程序仍然可以访问的块数


详细信息在此

此行为的原因可能是,对于您的手机,SD卡不被视为主要的外部存储设备。对的描述解释了这一点:

注意:这里的“外部”一词不要混淆。此目录最好被视为媒体/共享存储。它是一个文件系统,可以保存相对大量的数据,并在所有应用程序之间共享(不强制执行权限)。传统上,这是一个SD卡,但它也可以作为设备中的内置存储器来实现,该设备不同于受保护的内部存储器,并且可以作为文件系统安装在计算机上

所以你可能会得到一些其他的系统,真正是0.6GB大

幸运的是,您正在寻找的设备很有可能安装在与您正在获取的设备相同的父目录中。因此,首先,我要检查这是否是您正在寻找的类似设备,如果不是,请尝试相同父目录中的其他设备:


这里的背景是,所有外部存储设备似乎都属于用户
sdcard\u rw
,因此这就是我们可以检查的内容。不幸的是,在Android中检查文件所有权的最短方法似乎是。。。嗯,不是很直观。但是,希望这与各种存储设备的具体安装位置无关。

您有什么问题?相关问题:SD卡可能不是用作Android API“外部存储”,而是用作具有供应商独特处理方式的附加卷。我也面临同样的问题,请您提供帮助,当我尝试使用上述代码时。我得到了一个错误“error:(133,76)error:variable sdStorage可能没有初始化”。我刚刚检查了一下,虽然已经有一段时间了,但我认为这个问题很容易解决。在第一条if语句中,将“sdStorage.isExternalStorageRemovable()”替换为“Environment.isExternalStorageRemovable()”。因为“sdStorage”此时确实还没有初始化。我已经替换了if语句“sdStorage”,正如您所建议的那样,比如“if(android.os.Environment.isExternalStorageRemovable())”。但这一行中现在出现了相同的错误process=newprocessbuilder().command(“ls”,“-l”,sdStorage.getParent()).redirectErrorStream(true.start();同样,我们访问的变量实际上还没有初始化。我必须尝试一下,但我想用if子句中的值初始化sdStorage可能会有所帮助。当然,稍后会有所改变。
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
System.out.println("Megs :"+megAvailable);
File sdStorage;
if(sdStorage.isExternalStorageRemovable()) {
     sdStorage = Environment.getExternalStorageDirectory();
} else {
    List<File> storages = Environment.getExternalStorageDirectory().getParentFile().listFiles();
    for(File storage : storages) {
        if(! storages.equals(Environment.getExternalStorageDirectory()) {
            sdStorage = storage;
            break;
        }
    }
}
if(sdStorage == null) {
    // No non-removable storage device was found
}
File sdStorage;
if(sdStorage.isExternalStorageRemovable()) {
     sdStorage = Environment.getExternalStorageDirectory();
} else {
    Process process = null;
    Scanner scan = null;
    try {
        process = new ProcessBuilder().command("ls", "-l", sdStorage.getParent()).redirectErrorStream(true).start();
        scan = new Scanner(process.getInputStream());
        while(scan.hasNextLine()) {
            String line = scan.nextLine();
            String[] parts = line.split("\\s");
            if(parts.length > 2 && parts[2].equals("sdcard_rw") 
              && ! Environment.getExternalStorageDirectory().equals(Environment.getExternalStorageDirectory().getParent() + File.seperator + parts[3]) {
                sdStorage = new File(Environment.getExternalStorageDirectory().getParent() + File.seperator + parts[3]);
                break;
            }
        } catch(IOException e) {
            // Do something here
        } finally {
            if(scan != null)
                scan.close();
            if(process != null)
                process.destroy();
        }
    }
}