diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 66239acd0..d2a9593e0 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,8 +6,7 @@
-
-
+
0;
-
- for (int grant : grantResults) {
- if (grant != PackageManager.PERMISSION_GRANTED) {
- success = false;
- }
- }
-
- if (!success) {
- // External storage permission rejected, inform user that
- // import/export is prevented
- Toast.makeText(getApplicationContext(), R.string.noExternalStoragePermissionError,
- Toast.LENGTH_LONG).show();
- }
-
- }
- }
-
@Override
protected void onDestroy() {
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
index 49e5f725d..e673c6ed4 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
@@ -111,6 +111,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
private static final int PERMISSION_REQUEST_CAMERA_IMAGE_FRONT = 100;
private static final int PERMISSION_REQUEST_CAMERA_IMAGE_BACK = 101;
private static final int PERMISSION_REQUEST_CAMERA_IMAGE_ICON = 102;
+ private static final int PERMISSION_REQUEST_STORAGE_IMAGE_FRONT = 103;
+ private static final int PERMISSION_REQUEST_STORAGE_IMAGE_BACK = 104;
+ private static final int PERMISSION_REQUEST_STORAGE_IMAGE_ICON = 105;
public static final String BUNDLE_ID = "id";
public static final String BUNDLE_DUPLICATE_ID = "duplicateId";
@@ -981,14 +984,55 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_FRONT) {
+ boolean allowed = grantResults[0] == PackageManager.PERMISSION_GRANTED;
+ Integer failureReason = null;
+
+ if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_FRONT) {
+ if (allowed) {
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_FRONT);
- } else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_BACK) {
- takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_BACK);
- } else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_ICON) {
- takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_ICON);
+ return;
}
+
+ failureReason = R.string.cameraPermissionRequired;
+ } else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_BACK) {
+ if (allowed) {
+ takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_BACK);
+ return;
+ }
+
+ failureReason = R.string.cameraPermissionRequired;
+ } else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_ICON) {
+ if (allowed) {
+ takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_ICON);
+ return;
+ }
+
+ failureReason = R.string.cameraPermissionRequired;
+ } else if (requestCode == PERMISSION_REQUEST_STORAGE_IMAGE_FRONT) {
+ if (allowed) {
+ selectImageFromGallery(Utils.CARD_IMAGE_FROM_FILE_FRONT);
+ return;
+ }
+
+ failureReason = R.string.storageReadPermissionRequired;
+ } else if (requestCode == PERMISSION_REQUEST_STORAGE_IMAGE_BACK) {
+ if (allowed) {
+ selectImageFromGallery(Utils.CARD_IMAGE_FROM_FILE_BACK);
+ return;
+ }
+
+ failureReason = R.string.storageReadPermissionRequired;
+ } else if (requestCode == PERMISSION_REQUEST_STORAGE_IMAGE_ICON) {
+ if (allowed) {
+ selectImageFromGallery(Utils.CARD_IMAGE_FROM_FILE_ICON);
+ return;
+ }
+
+ failureReason = R.string.storageReadPermissionRequired;
+ }
+
+ if (failureReason != null) {
+ Toast.makeText(this, failureReason, Toast.LENGTH_LONG).show();
}
}
@@ -1060,6 +1104,24 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
mPhotoTakerLauncher.launch(photoURI);
}
+ private void selectImageFromGallery(int type) {
+ mRequestedImage = type;
+
+ Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
+ photoPickerIntent.setType("image/*");
+ Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
+ contentIntent.setType("image/*");
+ Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(R.string.addFromImage));
+ chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { contentIntent });
+
+ try {
+ mPhotoPickerLauncher.launch(chooserIntent);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
+ Log.e(TAG, "No activity found to handle intent", e);
+ }
+ }
+
class EditCardIdAndBarcode implements View.OnClickListener {
@Override
public void onClick(View v) {
@@ -1141,63 +1203,38 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
cardOptions.put(getString(R.string.takePhoto), () -> {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- int permissionRequestType;
+ int permissionRequestType;
- if (v.getId() == R.id.frontImageHolder) {
- permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_FRONT;
- } else if (v.getId() == R.id.backImageHolder) {
- permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_BACK;
- } else if (v.getId() == R.id.thumbnail) {
- permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_ICON;
- } else {
- throw new IllegalArgumentException("Unknown ID type " + v.getId());
- }
-
- requestPermissions(new String[]{Manifest.permission.CAMERA}, permissionRequestType);
- } else {
- int cardImageType;
-
- if (v.getId() == R.id.frontImageHolder) {
- cardImageType = Utils.CARD_IMAGE_FROM_CAMERA_FRONT;
- } else if (v.getId() == R.id.backImageHolder) {
- cardImageType = Utils.CARD_IMAGE_FROM_CAMERA_BACK;
- } else if (v.getId() == R.id.thumbnail) {
- cardImageType = Utils.CARD_IMAGE_FROM_CAMERA_ICON;
- } else {
- throw new IllegalArgumentException("Unknown ID type " + v.getId());
- }
-
- takePhotoForCard(cardImageType);
- }
- return null;
- });
-
- cardOptions.put(getString(R.string.addFromImage), () -> {
if (v.getId() == R.id.frontImageHolder) {
- mRequestedImage = Utils.CARD_IMAGE_FROM_FILE_FRONT;
+ permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_FRONT;
} else if (v.getId() == R.id.backImageHolder) {
- mRequestedImage = Utils.CARD_IMAGE_FROM_FILE_BACK;
+ permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_BACK;
} else if (v.getId() == R.id.thumbnail) {
- mRequestedImage = Utils.CARD_IMAGE_FROM_FILE_ICON;
+ permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_ICON;
} else {
throw new IllegalArgumentException("Unknown ID type " + v.getId());
}
- Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
- photoPickerIntent.setType("image/*");
- Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
- contentIntent.setType("image/*");
- Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(R.string.addFromImage));
- chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { contentIntent });
+ PermissionUtils.requestCameraPermission(LoyaltyCardEditActivity.this, permissionRequestType);
- try {
- mPhotoPickerLauncher.launch(chooserIntent);
- } catch (ActivityNotFoundException e) {
- Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
- Log.e(TAG, "No activity found to handle intent", e);
+ return null;
+ });
+
+ cardOptions.put(getString(R.string.addFromImage), () -> {
+ int permissionRequestType;
+
+ if (v.getId() == R.id.frontImageHolder) {
+ permissionRequestType = PERMISSION_REQUEST_STORAGE_IMAGE_FRONT;
+ } else if (v.getId() == R.id.backImageHolder) {
+ permissionRequestType = PERMISSION_REQUEST_STORAGE_IMAGE_BACK;
+ } else if (v.getId() == R.id.thumbnail) {
+ permissionRequestType = PERMISSION_REQUEST_STORAGE_IMAGE_ICON;
+ } else {
+ throw new IllegalArgumentException("Unknown ID type " + v.getId());
}
+ PermissionUtils.requestStorageReadPermission(LoyaltyCardEditActivity.this, permissionRequestType);
+
return null;
});
diff --git a/app/src/main/java/protect/card_locker/PermissionUtils.java b/app/src/main/java/protect/card_locker/PermissionUtils.java
new file mode 100644
index 000000000..b5e2390a7
--- /dev/null
+++ b/app/src/main/java/protect/card_locker/PermissionUtils.java
@@ -0,0 +1,79 @@
+package protect.card_locker;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.pm.PackageManager;
+import android.os.Build;
+
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
+
+public class PermissionUtils {
+ /**
+ * Check if storage read permission is needed.
+ *
+ * This is only necessary on Android 6.0 (Marshmallow) and below. See
+ * https://github.com/CatimaLoyalty/Android/issues/979 for more info.
+ *
+ * @param activity
+ * @return
+ */
+ private static boolean needsStorageReadPermission(Activity activity) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ return false;
+ }
+
+ return ContextCompat.checkSelfPermission(activity, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED;
+ }
+
+ /**
+ * Check if camera permission is needed.
+ *
+ * @param activity
+ * @return
+ */
+ public static boolean needsCameraPermission(Activity activity) {
+ // Android only introduced the runtime permission system in Marshmallow (Android 6.0)
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ return false;
+ }
+
+ return ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED;
+ }
+
+ /**
+ * Call onRequestPermissionsResult after storage read permission was granted.
+ * Mocks a successful grant if a grant is not necessary.
+ *
+ * @param activity
+ * @param requestCode
+ */
+ public static void requestStorageReadPermission(Activity activity, int requestCode) {
+ String[] permissions = new String[]{ android.Manifest.permission.READ_EXTERNAL_STORAGE };
+ int[] mockedResults = new int[]{ PackageManager.PERMISSION_GRANTED };
+
+ if (needsStorageReadPermission(activity)) {
+ ActivityCompat.requestPermissions(activity, permissions, requestCode);
+ } else {
+ activity.onRequestPermissionsResult(requestCode, permissions, mockedResults);
+ }
+ }
+
+ /**
+ * Call onRequestPermissionsResult after camera permission was granted.
+ * Mocks a successful grant if a grant is not necessary.
+ *
+ * @param activity
+ * @param requestCode
+ */
+ public static void requestCameraPermission(Activity activity, int requestCode) {
+ String[] permissions = new String[]{ Manifest.permission.CAMERA };
+ int[] mockedResults = new int[]{ PackageManager.PERMISSION_GRANTED };
+
+ if (needsCameraPermission(activity)) {
+ ActivityCompat.requestPermissions(activity, permissions, requestCode);
+ } else {
+ activity.onRequestPermissionsResult(requestCode, permissions, mockedResults);
+ }
+ }
+}
diff --git a/app/src/main/java/protect/card_locker/ScanActivity.java b/app/src/main/java/protect/card_locker/ScanActivity.java
index 097c6199c..d098da78f 100644
--- a/app/src/main/java/protect/card_locker/ScanActivity.java
+++ b/app/src/main/java/protect/card_locker/ScanActivity.java
@@ -53,6 +53,8 @@ public class ScanActivity extends CatimaAppCompatActivity {
private static final int MEDIUM_SCALE_FACTOR_DIP = 460;
private static final int COMPAT_SCALE_FACTOR_DIP = 320;
+ private static final int PERMISSION_SCAN_ADD_FROM_IMAGE = 100;
+
private CaptureManager capture;
private DecoratedBarcodeView barcodeScannerView;
@@ -226,6 +228,10 @@ public class ScanActivity extends CatimaAppCompatActivity {
}
public void addFromImage(View view) {
+ PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_IMAGE);
+ }
+
+ private void addFromImageAfterPermission() {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
@@ -275,9 +281,15 @@ public class ScanActivity extends CatimaAppCompatActivity {
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (requestCode == CaptureManager.getCameraPermissionReqCode())
+
+ if (requestCode == CaptureManager.getCameraPermissionReqCode()) {
showCameraPermissionMissingText(grantResults[0] != PackageManager.PERMISSION_GRANTED);
-
+ } else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ addFromImageAfterPermission();
+ } else {
+ Toast.makeText(this, R.string.storageReadPermissionRequired, Toast.LENGTH_LONG).show();
+ }
+ }
}
-
}
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 0ea2121eb..652925d0e 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -39,7 +39,6 @@
متصدر
فشل التصدير
لا يمكن عمل التصدير
- امنح التخزين الخارجي اذن لاستيراد وتصدير البيانات
ستتم كتابة البيانات في الموقع الذي تختاره.
من نظام الملفات
استخدم تطبيقًا آخر
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index b1f1fcba6..21c64bcf2 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -34,7 +34,6 @@
Снимка на предната страна
Снимки
Изберете файл на друго приложение.
- Разрешете достъп до хранилището, за да работи внасянето и изнасянето
Картата не е намерена
Идентификаторът е променен. Желаете ли с неговата стойност да бъде променен и щрихкодът\?
Обновяване на щрихкода\?
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index b19a9753b..64b256e6f 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -29,7 +29,6 @@
Export nelze provést
Importuji…
Exportuji…
- Udělit oprávnění přístupu k externímu úložišti pro import nebo export dat
Import ze souborového systému
Vyberte konkrétní soubor v úložišti.
Ze souborového systému
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 044c38fee..ae9386d42 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -67,7 +67,6 @@
Vælg en bestemt fil fra filsystemet.
Import fra filsystem
Dataene skrives til en placering efter eget valg.
- Giv først tilladelse til ekstern lagring til at importere eller eksportere kort
Kunne ikke analysere import-URI\'en
Kunne ikke finde kort
Der er ikke angivet noget kort-ID
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 561de4db3..a6676a763 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -36,7 +36,6 @@
Export konnte nicht durchgeführt werden
Importiere…
Exportiere…
- Berechtigung für den externen Speicher zum Importieren oder Exportieren von Daten erteilen
Importiere aus dem Dateisystem
Wähle eine Datei vom Dateisystem aus.
Wähle vom Dateisystem
diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml
index dd28e1ca1..b42842a18 100644
--- a/app/src/main/res/values-el-rGR/strings.xml
+++ b/app/src/main/res/values-el-rGR/strings.xml
@@ -32,7 +32,6 @@
Δεν ήταν δυνατή η εξαγωγή
Γίνεται εισαγωγή του…
Γίνεται εξαγωγή του…
- Εγκρίνετε την άδεια εξωτερικής αποθήκευσης για να εισάγετε ή εξάγετε δεδομένα
Εισαγωγή από το σύστημα αρχείων
Επιλέξτε ένα συγκεκριμένο αρχείο από το σύστημα αρχείων.
Από το σύστημα αρχείων
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index a20915885..145247973 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -63,7 +63,6 @@
Uzi alian app
Elektu specifa dosiero de la dosiersistemo.
La datumoj estos skribita al loko de via elekto.
- Grant ekstera stokado permeso de importado aŭ eksportado kartoj unua
Ne povis eksporti kartoj
Ne povis importi kartoj
Subtenanta supre vian kartoj permesas vin movi ilin al alia aparato.
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 569c9a25e..942f65db8 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -32,7 +32,6 @@
No se han podido exportar
Importando…
Exportando…
- Otorgar permiso de almacenamiento para importar o exportar datos
Importar desde el sistema de archivos
Elegir un archivo concreto del sistema de archivos.
Desde el sistema de archivos
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index bf4cb189a..2b2026648 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -1,6 +1,5 @@
- Salli käyttöoikeus ulkoisen tallennustilan käyttöön voidaksesi tuoda tai viedä tietoja
Ei
Kyllä
Vaihdoit ID-tunnuksen. Haluatko päivittää myös viivakoodin käyttämään samaa arvoa\?
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index c0cab3102..0ae5cdd9d 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -32,7 +32,6 @@
Impossible d’effectuer l’exportation
Import …
Export …
- Accorder au stockage externe l’autorisation d’importer ou d’exporter des données
Importer depuis le système de fichiers
Choisissez le fichier à importer.
Système de fichiers
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 0634a22ec..4d0a3fcef 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -150,5 +150,4 @@
संस्करण: %s
%s संशोधन के बारे में
आई डी क्लिपबोर्ड पर कॉपी किया गया
- डेटा आयात या निर्यात करने के लिए एक्सटर्नल स्टोरेज एक्सेस प्रदान करें
\ No newline at end of file
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 4ce964895..4abef898a 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -44,7 +44,6 @@
Podaci će biti zabilježeni na odabranom mjestu.
Izvoz nije uspio
Opskrba…
- Najprije odobrite dopuštenje za vanjsku pohranu za uvoz ili izvoz kartica
Odaberite određenu datoteku iz datotečnog sustava.
Koristite drugu aplikaciju
Postavke
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index e5ab424dd..ff56a49ec 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -81,7 +81,6 @@
Exportálás sikertelen
Importálás…
Exportálás…
- Külső háttértárhoz való hozzáférés engedélyezése adat import vagy export miatt
Az adatokat a kiválasztott helyre fogjuk menteni.
Importálás fájlrendszerből
A fájlrendszerből
diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml
index 3f27a2ff6..3925c3980 100644
--- a/app/src/main/res/values-in-rID/strings.xml
+++ b/app/src/main/res/values-in-rID/strings.xml
@@ -96,7 +96,6 @@
Tidak dapat mengekspor
Sedang mengimpor…
Sedang mengekspor…
- Berikan izin penyimpanan eksternal untuk mengimpor atau mengekspor data
Data akan ditulis ke lokasi pilihan Anda.
Impor dari pengelola file bawaan
Pilih file dari pengelola file bawaan.
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index a5aba2f26..c8eb78379 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -33,7 +33,6 @@
Stuðningur upp spil gerir þér kleift að færa þá til annar tæki.
Flutt
Innflutningur mistókst
- Grant ytri geymslu leyfi til að flytja eða flytja spil fyrstu
Gögnum verður skrifað á stað af eigin vali.
Innflutningur frá möppuna
Velja ákveðna skrá frá möppuna.
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 3fba2b1f8..44c4a8fe4 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -37,7 +37,6 @@
Impossibile eseguire l\'esportazione
Importazione in corso…
Esportazione in corso…
- Concedi il permesso di archiviazione esterna per importare o esportare dati
Importa dall\'archivio
Scegli un file dall\'archivio.
Dall\'archivio
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index aac743903..a27433423 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -87,7 +87,6 @@
ストレージからファイルを選択してください。
ストレージからインポート
選択した場所にデータを出力します。
- データをインポート/エクスポートするために外部ストレージへのアクセスを許可してください
エクスポート中…
インポート中…
カードをエクスポートできませんでした
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 448292566..f583b4ae0 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -23,7 +23,6 @@
Nepavyko eksportuoti
Importuoja…
Eksportuoja…
- Pirmiausia suteikite išorinės saugyklos leidimą, kad galėtumėte importuoti arba eksportuoti korteles
Apie
Copylefted laisvoji programinė įranga, licencijuota GPLv3+
Apie %s
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index 01f778129..f52925393 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -48,7 +48,6 @@
Kartes neizdevās eksportēt
Importē…
Eksportē…
- Piešķiriet ārējai atmiņai atļauju vispirms importēt vai eksportēt kartes
Dati tiks saglabāti Jūsu izvēlētajā vietā.
Imports no failu sistēmas
Izvēlieties konkrētu failu no failu sistēmas.
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index f85fbab7b..5481f352f 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -33,7 +33,6 @@
Kunne ikke utføre eksport
Importerer…
Exporterer…
- Innvilg lagringstilgang til eksternlager for å importere eller eksportere data
Data skrives dit du ønsker det.
Importer fra filsystem
Velg spesifikk fil fra filsystemet.
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 96bbd1974..6149dfb86 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -38,7 +38,6 @@
Het exporteren is mislukt
Bezig met importeren…
Bezig met exporteren…
- Verleen het recht ‘externe opslag’ om gegevens te kunnen im- of exporteren
De gegevens worden weggeschreven op een locatie naar keuze.
Importeren uit bestandssysteem
Kies een specifiek bestand van het bestandssysteem.
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 564a93cb3..ecf99aace 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -37,7 +37,6 @@
Nie udało się wyeksportować
Importowanie…
Eksportowanie…
- Zezwalaj na przechowywanie zewnętrzne w celu importowania lub eksportowania danych
Importuj z systemu plików
Wybierz określony plik z systemu plików.
Z systemu plików
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index acada102a..7365d7bdc 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -72,7 +72,6 @@
Subir
Descer
Sair
- Conceda primeiro a autorização de acesso ao armazenamento externo para importar ou exportar dados
A cópia de segurança dos seus dados permite-lhe movê-los para outro dispositivo.
Importado
A importação falhou
diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml
index 53323323c..225c7a91f 100644
--- a/app/src/main/res/values-ro-rRO/strings.xml
+++ b/app/src/main/res/values-ro-rRO/strings.xml
@@ -38,7 +38,6 @@
Nu s-a putut exporta carduri
Importul…
Exportul…
- Acordați mai întâi permisiunea de stocare externă pentru a importa sau exporta carduri
Datele vor fi scrise într-o locație aleasă de dumneavoastră.
Import din sistemul de fișiere
Utilizați o altă aplicație
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index e28ae8eb0..ea5dfaf0f 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -38,7 +38,6 @@
Невозможно выполнить экспорт
Импорт…
Экспорт…
- Импорт или экспорт данных невозможен без разрешения на доступ к хранилищу
Данные будут записаны в выбранное место.
Импорт из файловой системы
Выберете файл на файловой системе.
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index ba13ac010..6d279861c 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -32,7 +32,6 @@
Zlyhal export
Importujem…
Exportujem…
- Nie je možné importovať a exportovať karty bez prístupu k externému úložisku
Import zo súborového systému
Vyberte súbor zo súborového systému.
Zo súborového systému
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index ba6d829f0..30159a8f1 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -32,7 +32,6 @@
Napaka pri izvozu baze
Uvažanje…
Izvažanje…
- Izvažanje in uvažanje je nemogoče brez omogočenega dostopa do zunanje shrambe
Uvozi iz datotečnega sistema
Izberite specifično datoteko iz datotečnega sistema.
Iz datotečnega sistema
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index b01e53fb2..b61ef1adc 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -171,7 +171,6 @@
Anteckning
System
Språk
- Bevilja tillstånd för extern lagring för att kunna importera eller exportera data
Möjliggjordes av: %s
Brunt
Grått
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 135db3bdf..f8152b919 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -128,7 +128,6 @@
Dosya sisteminden belirli bir dosya seçin.
Dosya sisteminden içe aktar
Veriler seçtiğiniz bir konuma yazılacak.
- Verileri içeri veya dışarı aktarmak için harici depolama izni verin
Dışa aktarılıyor…
İçe aktarılıyor…
Dışa aktarma gerçekleştirilemedi
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index e6c091b9d..70cf82cc4 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -106,7 +106,6 @@
Оберіть файл у провіднику.
Імпорт з файлу
Дані буде записано до локації обраної вами.
- Надайте дозвіл на доступ до пам\'яті пристрою для імпорту/експорту даних
Експортуємо…
Імпортуємо…
Неможливо здійснити експорт
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index e375c4bd8..b164e191a 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -94,7 +94,6 @@
请从文件系统选择文件.
从文件系统导入
导出的数据将储存至你选择的位置.
- 在导入导出前需要获得外部储存权限
无法访问相机
Catima需要访问您的相机来扫描条形码. 轻触这里以更改您的权限设置。
导出中…
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 213f54b68..e9857ada8 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -161,7 +161,6 @@
掃描條碼
尚未輸入卡片名稱
備份您的資料以將其轉移至其他裝置中。
- 在匯入及匯出資料前,請先允許外部儲存裝置存取權限
自檔案系統中匯入
自檔案系統中選取檔案。
自檔案系統
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ef636c6d5..56dba0129 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -65,7 +65,8 @@
Could not perform export
Importing…
Exporting…
- Grant external storage permission to import or export data
+ Permission to read storage needed for this action…
+ Permission to access camera needed for this action…
Could not access the camera
To scan barcodes, Catima will need access to your camera. Tap here to change your permission settings.
The data will be written to a location of your choice.