我的带有32GB SD卡的Samsung X-Cover2 GT-S7710报告了Settings> Storage中的正确空间,但是使用此代码或How can I check how much free space an SD card mounted on an Android device has?却只有0.6 GB:
sdStorageDirectory = Environment.getExternalStorageDirectory().getPath();StatFs statSd = new StatFs(sdStorageDirectory);Log.d(TAG, "gb available " + String.valueOf((double) (statSd.getAvailableBlocks() * statSd.getBlockSize()) / 1073741824));
为什么会这样,如何正确发现真正的可用空间?
解决方法:
出现这种情况的原因可能是,在您的手机中,SD卡不被视为主要的外部存储设备. getExternalStorageDirectory()的说明对此进行了解释:
Note: don’t be confused by the word “external” here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions). Traditionally this is an SD card, but it may also be implemented as built-in storage in a device that is distinct from the protected internal storage and can be mounted as a filesystem on a computer.
因此,您可能会得到一些其他的系统,该系统实际上是0.6 GB大的.
幸运的是,您要查找的设备与要获取的设备安装在相同的父目录中的可能性非常高.因此,首先,我要检查这是否是您正在寻找的设备(如isExternalStorageRemovable()),如果不是,请尝试使用同一父目录中的其他设备:
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}
假设仅安装了两个设备.在极少数情况下,情况可能并非如此(例如,由于通过usb-otg安装了另一个存储设备);您将不得不在此处找到其他解决方法.一个想法可能是通过一个过程运行描述为here的mount命令,并通过这些结果来找到正确的设备.但是,这将变得非常复杂.
它还假定所有外部存储设备都安装在同一父目录(通常是/ mnt /)下.如果不是这种情况,mount命令将再次成为您的最大希望.
编辑1:可能有一些设备不使用/ mnt目录就挂载到/ sdcard(尽管在某些情况下可能是对/ mnt / sdcard的引用,在这种情况下您会很好的).因此,在这些情况下,您将不得不使用mount的输出.
编辑2:我检查并发现,在我的手机上/ mnt包含很多目录,我只想要其中一个.所以我想出了这个解决方案,而不是上面的解决方案:
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(); } }}
这里的背景是,所有外部存储设备似乎都属于用户sdcard_rw,因此这是我们可以检查的内容.遗憾的是,在AndroID中检查文件所有权的最短方法似乎是…嗯,不是很直观.但是希望,这应该独立于各种存储设备的确切安装位置而起作用.
总结以上是内存溢出为你收集整理的java-为什么此代码错误地报告了我的Android设备上的可用空间?全部内容,希望文章能够帮你解决java-为什么此代码错误地报告了我的Android设备上的可用空间?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)