1

In one of my activities, I save an image in my App's directory subfolder and in the next activity I read the .png file and include it in a pdf file with some other data and save it in my App's directory, Everything worked fine until I updated my phone from Android 10 to 11. Now I get this error:

E/main: error java.io.FileNotFoundException: /storage/emulated/0/IranianMasonryBuildings/sjdnnd -- Fri Feb 12 11:49:36 GMT+03:30 2021.pdf: open failed: EPERM (Operation not permitted)

I tried many fixes online but none of them seem to work.

My manifest includes theses permissions and also the requestLegacyExternalStorage = true

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

    android:requestLegacyExternalStorage="true"

compileSdkVersion and targetSdkVersion are set to 29, I tried to change the API level to 28 as mentioned in some answers to other questions but did not work.

This is how I try to create the pdf file:

private boolean isExternalStorageWritable(){
    if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
        Log.i("State", "Yes, it is writable");
        return true;
    }else{
        return false;
    }
}

public boolean checkPermission(String permission){
    int check = ContextCompat.checkSelfPermission(this, permission);
    return (check == PackageManager.PERMISSION_GRANTED);
}

public void checkPermission(String permission, int requestCode)
{
    if (ContextCompat.checkSelfPermission(Results.this, permission)
            == PackageManager.PERMISSION_DENIED) {

        // Requesting the permission
        ActivityCompat.requestPermissions(Results.this,
                new String[] { permission },
                requestCode);
    }
    else {
        /*Toast.makeText(Results.this,
                "Permission already granted",
                Toast.LENGTH_SHORT)
                .show();*/
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == STORAGE_PERMISSION_CODE){
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            /*Toast.makeText(Results.this,
                    "Storage Permission Granted",
                    Toast.LENGTH_SHORT)
                    .show();*/
        }
        else {
            Toast.makeText(Results.this,
                    "Please grant access",
                    Toast.LENGTH_SHORT)
                    .show();
        }
    }
}

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

public void writeExternalStorage (){
String state;
        state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state) && 
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        try {
                //File storageDir2 = new File(Environment.getExternalStorageDirectory().toString(), 
"/IranianMasonryBuildings/BluePrints");
                File storageDir2 = new File(Environment.getExternalStorageDirectory().toString(), 
"/IranianMasonryBuildings");
                File f = new File(storageDir2, "BluePrint213.png");
                Bitmap blueprint2 = BitmapFactory.decodeStream(new FileInputStream(f));
         } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

         PdfDocument myPdfDocument = new PdfDocument();
            Paint myPaint = new Paint();

            // Create a page description
            PdfDocument.PageInfo myPageInfo1 = new PdfDocument.PageInfo.Builder(PageWidth, 
PageHeight, PageNumber).create();

            // start a page
            PdfDocument.Page myPage1 = myPdfDocument.startPage(myPageInfo1);
            Canvas canvas = myPage1.getCanvas();
            myPaint = new Paint();

            myPaint.setStyle(Paint.Style.STROKE);
            myPaint.setStrokeWidth(3);
            canvas.drawRect(200, 250, 1900, 2600, myPaint);


            myPdfDocument.finishPage(myPage1);

            File storageDir = new File(Environment.getExternalStorageDirectory().toString(), 
"/IranianMasonryBuildings");
            storageDir.mkdirs(); // make sure you call mkdirs() and not mkdir()
            boolean wasSuccessful = storageDir.mkdirs();
            if (!wasSuccessful) {
                //Toast.makeText(getApplicationContext(), "mkdirs was not Successful  ", 
Toast.LENGTH_LONG).show();
            }


            File file2 = new File(storageDir, ProjectName + " -- " + Today + ".pdf");
            try {
                myPdfDocument.writeTo(new FileOutputStream(file2));
                Toast.makeText(this, "The results are saved in" + "IranianMasonryBuildings",  
Toast.LENGTH_LONG).show();
            } catch (IOException e) {
                Log.e("main", "error " + e.toString());
                Toast.makeText(this, "Error!" + e.toString(), Toast.LENGTH_LONG).show();
            }

            // close the document
            myPdfDocument.close();

Any ideas what is causing the problem and how to fix?

WiMa
  • 151
  • 1
  • 3
  • 15

1 Answers1

1

Android 11 (API level 30) further enhances the platform, giving better protection to app and user data on external storage. This release introduces several enhancements, such as opt-in raw file path access for media, batch edit operations for media, and an updated UI for the Storage Access Framework.

Follow this link

https://developer.android.com/about/versions/11/privacy/storage