简体   繁体   English

如何在 Flutter 中获取下载路径?

[英]How to get Downloads path in Flutter?

I am using the below code to get the path to Downloads folder:我正在使用以下代码获取下载文件夹的路径:

final output = await getExternalStorageDirectory();
RegExp pathToDownloads = new RegExp(r'.+0\/');
final outputPath = '${pathToDownloads.stringMatch(output.path).toString()}Downloads';

The above code generates this string: /storage/emulated/0/Downloads上面的代码生成这个字符串: /storage/emulated/0/Downloads

But console says "No such file or directory".但是控制台说“没有这样的文件或目录”。 I created this path string because some answers on stack overflow mention that the above is the location of the downloads folder but it isn't.我创建了这个路径字符串,因为堆栈溢出的一些答案提到上面是下载文件夹的位置,但它不是。 So what is the path to downloads folder on android and how to get access to it?那么 android 上的下载文件夹的路径是什么以及如何访问它?

You can copy paste run full code below您可以在下面复制粘贴运行完整代码
The following example code write a text file to Downloads folder以下示例代码将文本文件写入Downloads文件夹

Step 1: You can add WRITE_EXTERNAL_STORAGE to AndroidManifest.xml第 1 步:您可以将WRITE_EXTERNAL_STORAGE添加到AndroidManifest.xml

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

Step 2: Use package ext_storage https://pub.dev/packages/ext_storage and Request permission with https://pub.dev/packages/permission_handler 4.4.0第 2 步:使用 package ext_storage https://pub.dev/packages/ext_storage并使用 Z5E056C500A1C4B6A7110B540D807BADE_handler 请求权限4.dev.dev.08/permission_handler://4.

dependencies:
  flutter:
    sdk: flutter
  ext_storage: any
  permission_handler: 4.4.0 

Step 4: Request permission第 4 步:请求许可

 void requestPermission() {
    PermissionHandler().requestPermissions([PermissionGroup.storage]);
  }

Step 5: get Downloads folder with ExtStorage.getExternalStoragePublicDirectory第 5 步:使用ExtStorage.getExternalStoragePublicDirectory获取Downloads文件夹

String path = await ExtStorage.getExternalStoragePublicDirectory(
        ExtStorage.DIRECTORY_DOWNLOADS);

working demo工作演示

在此处输入图像描述

full code完整代码

import 'package:flutter/material.dart';
import 'package:ext_storage/ext_storage.dart';
import 'dart:io';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      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 path = await ExtStorage.getExternalStoragePublicDirectory(
        ExtStorage.DIRECTORY_DOWNLOADS);
    print(path);
    File file = await File('$path/counter.txt');
    file.writeAsString('this is test');

    setState(() {
      _counter++;
    });
  }

  void requestPermission() {
    PermissionHandler().requestPermissions([PermissionGroup.storage]);
  }

  @override
  void initState() {
    requestPermission();
    super.initState();
  }

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM