首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >路径提供程序颤振下载文件

路径提供程序颤振下载文件
EN

Stack Overflow用户
提问于 2022-01-05 09:03:35
回答 1查看 1.5K关注 0票数 0

我想在我的应用程序中下载这个文件,我使用了Diopath_providerpermission_handler,所以我应该在的安卓清单和ios的信息中写一些东西。

我做到了。但是它没有工作,当我点击“下载”按钮时,我得到了这个错误:

代码语言:javascript
运行
复制
I/flutter (11919): Directory: '/storage/emulated/0/Android/data/com.example.podkadeh/files'
I/flutter (11919): FileSystemException: Cannot open file, path = '/storage/emulated/0/podkadeh/Image/image.jpg' (OS Error: Permission denied, errno = 13)
I/flutter (11919): Problem Downloading File

这个OS Error: Permission denied, errno = 13

我在清单上写了这一行:

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    tools:ignore="ScopedStorage"/>
<uses-permission android:name="android.permission"

并在“应用程序”中写到:

android:requestLegacyExternalStorage="true"

但是,它仍然不工作,我不能下载它

下面是我的下载文件代码:

代码语言:javascript
运行
复制
class DownloadImage extends StatefulWidget {
  const DownloadImage (
      {Key? key,})
      : super(key: key);    
  @override
  _DownloadImage State createState() => _DownloadImage State();
}
class _DownloadImageState extends State<DownloadImage > {

 Future<bool> saveImageUrl(String url, String fileName) async {
    Directory? directory;
    try {
      if (Platform.isAndroid) {
        if (await _requestPermission(Permission.storage)) {
          directory = await getExternalStorageDirectory();
          String newPath = "";
          print(directory);
          List<String> paths = directory!.path.split("/");
          for (int x = 1; x < paths.length; x++) {
            String folder = paths[x];
            if (folder != "Android") {
              newPath += "/" + folder;
            } else {
              break;
            }
          }
          newPath = newPath + "/podkadeh" + "/Image";
          directory = Directory(newPath);
        } else {
          return false;
        }
      } else {
        if (await _requestPermission(Permission.photos)) {
          directory = await getTemporaryDirectory();
        } else {
          return false;
        }
      }
      File saveFile = File(directory.path + "/$fileName");
      if (!await directory.exists()) {
        await directory.create(recursive: true);
      }
      if (await directory.exists()) {
        await dio.download(url, saveFile.path,
            onReceiveProgress: (value1, value2) {
              setState(() {
                progress = value1 / value2;
              });
            });
        if (Platform.isIOS) {
          await ImageGallerySaver.saveFile(saveFile.path,
              isReturnPathOfIOS: true);
        }
        return true;
      }
      return false;
    } catch (e) {
      print(e);
      return false;
    }
  }

  Future<bool> _requestPermission(Permission permission) async {

    if (await permission.isGranted) {
      return true;
    } else {
      var result = await permission.request();
      if (result == PermissionStatus.granted) {
        return true;
      }
    }
    return false;
  }

  downloadFile() async {
    setState(() {
      loading = true;
      progress = 0;
    });

    bool downloadedImage =  await saveImageUrl(
        "https://test.podkadeh.ir/image-cache/Ep-61c9c0152ab37f246dd35a65-500.jpg",
        "image.jpg");

    if (downloadedImage) {
      print("File Downloaded");
    } else {
      print("Problem Downloading File");
    }
    setState(() {
      loading = false;
    });
  }



  @override
  Widget build(BuildContext context) {
    return (progress != 0 && progress != 100)
        ? CircularProgressIndicator(
            backgroundColor: loading ? Colors.amber : Colors.black,
            valueColor:
                AlwaysStoppedAnimation(loading ? Colors.blue : Colors.pink),
            strokeWidth: progress,
            value: progress,
          )
        : IconButton(

            icon: SvgPicture.asset(MyIcons.frame, color: MyColors.black,height: 20,width: 20,),
            onPressed: downloadFile,
            padding: const EdgeInsets.all(10),
          );
  }
}

顺便说一下,我使用compileSdkVersion 31,在gradle.properties中使用这个:

代码语言:javascript
运行
复制
android.useAndroidX=true
android.enableJetifier=true 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-05 22:03:00

我用以下解决方案解决了这个问题:我不只是请求Permission.storage,而是添加了两个权限请求,Permission.accessMediaLocation , Permission.manageExternalStorage以支持所有版本的Android。

代码语言:javascript
运行
复制
try {
  if (Platform.isAndroid) {
    if (await _requestPermission(Permission.storage) &&
      await _requestPermission(Permission.accessMediaLocation) &&
      await _requestPermission(Permission.manageExternalStorage)) {
         directory = await getExternalStorageDirectory();
         String newPath = "";
         print(directory);
         .......

结果是:

代码语言:javascript
运行
复制
Performing hot restart...
Syncing files to device Android SDK built for x86...
Restarted application in 2,177ms.
I/flutter ( 3712): Directory: '/storage/emulated/0/Android/data/com.example.untitled/files'
I/flutter ( 3712): File Downloaded
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70590193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档