Search code examples
fluttercsvfilefile-permissionsreadfile

When I try to read the .csv file in flutter, I get an access error


when i create the file for the first time on the phone and when i try to read it i don't get any problem and i read it but when i try to read a file that i didn't create through my app, access is denied. My error is bellow ;

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: FileSystemException: Cannot open file, path = '/storage/emulated/0/Download/Bka_data.cvs' (OS Error: Permission denied, errno = 13)

Write function is:

Future<void> restore() async {
  final PermissionStatus permissionStatus = await Permission.storage.request();
  if (permissionStatus == PermissionStatus.granted) {
    final Database db = await SQLHelper.db();
    await db.delete("spendinfo");
    final fileName = "Bka_data.cvs";
    var path = await ExternalPath.getExternalStoragePublicDirectory(ExternalPath.DIRECTORY_DOWNLOADS);
    final directory = "$path/$fileName";
    final File f = File(directory);
    final List<List<dynamic>> csvData = CsvToListConverter().convert(await f.readAsString());
    final List<spendinfo> lastList = csvData.map((csvRow) => spendinfo.fromCVSObjetct(csvRow)).toList();
    for (var i = 0; i < lastList.length; i++) {
      SQLHelper.createItem(lastList[i]);
      print(lastList[i].id);
    }
  } else {

  }
}

Read function is:

Future <void> writeToCvs() async {

  final PermissionStatus permissionStatus = await Permission.storage.request();
  if (permissionStatus == PermissionStatus.granted) {
    final Database db = await SQLHelper.db();
    final List<Map<String, dynamic>> allData = await db.query("spendinfo", orderBy: "id") ;
    final List<List<dynamic>> rows = <List<dynamic>>[];
    var path = await ExternalPath.getExternalStoragePublicDirectory(ExternalPath.DIRECTORY_DOWNLOADS);
    print("dir $path");
    String file = "$path";

    for(final Map<String, dynamic> map in allData) {
      final List<dynamic> row = map.values.toList();
      print(row) ;
      rows.add(row);
    }
    final String fileName = "Bka_data.cvs";
    final directory = "$path/$fileName";
    final File f = File(directory);
    final String cvs = ListToCsvConverter().convert(rows);
    await f.writeAsString(cvs);
    //print(filePath);
    print("Yüklendi");
  } else {
    // accses is denied
  }
}

I tried other kind of permission.


Solution

  • To resolve your issue, use

    await Permission.manageExternalStorage.request();

    instead of

    await Permission.storage.request();

    and add these permissions if you haven't already done so in your AndroidManifest.xml

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