【问题标题】:How to get rid of: "FileSystemException: Cannot open file, path = '...' (OS Error: Permission denied, errno = 13)"?如何摆脱:“FileSystemException:无法打开文件,路径='...'(操作系统错误:权限被拒绝,errno = 13)”?
【发布时间】:2020-02-29 13:45:54
【问题描述】:

我试图在我的 Flutter 应用中显示我手机中的图像并收到以下错误:

Another exception was thrown: FileSystemException: Cannot open file, path = '/storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1570277797774' (OS Error: Permission denied, errno = 13)

我不明白Permission denied 部分,因为我添加了...

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

...到我的android/app/src/mainAndroidManifest.xml 文件,运行该应用程序时显示它确实具有读取文件的权限:

我试图打开的文件也存在并且看起来很好 - 我也可以用其他应用程序打开它: 这是我的代码:

import 'dart:io';

import 'package:flutter/material.dart';

void main() => runApp(FileOps());

class FileOps extends StatefulWidget {
  _FileOpsState createState() => _FileOpsState();
}

class _FileOpsState extends State<FileOps> {
  File localFile;
  String widgetTitle = 'Show Image';

  @override
  void initState() {
    super.initState();
    localfile.then((File _localFile) {
      setState(() {
        localFile = _localFile;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: widgetTitle,
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: Text(widgetTitle),
        ),
        body: Column(
          children: <Widget>[
            Image.file(localFile),
          ],
        ),
      ),
    );
  }

  Future<File> get localfile async {
    String imgPath =
        '/storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1570277797774';
    return File(imgPath);
  }
}

我的 pubspec.yaml:

name: template_app
description: A template Flutter app for testing and minimal examples

version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons:

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

cmets中的问题答案:

  • “com.android.providers.media”不是我的应用程序的名称,我知道它是什么 - 但我要打开的图像在那里
  • 我的 Android 版本是 8.0.0,我的手机也在运行 EMUI 8.0.0(我知道它到底是什么,一些华为的东西)
  • 我可以使用手机自带的标准应用“图库”打开文件

【问题讨论】:

  • com.android.providers.media ?那是你的应用吗?
  • 您使用的是 Android Q 吗?
  • I can open it with other apps as well: 还有哪些应用程序?还是只有系统文件应用?
  • 您也可以自己尝试列出该目录中的文件。您在运行时要求用户确认清单中提到的权限?
  • 所以你没有添加代码在运行时要求用户确认那些请求的权限?

标签: android flutter


【解决方案1】:

我通过执行摆脱了这个错误 终端中的flutter clean &amp;&amp; flutter pub get

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

API 29+

无需配置

API

android:requestLegacyExternalStorage="true" 作为属性添加到AndroidManifest.xml 中的标签。在面向 Android Q 的应用上,该属性默认为 false

【讨论】:

    【解决方案3】:

    注意:我的答案现在有点老了,我听说permission_handler 的新版本现在的工作方式有点不同 - 所以我猜现在只需谷歌它是如何工作的。

    我明白了 - &lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/&gt; 似乎只定义了需要哪些权限,但实际上并没有请求它们:D
    所以我手动请求了权限,然后一切正常:

    我关注了this tutorial

    1. 我将permission_handler: 添加到pubspec.yaml
    2. 将我的 get localfile 获取方法更改为:
      Future<File> get localfile async {
        final PermissionHandler _permissionHandler = PermissionHandler();
        var result = await _permissionHandler.requestPermissions([PermissionGroup.storage]);
        if (result[PermissionGroup.storage] == PermissionStatus.granted) {
          // permission was granted
          String imgPath = '/storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1570277797774';
          return File(imgPath);
        }
      }
    

    【讨论】:

    • 我还建议将android:requestLegacyExternalStorage="true" 添加到您的&lt;application.../&gt; 标签中,以适应Android Q 及更高版本。
    • @Pierre Buddy,你真的拯救了我的一天。我在一个生产应用程序中遇到问题,其中集成的 android 扫描模块无法保存文件。不是颤振项目,而是添加这个标签来扫描 android 模块解决了我的问题。这么多?
    【解决方案4】:

    对我有用的是

    首先在android/app/build.gradle

    • 将您的 compileSdkVersion 设置为 29(当前最高)

    • 将 targetSdkVersion 设置为 29(当前最高)

    其次在android/app/src/main/AndroidManifest.xml中

    • 在标签中添加 android:requestLegacyExternalStorage="true

    然后重建,看看它是否适合你

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 2023-02-14
      • 2021-07-09
      • 2022-07-17
      • 2020-12-08
      • 2022-09-27
      相关资源
      最近更新 更多