Netsu
Netsu

Reputation: 1499

Write file to directory with allowed access on Android

I want to export a save file so the user can later import it into the app again later, but how do I allow exporting to a directory outside the app dir (/Android/com.app/files)

if (!(await Permission.storage.request().isGranted)) return;

final String? exportPath = await FilePicker.platform.getDirectoryPath();

if (exportPath == null) return;

File exportFile = await File(
  "$exportPath/zs_tracker_data.sav",
).create(recursive: true);

This code is backed by these gradle properties:

android.useAndroidX=true
android.enableJetifier=true

With compileSdkVersion 33 selected, and these permissions:

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

All of these above allows me to get a path, and then get this prompt:Allow Access In Dir Prompt

However, even when I press 'Allow', I am not allowed to touch that directory and get: Unhandled Exception: FileSystemException: Cannot create file, path = '/storage/emulated/0/Backups/zs_tracker_data.sav' (OS Error: Operation not permitted, errno = 1)

I've considered allowing MANAGE_EXTERNAL_STORAGE, but then my app won't be allowed on Play Store, since the only reasons it needs storage permissions are for creating backups and importing backups. I've also seen this post: Flutter read/write to external storage with Android SDK 30+, but the answer blows over my head completely and seems horribly over complex for my simple backup export/importing...

How do I go about this in a decently simple way? I just want to be able to save the exported file somewhere where the user can easily find it

Upvotes: 1

Views: 2175

Answers (1)

user18309290
user18309290

Reputation: 8300

Maybe use a totally different approach which doesn't require any permissions. Use sharing to allow a user to choose whatever a destination she/he desires. For example using share_plus plugin:

Share.shareFiles(['<path to file>'], text: 'Export file');

Upvotes: 2

Related Questions