我正在尝试使用以下代码获取内部存储详细信息(存储用作内部存储器)。
public void getinternalstorage() {
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
double bytesavalible = (double) stat.getBlockSizeLong() * (double) stat.getAvailableBlocksLong();
final double gb = bytesavalible / (1024 * 1024 * 1024);
double total = (double) stat.getBlockSizeLong() * stat.getBlockCountLong();
final double totalgb = total / (1024 * 1024 * 1024);
final double per = (100 - (gb / totalgb) * 100);
update_inte((int) (per * 1), round(totalgb, 2), round((gb), 2));
TextView text2written = (TextView) findViewById(R.id.inter);
text2written.setText(String.valueOf(round((totalgb - gb), 2)) + " GB " + "/ " + String.valueOf(round(totalgb, 2)) + " GB");
}
我还获得了所需的权限。
适用于Android 5.0及更低版本 -
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
对于Android 6.0及更高版本,我正在请求运行时权限。
但是我收到了大约10个用户的android.system.ErrnoException
错误。
完整堆栈跟踪
Fatal Exception: java.lang.RuntimeException: Unable to resume activity {com.package.app.Main_Screen}: java.lang.IllegalArgumentException: Invalid path: /sdcard
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3121)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by java.lang.IllegalArgumentException: Invalid path: /sdcard
at android.os.StatFs.doStat(StatFs.java:46)
at android.os.StatFs.(StatFs.java)
at com.package.app.Main_Screen.getinternalstorage(Main_Screen.java:565)
at com.package.app.Main_Screen.on_resume(Main_Screen.java:785)
at com.package.app.Main_Screen.checkPermission(Main_Screen.java:1070)
at com.package.app.Main_Screen.onResume(Main_Screen.java:779)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1281)
at android.app.Activity.performResume(Activity.java:6320)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3110)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by android.system.ErrnoException: statvfs failed: ENOENT (No such file or directory)
at libcore.io.Posix.statvfs(Posix.java)
at libcore.io.BlockGuardOs.statvfs(BlockGuardOs.java:298)
at android.system.Os.statvfs(Os.java:500)
at android.os.StatFs.doStat(StatFs.java:44)
at android.os.StatFs.(StatFs.java)
at com.package.app.Main_Screen.getinternalstorage(Main_Screen.java:565)
at com.package.app.Main_Screen.on_resume(Main_Screen.java:785)
at com.package.app.Main_Screen.checkPermission(Main_Screen.java:1070)
at com.package.app.Main_Screen.onResume(Main_Screen.java:779)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1281)
at android.app.Activity.performResume(Activity.java:6320)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3110)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
我收到的错误是从5.0到7.0 Android版本
答案 0 :(得分:2)
I)使用
从外部存储目录获取路径Environment.getExternalStorageDirectory().getPath()
你会得到类似的东西:
/storage/emulated/0
/mnt/sdcard
/mnt/sdcard-ext
但错误指出您只是/sdcard
:
由java.lang.IllegalArgumentException引起:路径无效:/ sdcard 在android.os.StatFs.doStat(StatFs.java:46) 在android.os.StatFs。(StatFs.java)
如果我们检查引发此错误的SDK方法:
private static StructStatVfs doStat(String path) {
try {
return Os.statvfs(path);
} catch (ErrnoException e) {
throw new IllegalArgumentException("Invalid path: " + path, e);
}
}
函数statvfs()返回有关已挂载的信息 文件系统。 path是已挂载的任何文件的路径名 文件系统。
因此,为了避免这个问题,您必须确保已安装SD卡!在这种情况下,很难确保所有生产用户都能使用此选项,该选项将是验证。
不过,我建议使用getAbsolutePath()Environment.getExternalStorageDirectory().getAbsolutePath();
而不是
Environment.getExternalStorageDirectory().getAbsolutePath();
获取绝对路径,如果它是相对的,则解析当前目录后的路径,从而产生“完全限定路径”。
II)显示的其他错误信息是:
由android.system.ErrnoException引起:statvfs失败:ENOENT(No 这样的文件或目录) 在libcore.io.Posix.statvfs(Posix.java)
请记住,您的应用无法读取内部存储空间,请记住,您必须在设备6.0 +
中手动设置WRITE_EXTERNAL_STORAGE
(固有READ_EXTERNAL_STORAGE
)权限
这将是原因:
ENOENT(没有这样的文件或目录)
因为用户必须接受权限。
答案 1 :(得分:0)
嗨请逐步查看以下流程。
1)请先将运行时权限检查到最新设备的代码中,然后查看以下链接。
https://developer.android.com/training/permissions/requesting.html
2)您需要使用环境变量。 Environment.getExternalStorageDirectory(); 。 Environment.java 中有很多方法。这取决于您需要什么信息。例如,要获取外部存储名称,请使用Environment.getExternalStorageDirectory()。getName();还有其他方法可以利用它们。对于内部存储,api可能无法公开发布。
StatFs stat = new StatFs(type.getPath());
long bytesAvailable = (long)stat.getBlockSize()*(long)stat.getAvailableBlocks();
long megAvailable = bytesAvailable / (1024 * 1024);
Log.i("TAG","Available size in MB : "+megAvailable);
请查看以下2链接,这些也可以帮助您。
Android get free size of internal/external memory
How to Check available space on android device ? on SD card?
希望这会有所帮助。