我遇到了一些麻烦,无法在Android设备上获得对外部存储的权限。
当我尝试在外部存储中创建目录时,出现此错误(我仅出于本示例更改了目录。在我自己的项目中,目录名称不同):
I/flutter (12727): ??? EXCEPTION CAUGHT BY GESTURE ????????????????????????????????????????????????????????????????????
I/flutter (12727): The following FileSystemException was thrown while handling a gesture:
I/flutter (12727): Creation failed, path = '/storage/emulated/0/com.domain.bundle' (OS Error: Permission denied,
I/flutter (12727): errno = 13)
I/flutter (12727):
Run Code Online (Sandbox Code Playgroud)
我已经添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
到清单文件并重建整个项目。我还能尝试什么?
同样,仅列出外部存储中的所有文件也会产生相同的权限错误。
希望听到!
小智 10
在 Android Q 中,将通过在 AndroidManifest 文件中添加以下行来解决此错误:
<application
android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)
除了需要添加WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE您的android/app/src/main/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.yyy">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
...
</manifest>
Run Code Online (Sandbox Code Playgroud)
通过使用simple_permissions包,您还需要Runtime Request Permission:
import 'package:simple_permissions/simple_permissions.dart';
PermissionStatus permissionResult = await SimplePermissions.requestPermission(Permission. WriteExternalStorage);
if (permissionResult == PermissionStatus.authorized){
// code of read or write file in external storage (SD card)
}
Run Code Online (Sandbox Code Playgroud)
注意:
SimplePermissions.requestPermission?应用程序将弹出一个窗口,您必须单击ALLOW:
给予许可。
DENY,则可以通过卸载调试应用程序进行调试,然后重新调试以将其安装以修复此->触发弹出窗口,并给您更改为click ALLOW。请使用包permission_handler来请求权限。
https://pub.dev/packages/permission_handler
https://github.com/BaseflowIT/flutter-permission-handler
import 'package:permission_handler/permission_handler.dart';
...
void _showFilesinDir({Directory dir}) {
dir.list(recursive: false, followLinks: false)
.listen((FileSystemEntity entity) {
print(entity.path);
});
}
...
onTap: () async{
Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]);
var systemTempDir = Directory.systemTemp;
_showFilesinDir(dir: systemTempDir);
final myDir = new Directory('/sdcard');
myDir.exists().then((isThere) {
isThere ? _showFilesinDir(dir: myDir) : print('non-existent');
});
}
...
Run Code Online (Sandbox Code Playgroud)
模拟器的结果如下所示:
I/flutter (19980): /data/user/0/xxx.login_challenge/code_cache/flutter_engine <br>
I/flutter (19980): /data/user/0/xxx.login_challenge/code_cache/login_challengeMSBLSX <br>
...
I/flutter (19980): /sdcard/Android <br>
Run Code Online (Sandbox Code Playgroud)
小智 6
首先你需要在你的
android/app/src/main/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.yyy">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
...
</manifest>
Run Code Online (Sandbox Code Playgroud)
然后将permission_handler包添加到您的项目Permission_handler - pub.dev
然后在你的代码中你可以做这样的事情:
final permissionStatus = await Permission.storage.status;
if (permissionStatus.isDenied) {
// Here just ask for the permission for the first time
await Permission.storage.request();
// I noticed that sometimes popup won't show after user press deny
// so I do the check once again but now go straight to appSettings
if (permissionStatus.isDenied) {
await openAppSettings();
}
} else if (permissionStatus.isPermanentlyDenied) {
// Here open app settings for user to manually enable permission in case
// where permission was permanently denied
await openAppSettings();
} else {
// Do stuff that require permission here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6284 次 |
| 最近记录: |