android - 即使授予存储权限也无法在Samsung手机上创建目录

标签 android flutter dart android-permissions file-permissions

在启动应用程序时,我在存储中创建了一个文件夹。为此,我要求initState()内的权限。只有完成后,目录检查才能继续进行。

@override
  void initState(){
    super.initState();
    easyDir = Directory(widget.folderPath);
    getPermissionStatus().whenComplete(() {
      setState(() {
        //never call async operations in setState, do it in a function call.
        directoryCheck();
      });
    });
  }
folderPathpermission_handler包生成。我的手机是/storage/emulated/0/Documents/easyFolder
  //check if directory exists, create if not.
  Future<void> directoryCheck() async {
    // using awaits fixed my problem of setstate being called before
    // directory was created.. and calling setState at end
    exists = await easyDir.exists();
    if (!exists){
      await new Directory(widget.folderPath).create(recursive: true);
      exists = true;
    }
    setState(() {

    });

  }

Future<void> getPermissionStatus() async {
    _status = await Permission.storage.status;
    // if permission is not granted yet, request it and update _status
    if (_status != PermissionStatus.granted){
      await Permission.storage.request();
      _status = await Permission.storage.status;
    }
  }
这在模拟器上按预期工作。该应用程序在启动时会请求许可,等待其完成,并在允许时创建目录。
但是,当安装在我的三星手机甚至是 friend 手机(三星)上时,即使授予了权限,也会由于拒绝权限而无法创建该文件夹。
这是我在三星手机上收到的错误:
E/flutter (23275): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: FileSystemException: Creation failed, path = '/storage/emulated/0/Documents' (OS Error: Permission denied, errno = 13)
我显然在启动应用程序时获得了许可。更重要的是,当我进入应用程序的appinfo时,它表明Storage权限已被授予。
我尝试在华为和小米手机上安装此程序,并且都按预期工作。
我在这里做错了什么?
这是我的AndroindManifest中的权限行
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
如果有帮助,这里是错误堆栈:
E/flutter (23275): #0      _Directory.create.<anonymous closure> (dart:io/directory_impl.dart:124:11)
E/flutter (23275): #1      _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter (23275): #2      _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter (23275): #3      _FutureListener.handleValue (dart:async/future_impl.dart:141:18)
E/flutter (23275): #4      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:682:45)
E/flutter (23275): #5      Future._propagateToListeners (dart:async/future_impl.dart:711:32)
E/flutter (23275): #6      Future._completeWithValue (dart:async/future_impl.dart:526:5)
E/flutter (23275): #7      Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:556:7)
E/flutter (23275): #8      _rootRun (dart:async/zone.dart:1184:13)
E/flutter (23275): #9      _CustomZone.run (dart:async/zone.dart:1077:19)
E/flutter (23275): #10     _CustomZone.runGuarded (dart:async/zone.dart:979:7)
E/flutter (23275): #11     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1019:23)
E/flutter (23275): #12     _microtaskLoop (dart:async/schedule_microtask.dart:43:21)
E/flutter (23275): #13     _startMicrotaskLoop (dart:async/schedule_microtask.dart:52:5)
E/flutter (23275): 

最佳答案

我觉得奇怪的是,该代码无法在Android 11中正常运行,但不能在Android 10中正常运行,因为新的作用域存储会导致Android 10 (Q)及更高版本的写入权限失败
现在,请在 list 中尝试执行此操作,以选择退出Android 10中的范围存储(在Android 11中不执行任何操作),

<manifest ... >
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<!-- This attribute is "false" by default on apps targeting
     Android 10 or higher. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

Caution: After you update your app to target Android 11 (API level 30), the system ignores the requestLegacyExternalStorage attribute when your app is running on Android 11 devices, so your app must be ready to support scoped storage and to migrate app data for users on those devices.


More info about Scoped Storage here
现在,一些问题可以帮助您解决此问题:

the folderPath is produced by the permission_handler


我不记得在要求许可权时要返回一个路径path_handler,您能详细说明一下如何获得widget.folderPath吗?

The Emulator is running Android version 11. While my Samsung phone is on Android version 10


华为和小米设备怎么样,它们也都运行Android 10吗?
您在gradle中的compileSdkVersion / targetSdkVersion或AndroidManifest中的targetSdk是什么?

关于android - 即使授予存储权限也无法在Samsung手机上创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63404356/

相关文章:

dart - 如何在 Flutter 中使用 Bloc 正确设置 DropdownButton 的值?

android - Flutter dart 调试器断点停止工作

java - NFC - OnNewIntent() 有时无法在 Android 设备上运行

android - 在 adt&sdk 20 上使用混淆器时导出 Android 项目

android - 如何为移动应用程序创建演示

flutter :水平 ListView 项之间的空间

android - 处理 android 通知中的按钮

firebase - 将数据添加到Firestore

image - 在 Flutter works 中显示图像一次

dart - 页面加载事件