flutterandroid-external-storage

Flutter get External Storage Directory and MediaStore with path_provider package


I need to open and save simple text files that may be on the device. For example in Documents, Downloads, etc. Wherever files are available for other programs, in android terminology it is "External Storage"

path_provider provides several methods. One of them getExternalStorageDirectory(). The android documentation says:

This method was deprecated in API level 29. To improve user privacy, direct access to shared/external storage devices is deprecated. When an app targets Build.VERSION_CODES.Q link

If I use methods path_provider

getExternalStorageDirectory()/storage/emulated/0/Android/data/myapp.name/files getApplicationDocumentsDirectory()/data/user/0/myapp.name/app_flutter

getExternalStorageDirectories(type: StorageDirectory.documents) return List which contains

/storage/emulated/0/Android/data/myapp.name/files/Documents

/storage/1CEE-4019/Android/data/myapp.name/files/Documents

On my android emulator (Api 30) real external documents are located at

/storage/emulated/0/Documents

/storage/emulated/0/Download

How can I access them? As I understand it, there are no alternatives forpath_provider


Solution

  • You can copy paste run full code below
    You can use package https://pub.dev/packages/ext_storage
    code snippet

    String pathDownload = await ExtStorage.getExternalStoragePublicDirectory(
        ExtStorage.DIRECTORY_DOWNLOADS);
    print(pathDownload);
    
    String pathDoc = await ExtStorage.getExternalStoragePublicDirectory(
        ExtStorage.DIRECTORY_DOCUMENTS);
    print(pathDoc);
    

    output

    I/flutter ( 7361): /storage/emulated/0/Download
    I/flutter ( 7361): /storage/emulated/0/Documents
    

    full code

    import 'package:flutter/material.dart';
    import 'package:ext_storage/ext_storage.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() async {
        String pathDownload = await ExtStorage.getExternalStoragePublicDirectory(
            ExtStorage.DIRECTORY_DOWNLOADS);
        print(pathDownload);
    
        String pathDoc = await ExtStorage.getExternalStoragePublicDirectory(
            ExtStorage.DIRECTORY_DOCUMENTS);
        print(pathDoc);
    
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }