-1

I've read all similar questions and none of them helped me. So I am building an app for myself, which collects some data over time. I chose to use a simple csv file to save it in (I am still not sure if there is a better way to do it). I am using opencsv library for the job however, I keep getting this error:

java.io.FileNotFoundException: /storage/emulated/0/TestCSV.csv: open failed: EACCES (Permission denied).

It works on api 22.

private void verifyStoragePermissions(){

        String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_EXTERNAL_STORAGE};

        if(ContextCompat.checkSelfPermission(this.getApplicationContext(), perms[0]) == PackageManager.PERMISSION_GRANTED
        && ContextCompat.checkSelfPermission(this.getApplicationContext(), perms[1]) == PackageManager.PERMISSION_GRANTED){
            writeToCsv();
        }
        else{
            ActivityCompat.requestPermissions(MainActivity.this, perms, 1);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        verifyStoragePermissions();
    }

...

private void writeToCsv(){

        CSVWriter writer = null;

        String csv =  (Environment.getExternalStorageDirectory().getAbsolutePath()+ "/TestCSV.csv");

        try{
            writer = new CSVWriter(new FileWriter(csv));

            List<String[]> data = new ArrayList<String[]>();
            data.add(new String[]{"Country", "Capital"});
            data.add(new String[]{"India", "New Delhi"});
            data.add(new String[]{"United States", "Washington D.C"});
            data.add(new String[]{"Germany", "Berlin"});

            writer.writeAll(data); // data is adding to csv

            writer.close();
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }

I call verifyStoragePermissions() in onCreate method.

Anas Mehar
  • 2,739
  • 14
  • 25
ignasrrr
  • 1
  • 1

1 Answers1

0

Read/write external doesn't give blanket permission for all directories. Notably, it does not give permission for root. Each app has its own personal directory on external storage, write it there instead.

Gabe Sechan
  • 90,003
  • 9
  • 87
  • 127