Доступ к Flutter запрещен, когда я пытаюсь записать файл в указанную папку c - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь записать текстовый файл в указанное c местоположение (местоположение выбирается пользователем с помощью file_picker, и я хочу, чтобы файл был виден пользователю)

Я добавил

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

в AndroidManifest. xml и запросить доступ во время выполнения

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:file_picker/file_picker.dart';
import 'package:permission_handler/permission_handler.dart';

void main() => runApp(MaterialApp(home: MyHomePage()));

class MyHomePage extends StatelessWidget {
  @override
  Future<void> write() async {
    var status = await Permission.storage.request();

    if (status.isGranted) {
      String directory = await FilePicker.getDirectoryPath();
      var status = await Permission.storage.request();
      File file = File(directory + 'test.txt');
      file.createSync();

      file.writeAsStringSync(
          'Here is some text to test the ability to write to external folder');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FlatButton(
          child: Text('Write to file'),
          onPressed: () {
            write();
          },
        ),
      ),
    );
  }
}

Появляется эта ошибка

D/EGL_emulation(31407): eglMakeCurrent: 0xe9467200: ver 3 0 (tinfo 0xe940f630)
I/FilePickerDelegate(31407): [SingleFilePick] File URI:content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Ffoo/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Ffoo
I/FilePickerDelegate(31407): Absolute file path:/
D/eglCodecCommon(31407): setVertexArrayObject: set vao to 0 (0) 0 0
D/EGL_emulation(31407): eglCreateContext: 0xdde235c0: maj 3 min 0 rcv 3
D/EGL_emulation(31407): eglMakeCurrent: 0xdde235c0: ver 3 0 (tinfo 0xdde38a70)
D/EGL_emulation(31407): eglMakeCurrent: 0xe9467200: ver 3 0 (tinfo 0xe940f630)
E/flutter (31407): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: FileSystemException: Cannot create file, path = '/test.txt' (OS Error: Read-only file system, errno = 30)
E/flutter (31407): #0      _File.throwIfError (dart:io/file_impl.dart:645:7)
E/flutter (31407): #1      _File.createSync (dart:io/file_impl.dart:283:5)
E/flutter (31407): #2      MyHomePage.write (package:store_to_phone_files/main.dart:18:12)
E/flutter (31407): <asynchronous suspension>
E/flutter (31407): #3      MyHomePage.build.<anonymous closure> (package:store_to_phone_files/main.dart:32:13)
E/flutter (31407): #4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:779:19)
E/flutter (31407): #5      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:862:36)
E/flutter (31407): #6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (31407): #7      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:504:11)
E/flutter (31407): #8      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:282:5)
E/flutter (31407): #9      BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:217:7)
E/flutter (31407): #10     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:475:9)
E/flutter (31407): #11     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:76:12)
E/flutter (31407): #12     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:122:9)
E/flutter (31407): #13     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
E/flutter (31407): #14     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:120:18)
E/flutter (31407): #15     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:106:7)
E/flutter (31407): #16     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:218:19)
E/flutter (31407): #17     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter (31407): #18     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (31407): #19     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (31407): #20     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (31407): #21     _rootRunUnary (dart:async/zone.dart:1196:13)
E/flutter (31407): #22     _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter (31407): #23     _CustomZone.runUnaryGuarded (dart:async/zone.dart:987:7)
E/flutter (31407): #24     _invoke1 (dart:ui/hooks.dart:275:10)
E/flutter (31407): #25     _dispatchPointerDataPacket (dart:ui/hooks.dart:184:5)
E/flutter (31407): 
D/EGL_emulation(31407): eglMakeCurrent: 0xdde235c0: ver 3 0 (tinfo 0xdde38a70)
D/eglCodecCommon(31407): setVertexArrayObject: set vao to 0 (0) 0 0

ПРИМЕЧАНИЕ. Я знаю, что могу записать файл в каталог приложения с помощью path_provider, но я хочу, чтобы пользователь выбирал расположение файла, и я хочу, чтобы файл был виден пользователю.

1 Ответ

0 голосов
/ 06 августа 2020

FilePicker.getDirectoryPath () не возвращает действительный каталог (он возвращает относительный путь), я не знаю почему.

поэтому, когда я пишу его вручную

 String directory = '/storage/emulated/0/Download/';

это работает

я нашел это в https://github.com/miguelpruivo/flutter_file_picker/wiki/Troubleshooting:

? Проблема: я выбираю каталог через getDirectoryPath (), но выдает ошибку или пустой путь. ? Возможное решение: на Android есть несколько каталогов, которые нельзя выбрать для записи «вручную», одна из них - это папка загрузок, которая может даже возвращать только пустой путь (/).

благодаря blackapps.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...