Error android.system.ErrnoException

I am trying to get data from an internal storage (storage that is used as internal memory) using the code below.

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");
    }

I also accepted the necessary permissions.

For Android 5.0 and below

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

For android 6.0 and above, I request runtime permissions.

But I got an error of android.system.ErrnoExceptionabout 10 users. Full stack trace

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)

I get this error from version 5.0 to version 7.0

+4
source share
2 answers

I) Retrieving the path from external storage using

Environment.getExternalStorageDirectory().getPath()

you will get something like:

 /storage/emulated/0
 /mnt/sdcard 
 /mnt/sdcard-ext 

but the error indicates that you are only gettin /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()       . -       .

, , , SD- ! , .

btw, getAbsolutePath()

Environment.getExternalStorageDirectory().getAbsolutePath();

Environment.getExternalStorageDirectory().getAbsolutePath();

, , , " ".


II) :

android.system.ErrnoException: statvfs : ENOENT ( )         libcore.io.Posix.statvfs(Posix.java)

, , , WRITE_EXTERNAL_STORAGE (inherent READ_EXTERNAL_STORAGE) 6.0 +

:

ENOENT ( )

.

+2

, , .

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 /

Android? SD-?

, .

0

Source: https://habr.com/ru/post/1689120/


All Articles