diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 535a429..1e2f4d3 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -51,4 +51,7 @@
+
\ No newline at end of file
diff --git a/assets/translations/de.json b/assets/translations/de.json
index 441421c..9b0208d 100644
--- a/assets/translations/de.json
+++ b/assets/translations/de.json
@@ -209,6 +209,7 @@
"addCategory": "Kategorie hinzufügen",
"label": "Bezeichnung",
"language": "Sprache",
+ "storagePermissionDenied": "Storage permission denied",
"tooManyRequestsTryAgainInMinutes": {
"one": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minute erneut",
"other": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minuten erneut"
diff --git a/assets/translations/en.json b/assets/translations/en.json
index 8231108..c9925cf 100644
--- a/assets/translations/en.json
+++ b/assets/translations/en.json
@@ -209,6 +209,7 @@
"addCategory": "Add Category",
"label": "Label",
"language": "Language",
+ "storagePermissionDenied": "Storage permission denied",
"tooManyRequestsTryAgainInMinutes": {
"one": "Too many requests (rate limited) - try again in {} minute",
"other": "Too many requests (rate limited) - try again in {} minutes"
diff --git a/assets/translations/hu.json b/assets/translations/hu.json
index 320b229..ebf0698 100644
--- a/assets/translations/hu.json
+++ b/assets/translations/hu.json
@@ -207,6 +207,8 @@
"categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.",
"addCategory": "Új kategória",
"label": "Címke",
+ "language": "Language",
+ "storagePermissionDenied": "Storage permission denied",
"tooManyRequestsTryAgainInMinutes": {
"one": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva",
"other": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva"
diff --git a/assets/translations/it.json b/assets/translations/it.json
index 30b1d1b..31c657c 100644
--- a/assets/translations/it.json
+++ b/assets/translations/it.json
@@ -209,6 +209,7 @@
"addCategory": "Aggiungi categoria",
"label": "Etichetta",
"language": "Lingua",
+ "storagePermissionDenied": "Storage permission denied",
"tooManyRequestsTryAgainInMinutes": {
"one": "Troppe richieste (traffico limitato) - riprova tra {} minuto",
"other": "Troppe richieste (traffico limitato) - riprova tra {} minuti"
diff --git a/assets/translations/ja.json b/assets/translations/ja.json
index 86c9b3f..bab4d54 100644
--- a/assets/translations/ja.json
+++ b/assets/translations/ja.json
@@ -209,6 +209,7 @@
"addCategory": "カテゴリを追加",
"label": "ラベル",
"language": "言語",
+ "storagePermissionDenied": "Storage permission denied",
"tooManyRequestsTryAgainInMinutes": {
"one": "リクエストが多すぎます(レート制限)- {}分後に再試行してください",
"other": "リクエストが多すぎます(レート制限)- {}分後に再試行してください"
diff --git a/assets/translations/zh.json b/assets/translations/zh.json
index 36cf8c2..510c76d 100644
--- a/assets/translations/zh.json
+++ b/assets/translations/zh.json
@@ -209,6 +209,7 @@
"addCategory": "Add Category",
"label": "Label",
"language": "Language",
+ "storagePermissionDenied": "Storage permission denied",
"tooManyRequestsTryAgainInMinutes": {
"one": "请求过多 (API 限制) - 在 {} 分钟后重试",
"other": "请求过多 (API 限制) - 在 {} 分钟后重试"
diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart
index 556e017..5d09d00 100644
--- a/lib/pages/import_export.dart
+++ b/lib/pages/import_export.dart
@@ -66,6 +66,8 @@ class _ImportExportPageState extends State {
showError(
tr('exportedTo', args: [path]),
context);
+ }).catchError((e) {
+ showError(e, context);
});
},
child: Text(tr('obtainiumExport')))),
diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart
index 67ff3f3..aa5c2fd 100644
--- a/lib/providers/apps_provider.dart
+++ b/lib/providers/apps_provider.dart
@@ -17,6 +17,7 @@ import 'package:obtainium/providers/logs_provider.dart';
import 'package:obtainium/providers/notifications_provider.dart';
import 'package:obtainium/providers/settings_provider.dart';
import 'package:package_archive_info/package_archive_info.dart';
+import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter_fgbg/flutter_fgbg.dart';
@@ -706,6 +707,14 @@ class AppsProvider with ChangeNotifier {
exportDir = await getExternalStorageDirectory();
path = exportDir!.path;
}
+ if ((await DeviceInfoPlugin().androidInfo).version.sdkInt <= 28) {
+ if (await Permission.storage.isDenied) {
+ await Permission.storage.request();
+ }
+ if (await Permission.storage.isDenied) {
+ throw ObtainiumError(tr('storagePermissionDenied'));
+ }
+ }
File export = File(
'${exportDir.path}/${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().millisecondsSinceEpoch}.json');
export.writeAsStringSync(