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

Upvotes: 5

Views: 8681

Answers (2)

niaz muhammad
niaz muhammad

Reputation: 75

you va use external_path package

Upvotes: 3

chunhunghan
chunhunghan

Reputation: 54365

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),
      ),
    );
  }
}

Upvotes: 1

Related Questions