java.io.FileNotFoundException: open failed: EACCES (Permission denied) 在真实的 Android 设备上

kmt*_*mtz 5 pdfview android-permissions flutter

我的目标是从 API 服务器下载文件(在本例中为 pdf 文件),然后我想加载该 pdf 并将其显示在 UI 上。我正在使用flutter_pdfview并且我正在遵循本教程如何实现它。首先,权限:在我的android/app/build.gradle targetSdkVersion是 29 以及compileSdkVersion. 在android/app/main/AndroidManifest.xml我下面写的<application ... android:requestLegacyExternalStorage="true"> ,我在同一个文件夹中添加了这些权限。

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

获取请求:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

使用选项 1,我在内部存储中找到了 pdf 文件,但它仍然给我一个错误。像那个人那样使用选项 2,我在设备上的任何地方都找不到它。此外,我已在手机中手动授予存储访问权限,但这也无济于事。

Future<File> getFile(String id) async {
    _isLoading = true;
    notifyListeners();
    var headers = {
      'Authorization': 'JWT ${_authenticatedUser.token}',
      'Content-Type': 'application/x-www-form-urlencoded',
      'Accept': 'application/json',
    };
    try {
      final http.Response response = await http.get(
          'api-host/pdf',
          headers: headers);
      var bytes = response.bodyBytes;
      var dir = await getExternalStorageDirectory();// Option 1
      //var dir = awiat getApplicationDocumentsDirectory(); //Option 2
      File file = File("${dir.path}/mypdfonline.pdf");
      File urlFile = await file.writeAsBytes(bytes);
      if (response.statusCode != 200) {
        _isLoading = false;
        notifyListeners();
        throw Exception('get error: statusCode= ${response.headers}');
      }
      _isLoading = false;
      notifyListeners();
      return urlFile;
    } catch (e) {
      _isLoading = false;
      notifyListeners();
      throw Exception("Error opening url file");
    }
  }
Run Code Online (Sandbox Code Playgroud)

Oma*_*att 0

您需要存储权限才能在设备存储上写入数据。您可以使用permission_handler插件来管理存储权限。

// Check for existing storage permission
if (await Permission. storage.request().isGranted) {
  // Run after verifying storage permission
}
Run Code Online (Sandbox Code Playgroud)