4
votes

I am developing an app. In which I am uploading different file types (e.g. docx, pdf, zip) to a WAMP Server. Below is path of file to my internal Storage.

/storage/emulated/0/WhatsApp/Media/WhatsApp Documents/api.txt

I have added and allowed storage permission in Manifest file and also on runtime for reading a file. However there is no Internal Storage Permission request available.

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

and also for Android 10 I was using this attribute also

android:requestLegacyExternalStorage="true"

But i am getting this error on Android 11 OS a.k.a Android R onboard Samsung Galaxy when I am reading file from Internal Storage for uploading.

java.io.FileNotFoundException: /storage/emulated/0/WhatsApp/Media/WhatsApp Documents/api.txt: open failed: EACCES (Permission denied)

5
This may or may not be the case here. But I once found that if you debug the app when your phone is connected in USB Storage mode then it stops the file permission. Check this without connecting your phone to USB to your pc and debug the app. - Zankrut Parmar
Just copy file in cache or temp filedir from uri and then upload it. - Abhay Koradiya

5 Answers

1
votes

On An Android 11 device your app only has access to its own files.

And to general mediafies in public directories.

Try to list the files in that whatsapp directory and you will see that they are not listed.

You have two options to read the file.

  1. Let the user pick the file with ACTION_OPEN_DOCUMENT.
  2. Request MANAGE_EXTERNAL_STORAGE in manifest and let the user confirm.
1
votes

You can try to use the android:preserveLegacyExternalStorage="true" tag in the manifest file in the application tag. This tag is used to access the storage in the android 11 devices. And for more detail follow this link it will explain you more as per your requirement.

I search a lot of time and get the solution that adds <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> in the manifest file and try to get the file access permission in the android 11 phones. Then you will open and read the file from the storage.

But the thing is that the play store does not allow you to use of the MANAGE_EXTERNAL_STORAGE permission in your app. it will take time to give access to the developer to use it to access all the files. Here the link is

0
votes

Try to get path with this method.....

public static String getDriveFile(Context context, Uri uri) { Uri returnUri = uri; Cursor returnCursor = context.getContentResolver().query(returnUri, null, null, null, null);

    int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
    int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
    returnCursor.moveToFirst();
    String name = (returnCursor.getString(nameIndex));
    String size = (Long.toString(returnCursor.getLong(sizeIndex)));
    File file = new File(context.getCacheDir(), name);
    try {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        FileOutputStream outputStream = new FileOutputStream(file);
        int read = 0;
        int maxBufferSize = 1 * 1024 * 1024;
        int bytesAvailable = inputStream.available();

        //int bufferSize = 1024;
        int bufferSize = Math.min(bytesAvailable, maxBufferSize);

        final byte[] buffers = new byte[bufferSize];
        while ((read = inputStream.read(buffers)) != -1) {
            outputStream.write(buffers, 0, read);
        }
        Log.e("File Size", "Size " + file.length());
        inputStream.close();
        outputStream.close();
        Log.e("File Path", "Path " + file.getPath());
        Log.e("File Size", "Size " + file.length());
    } catch (Exception e) {
        Log.e("Exception", e.getMessage());
    }
    return file.getPath();

}
0
votes

On An Android 11 device your app only has access to its own files.

And to general mediafies in public directories.

Try to list the files in that whatsapp directory and you will see that they are not listed.

You have two options to read the file.

Let the user pick the file with ACTION_OPEN_DOCUMENT. Request MANAGE_EXTERNAL_STORAGE in manifest and let the user confirm.

Ordinary request is not working for the MANAGE_EXTERNAL_STORAGE permission. user must be accepted this permission in Android setting enter image description here

0
votes

I worked on Android application based on Cordova and I had to change the version the application was focused on to save files in the device.

I change the API Level version to 28 and works correctly. This change is used to avoid the scoped storage feature added on Android 10.

This information is extracted from this page: https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage

I hope this information is helpful.