From b97cb942e8823d213f700a78d7192b60c5b46eae Mon Sep 17 00:00:00 2001 From: althafvly Date: Mon, 14 Oct 2019 23:42:47 +0530 Subject: [PATCH 01/58] camera: Enable Camera API v2 by default --- .../main/java/net/sourceforge/opencamera/PreferenceKeys.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/PreferenceKeys.java b/app/src/main/java/net/sourceforge/opencamera/PreferenceKeys.java index 8d12f7942..7938965b5 100644 --- a/app/src/main/java/net/sourceforge/opencamera/PreferenceKeys.java +++ b/app/src/main/java/net/sourceforge/opencamera/PreferenceKeys.java @@ -37,7 +37,7 @@ public class PreferenceKeys { */ public static final String MagneticAccuracyPreferenceKey = "done_magnetic_accuracy"; - public static final String CameraAPIPreferenceDefault = "preference_camera_api_old"; + public static final String CameraAPIPreferenceDefault = "preference_camera_api_camera2"; public static final String CameraAPIPreferenceKey = "preference_camera_api"; public static String getFlashPreferenceKey(int cameraId) { -- GitLab From 1a8ff5102c52abcd09808e89e13ae88fda42c689 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 22 Aug 2024 10:36:29 +0530 Subject: [PATCH 02/58] Changed package name --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c00a8b38c..94d36b057 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ android { compileOptions.encoding = 'UTF-8' defaultConfig { - applicationId "net.sourceforge.opencamera" + applicationId "foundation.e.camera" minSdkVersion 15 targetSdkVersion 34 //compileSdkVersion 31 // needed to support appcompat:1.4.0 (which we need for emoji policy support, and not yet ready to target SDK 30) -- GitLab From ad3ec0e708cd718645e6d0e0d2409a67ec5c1cff Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 22 Aug 2024 10:45:43 +0530 Subject: [PATCH 03/58] Update About content --- app/build.gradle | 1 + .../opencamera/MyPreferenceFragment.java | 2 + app/src/main/res/values-az/strings.xml | 7 ++ app/src/main/res/values-be/strings.xml | 8 ++ app/src/main/res/values-cs/strings.xml | 9 +++ app/src/main/res/values-de/strings.xml | 7 ++ app/src/main/res/values-el/strings.xml | 7 ++ app/src/main/res/values-es/strings.xml | 7 ++ app/src/main/res/values-fr/strings.xml | 7 ++ app/src/main/res/values-hu/strings.xml | 7 ++ app/src/main/res/values-it/strings.xml | 7 ++ app/src/main/res/values-ja/strings.xml | 7 ++ app/src/main/res/values-ko/strings.xml | 8 ++ app/src/main/res/values-nb/strings.xml | 7 ++ app/src/main/res/values-pl/strings.xml | 9 +++ app/src/main/res/values-pt-rBR/strings.xml | 8 ++ app/src/main/res/values-pt-rPT/strings.xml | 7 ++ app/src/main/res/values-ru/strings.xml | 7 ++ app/src/main/res/values-sl/strings.xml | 7 ++ app/src/main/res/values-tr/strings.xml | 8 ++ app/src/main/res/values-uk/strings.xml | 7 ++ app/src/main/res/values-vi/strings.xml | 7 ++ app/src/main/res/values-zh-rCN/strings.xml | 7 ++ app/src/main/res/values-zh-rTW/strings.xml | 7 ++ app/src/main/res/values/strings.xml | 16 ++++ app/src/main/res/xml/preferences.xml | 75 +++++++++++++++++-- 26 files changed, 251 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 94d36b057..0d9198c36 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,6 +39,7 @@ android { namespace 'net.sourceforge.opencamera' buildFeatures { renderScript true + buildConfig true } //useLibrary 'android.test.mock' } diff --git a/app/src/main/java/net/sourceforge/opencamera/MyPreferenceFragment.java b/app/src/main/java/net/sourceforge/opencamera/MyPreferenceFragment.java index 1947e7074..f532b25c1 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MyPreferenceFragment.java +++ b/app/src/main/java/net/sourceforge/opencamera/MyPreferenceFragment.java @@ -66,6 +66,7 @@ import java.util.List; */ public class MyPreferenceFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { private static final String TAG = "MyPreferenceFragment"; + public static final String BUILD_VERION = "build_version"; private int cameraId; @@ -86,6 +87,7 @@ public class MyPreferenceFragment extends PreferenceFragment implements OnShared Log.d(TAG, "onCreate"); super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); + findPreference(BUILD_VERION).setSummary(BuildConfig.VERSION_NAME); final Bundle bundle = getArguments(); this.cameraId = bundle.getInt("cameraId"); diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 339ef20a2..86e043d38 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -323,4 +323,11 @@ GUI gizlə Hamısını gizlə + Quraşdırma versiyası + Kamera OpenCamera-dan çəngəldir + Müəlliflər + Mənbə kodu + Lisenziyası + Kamera məlumatları + Xidmət şərtləri diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index f8aff4848..7810001af 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -367,4 +367,12 @@ Хаваць віртуальныя кнопкі навігацыі на экране Хаваць GUI Хаваць усе + + Зборка версіі + Камера раздвоеная ад OpenCamera + Аўтары + Зыходны код + Ліцэнзія + Інфармацыя пра камеру + Умовы прадастаўлення паслуг diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 77803ff23..47435af54 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -371,4 +371,13 @@ Skrýt pouze virtuální navigační tlačítka Skrýt grafické rozhraní Skrýt vše + + About + Sestavte verzi + Kamera je vidlice z OpenCamera + Autor + Zdrojový kód + Licence + Informace o kameře + Podmínky služby diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5b1e0ce0b..877829d0f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -973,4 +973,11 @@ Lautes Geräusch Sprachkommando: \"cheese\" + Build version + Die Kamera ist von OpenCamera gespalten + Autor + Quellcode + Lizenz + Kamerainformationen + Nutzungsbedingungen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index f65912736..6a344801d 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -446,4 +446,11 @@ Προεπιλογή + Δημιουργία έκδοσης + Η κάμερα είναι διχαλωτή από το OpenCamera + Συγγραφέας + Κωδικός πηγής + Άδεια + Πληροφορίες κάμερας + Όροι υπηρεσίας diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 9f0c56c48..7c1841146 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -603,4 +603,11 @@ Ruido fuerte Comando de voz: \"cheese\" + Versión de compilación + La cámara está bifurcada de OpenCamera + Autor + Código fuente + Licencia + Información de la cámara + Términos de servicio diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c9a04072a..2e996c02b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -454,4 +454,11 @@ Bruit fort Commande vocale : « cheese » + Créer une version + La caméra est dérivée d\'OpenCamera + Auteur + Code source + Licence + Informations sur la caméra + Conditions d\'utilisation diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index ffd1f09fb..1baf8472f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -509,4 +509,11 @@ Hangos zaj Hangutasítás: \"csíííz\" + Összeállított verzió + A fényképezőgép villás az OpenCamera-tól + szerző + Forráskód + engedély + Kamera információk + Szolgáltatási feltételek diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1c0fac25c..1fe2440c4 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -978,4 +978,11 @@ Rumore forte Comando vocale: \"cheese\" + Versione build + La telecamera è biforcuta da OpenCamera + autore + Codice sorgente + licenza + Informazioni sulla fotocamera + Termini del servizio diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index bcb5529b7..0fff85700 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -863,4 +863,11 @@ 音に反応 音声コマンド: \"チーズ\" + ビルドバージョン + カメラはOpenCameraから分岐します + 作者 + ソースコード + 免許 + カメラ情報 + 利用規約 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 2352d116c..147f4e09e 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -334,4 +334,12 @@ 화면상의 가상 탐색 버튼만 숨기기 GUI 숨기기 모두 숨기기 + + 빌드 버전 + OpenCamera에서 카메라 포크 + 저자 + 소스 코드 + 라이센스 + 카메라 정보 + 서비스 약관 diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 80bd7e800..8ebcacdc6 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -559,4 +559,11 @@ Høy støy Stemmekommando: \"cheese\" + Bygg versjon + Kamera er gaffel fra OpenCamera + Forfatter + Kildekode + lisens + Kamerainformasjon + Tjenestevilkår diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 57cccefcb..1f319db43 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -972,4 +972,13 @@ Nie usuwaj danych EXIF urządzenia Usuń dane EXIF urządzenia Usuń z wyjątkiem daty/godziny + + Wersja kompilacji + Kamera jest rozwidlona z OpenCamera + Autor + Kod źródłowy + Licencja + Informacje o kamerze + Warunki usługi + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5784f0cd8..f32ad1711 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -334,4 +334,12 @@ Somente esconder as teclas virtuais de navegação Esconder IGU Esconder tudo + + Versão de compilação + A câmera é bifurcada no OpenCamera + Autor + Código fonte + Licença + Informações da câmera + Termos de serviço diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index ec539c33b..f8ed8efee 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -428,4 +428,11 @@ Ruído alto Comando de voz: \"cheese\" + Versão de compilação + A câmera é bifurcada no OpenCamera + Autor + Código fonte + Licença + Informações da câmera + Termos de serviço diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a73f3a30e..25343bbe3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -976,4 +976,11 @@ Громкий шум Голосовая команда: \"cheese\" + Версия сборки + Камера разветвлена от OpenCamera + автор + Исходный код + лицензия + Информация о камере + Условия обслуживания diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 7e57657da..348a0e15b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -980,4 +980,11 @@ Glasen zvok Glasovni ukaz: \"cheese\" + Različica za izdelavo + Kamera je vilica OpenCamera + Avtor + Izvorna koda + Licenca + Podatki o fotoaparatu + Pogoji storitve diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index bca0101e4..8d50d1e4a 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -370,4 +370,12 @@ Sadece sanal ekran navigasyon butonlarını gizle GUI(Grafik arayüz) gizle Herşeyi gizle + + Derleme sürümü + Kamera OpenCamera\'dan çatallandı + yazar + Kaynak kodu + lisans + Kamera bilgileri + Hizmet şartları diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6c9db92d5..3284a15fd 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -513,4 +513,11 @@ Низький шум Голосова команда: \"сир\" + Збірка версії + Камера роздвоєна від OpenCamera + Автор + Вихідний код + Ліцензія + Інформація про камеру + Умови обслуговування diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 935011d8a..e735dd28b 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -789,4 +789,11 @@ Tiếng động lớn Tiếng cheese + Phiên bản xây dựng + Máy ảnh được rẽ nhánh từ OpenCamera + Tác giả + Mã nguồn + Giấy phép + Thông tin camera + Điều khoản dịch vụ diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 45499ca1c..a91ada226 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -963,4 +963,11 @@ 删除设备 EXIF 信息 删除日期/时间以外的信息 + 内部版本 + 相机是从OpenCamera分叉的 + 作者 + 源代码 + 牌照 + 相机信息 + 服务条款 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d010b400c..acebc7bd1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -977,4 +977,11 @@ 大的聲音 音訊指令:「cheese」 + 内部版本 + 相机是从OpenCamera分叉的 + 作者 + 源代码 + 牌照 + 相机信息 + 服务条款 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c98c88e01..8528f4e3c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1087,4 +1087,20 @@
  • Various other improvements and bug fixes.\n
  • + + + Build version + Camera is forked from OpenCamera + Authors + Source code + Licence + Camera information + + - Option to auto-stabilise\n + - Support for scene modes, color effects, white balance, ISO etc.\n + - Timer (with optional voice countdown), auto-repeat mode\n + - Configurable volume keys and user interface\n + - Support for Camera2 API\n + - Panorama, including for front camera. + Terms of service diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 7564b5ba1..807311b0d 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -187,12 +187,77 @@ android:summary="@string/preference_camera_api_summary" /> - + android:key="preference_about" + android:persistent="false" + android:title="@string/preference_about"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Date: Thu, 22 Aug 2024 10:57:41 +0530 Subject: [PATCH 04/58] Rename Open Camera into Camera find app/src/main/res -type f -name '*.xml' -exec sed -i 's/Open Camera/Camera/g' {} + --- .../opencamera/MyPreferenceFragment.java | 2 +- app/src/main/res/values-az/strings.xml | 6 +-- app/src/main/res/values-be/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 8 ++-- app/src/main/res/values-de/strings.xml | 16 ++++---- app/src/main/res/values-el/strings.xml | 10 ++--- app/src/main/res/values-es/strings.xml | 14 +++---- app/src/main/res/values-fr/strings.xml | 14 +++---- app/src/main/res/values-hu/strings.xml | 14 +++---- app/src/main/res/values-it/strings.xml | 18 ++++----- app/src/main/res/values-ja/strings.xml | 14 +++---- app/src/main/res/values-nb/strings.xml | 16 ++++---- app/src/main/res/values-pl/strings.xml | 14 +++---- app/src/main/res/values-pt-rBR/strings.xml | 6 +-- app/src/main/res/values-pt-rPT/strings.xml | 14 +++---- app/src/main/res/values-ru/strings.xml | 18 ++++----- app/src/main/res/values-sl/strings.xml | 10 ++--- app/src/main/res/values-tr/strings.xml | 10 ++--- app/src/main/res/values-uk/strings.xml | 12 +++--- app/src/main/res/values-vi/strings.xml | 16 ++++---- app/src/main/res/values-zh-rCN/strings.xml | 22 +++++------ app/src/main/res/values-zh-rTW/strings.xml | 18 ++++----- app/src/main/res/values/strings.xml | 38 +++++++++---------- 23 files changed, 156 insertions(+), 156 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MyPreferenceFragment.java b/app/src/main/java/net/sourceforge/opencamera/MyPreferenceFragment.java index f532b25c1..4eff17f66 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MyPreferenceFragment.java +++ b/app/src/main/java/net/sourceforge/opencamera/MyPreferenceFragment.java @@ -404,7 +404,7 @@ public class MyPreferenceFragment extends PreferenceFragment implements OnShared Log.d(TAG, "NameNotFoundException exception trying to get version number"); e.printStackTrace(); } - about_string.append("Open Camera v"); + about_string.append("Camera v"); about_string.append(version); about_string.append("\nCode: "); about_string.append(version_code); diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 86e043d38..17b8aa81a 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -1,6 +1,6 @@ - Open Camera + Camera Parametrlər Popup parametrləri OK (Bu mesaj bir daha göstərilməyəcək) @@ -100,7 +100,7 @@ Saxlanılan video prefiksi Videoların saxlanması zamanı fayl adlarının generasiyasında istifadə olunacaq ön yazı Kilid ekranında kamera - Əgər qoşulubsa, o zaman Open Camera kilid ekranı üzərindən görünəcək (siz digər parametrlərə, qalereyaya və s. giriş əldə edə bilərsiniz) + Əgər qoşulubsa, o zaman Camera kilid ekranı üzərindən görünəcək (siz digər parametrlərə, qalereyaya və s. giriş əldə edə bilərsiniz) Video qeydi zamanı ekranı kilidlə Video qeydi zamanı, qeydin təsadüfi dayanmasının qarşısını almaq üçün qrafik interfeys kilidlənəcək. Kilidi açmaq üçün ekranı sürüşdürün. Diqqətli olun ki, əgər proqram fon rejiminə keçsə və ya ekran sönsə video qeydi dayanacaq. Ön izləmə fırlanması @@ -186,7 +186,7 @@ Haqqında Proqram məlumatları Parametrləri sıfırla - Bütün Open Camera parametrlərinin susmaya görə sıfırlanması + Bütün Camera parametrlərinin susmaya görə sıfırlanması Bütün papametrlərin sıfırlanmasını istəyirsiniz? Mövcuddur Mövcud deyil diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 7810001af..3bb41158f 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Налады Налады ўсплываючых Добра (Гэта паведамленне не будзе паказана зноў) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 47435af54..2632c59d3 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Nastavení Vyskakovací nastavení OK (Tato zpráva se již znovu nezobrazí.) @@ -114,7 +114,7 @@ Uložit předponu pro videa Předpona používaná při ukládání videí Zobrazit fotoaparát při zamčení - Pokud zapnuto, Open Camera se bude zobrazovat nad jakoukoliv zamčenou obrazovkou (stále bude požadováno odemčení pro přístup do Nastavení, Galerie atd.) + Pokud zapnuto, Camera se bude zobrazovat nad jakoukoliv zamčenou obrazovkou (stále bude požadováno odemčení pro přístup do Nastavení, Galerie atd.) Zamknout obrazovku při nahrávání videa Při nahrávání videa bude GUI uzamčeno proti náhodnému zastavení nahrávání. Přejeďte prstem pro odemčení. Mějte na paměti, že nahrávání videa bude zastaveno vždy když bude aplikace na pozadí nebo je obrazovka prázdná. @@ -217,8 +217,8 @@ O programu Informace aplikace a ladění Obnovit nastavení - Obnoví všechna nastavení Open Camera na původní - Jste si jist/á, že chcete obnovit všechna nastavení Open Camera na původní? + Obnoví všechna nastavení Camera na původní + Jste si jist/á, že chcete obnovit všechna nastavení Camera na původní? Dostupné Nedostupné diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 877829d0f..d7c58644d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Einstellungen Popup-Einstellungen OK (Diese Nachricht wird nicht wieder angezeigt.) @@ -118,9 +118,9 @@ Den Präfix für die Dateinamen der Videos einstellen Zeitformat für den Dateinamen Kamera trotz Sperre anzeigen - Wenn aktiviert, wird Open Camera über dem Sperrbildschirm stehen (das Entsperren ist jedoch für den Zugriff auf Einstellungen, Galerie usw. nötig) + Wenn aktiviert, wird Camera über dem Sperrbildschirm stehen (das Entsperren ist jedoch für den Zugriff auf Einstellungen, Galerie usw. nötig) Verwende Auto-Fokus bei Start der App - Beim Start von Open Camera automatisch fokussieren. Deaktiviere diese Option bei einem Problem mit dem Blitz. + Beim Start von Camera automatisch fokussieren. Deaktiviere diese Option bei einem Problem mit dem Blitz. Bildschirm bei Videoaufnahme sperren Wenn aktiviert, wird bei Videoaufnahmen die Oberfläche gesperrt, um versehentliches Stoppen zu verhindern. Zum Entsperren einfach wischen. Vorschau drehen @@ -224,7 +224,7 @@ Verschiedenes Online-Hilfe - Öffne die Open Camera Website in deinem Browser + Öffne die Camera Website in deinem Browser Spende Wenn Ihnen diese App gefällt, würde ich mich über eine Spende freuen, indem Sie meine Spenden-App kaufen. Dazu brauchen Sie nur diese Option anzuklicken. Danke! Camera2-API verwenden @@ -232,8 +232,8 @@ Über Anwendungs- und Debug-Informationen Einstellungen zurücksetzen - Standard-Einstellungen von Open Camera wiederherstellen - Sind Sie sich sicher, alle Einstellungen von Open Camera auf die Standardwerte zurückzusetzen? + Standard-Einstellungen von Camera wiederherstellen + Sind Sie sich sicher, alle Einstellungen von Camera auf die Standardwerte zurückzusetzen? verfügbar nicht verfügbar @@ -716,7 +716,7 @@ Einstellungsmanager Sichere Einstellungen - Sichere alle Einstellungen von Open Camera in eine Datei + Sichere alle Einstellungen von Camera in eine Datei Name der Einstellungsdatei Einstellungen wiederherstellen @@ -789,7 +789,7 @@ Bluetooth wird nicht unterstützt. Unbekanntes Gerät Blende Bildschirms ab, wenn Fernsteuerverbindung abbricht - Tipp: Setze die Standard-Helligkeit auf minimal bevor du Open Camera startest. + Tipp: Setze die Standard-Helligkeit auf minimal bevor du Camera startest. Setze Salzwasser zur Tiefenberechnung Für Unterwassergehäuse, verbessert die Genauigkeit bei korrekter Auswahl der Wasserart. Fernsteurung verbunden diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6a344801d..e9a3f996b 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Ρυθμίσεις Ρυθμίσεις Παραθύρου OK (Καμμία εμφάνιση αυτού του μυνήματος ξανά) @@ -117,7 +117,7 @@ Πρόθεμα για την αποθήκευση αρχείων βίντεο Μορφή ώρας για το όνομα του αρχείου εμφάνιση της κάμερας όταν κλειδώθηκε - Αν είναι αυτή η ρύθμιση ενεργή, το Open Camera θα εμφανίζετε πάνω από κάθε οθόνη κλειδώματος (μπορείτε ακόμα να ξεκλειδώσετε για να αποκτήσετε πρόσβαση στις Ρυθμίσεις κ.λ.π.) + Αν είναι αυτή η ρύθμιση ενεργή, το Camera θα εμφανίζετε πάνω από κάθε οθόνη κλειδώματος (μπορείτε ακόμα να ξεκλειδώσετε για να αποκτήσετε πρόσβαση στις Ρυθμίσεις κ.λ.π.) Αυτόματη εστίαση κατά την εκκίνηση Με αυτή την ρύθμιση η αυτόματη εστίαση, θα ενεργοποιηθεί όταν ανοίξετε την Κάμερα. Αν έχετε πρόβλημα με το flash κατά την εκκίνηση, απενεργοποιήστε αυτή την επιλογή Κλείδωμα της οθόνης κατά την εγγραφή βίντεο @@ -222,7 +222,7 @@ Διάφορα Διαδικτυακή Βοήθεια - Ανοιγμα της Open Camera ιστοσελίδας στο πρόγραμμα περιηγησής σας + Ανοιγμα της Camera ιστοσελίδας στο πρόγραμμα περιηγησής σας Δωρεά για υποστήριξη της ανάπτυξης Αν σας αρέσει αυτή η εφαρμογή, παρακαλούμε κάντε μια δωρεά για υποστήριξη της ανάπτυξης. Μπορείτε να το κάνετε αυτό μέσω της επιλογής "Δωρεά" - κάντε αυτή την επιλογή για να ανοίξει η σελίδα δωρεών. Ευχαριστούμε! Χρήση τού Camera2 API @@ -230,8 +230,8 @@ Σχετικά με Εφαρμογή και πληροφορίες εντοπισμού σφαλμάτων Ρυθμίσεις επαναφοράς - Επαναφορά όλων των Open Camera ρυθμίσεων στις προεπιλογές - Είστε σίγουρος οτι θέλετε να γίνει, επαναφορά όλων των Open Camera ρυθμίσεων στις προεπιλογές; + Επαναφορά όλων των Camera ρυθμίσεων στις προεπιλογές + Είστε σίγουρος οτι θέλετε να γίνει, επαναφορά όλων των Camera ρυθμίσεων στις προεπιλογές; Διαθέσιμο Μη διαθέσιμο diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7c1841146..2f9f9fd7a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,7 +1,7 @@  - Open Camera + Camera Ajustes Ajustes de ventana emergente OK (Este mensaje no se mostrará de nuevo) @@ -118,9 +118,9 @@ Prefijo utilizado para el nombre de los videos Formato de hora para el nombre de archivo Mostrar cámara aunque el dispositivo esté bloqueado - Si está activado, Open Camera se mostrará por encima de la pantalla de bloqueo (sin embargo tendrá que desbloquear para acceder a la Galería, Ajustes, etc) + Si está activado, Camera se mostrará por encima de la pantalla de bloqueo (sin embargo tendrá que desbloquear para acceder a la Galería, Ajustes, etc) Realizar autoenfoque al iniciar - Realice un autoenfoque cuando Open Camera se inicie. Si presenta el problema donde el flash se enciende al iniciar, desactive esta opción + Realice un autoenfoque cuando Camera se inicie. Si presenta el problema donde el flash se enciende al iniciar, desactive esta opción Bloquear pantalla al grabar video Al grabar vídeo, la interfaz de pantalla se bloqueará para evitar detener accidentalmente la grabación. Desliza la pantalla para desbloquearla. Tenga en cuenta que la grabación de video siempre se detendrá si la aplicación entra en segundo plano o la pantalla se borra. Rotar vista previa @@ -162,7 +162,7 @@ Mostrar borde cuando se toma una foto Muestra un borde en la pantalla para indicar la captura de una foto Mantener pantalla encendida - Si se activa, la pantalla no se apagará mientras la interfaz de usuario principal de Open Camera esté activa + Si se activa, la pantalla no se apagará mientras la interfaz de usuario principal de Camera esté activa Forzar brillo al máximo Forzar la visualización de la pantalla a tener el brillo máximo, en lugar del valor predeterminado del dispositivo @@ -223,7 +223,7 @@ Varios Ayuda en línea - Inicie el sitio web de Open Camera en su navegador + Inicie el sitio web de Camera en su navegador Done para apoyar el proyecto Si te gusta esta aplicación, por favor considera hacer una donación para apoyar el proyecto. Puedes hacerlo comprando mi "aplicación de donación" - haz clic en esta opción para abrir la página de mi aplicación de donación. ¡Gracias! Utiliza Camera2 API @@ -231,8 +231,8 @@ Acerca de Información de aplicación y depuración Restablecer ajustes - Restablece todos los ajustes de Open Camera a la configuración predeterminada - Estás seguro de que quieres resetear todos los ajustes de Open Camera a los predefinidos? + Restablece todos los ajustes de Camera a la configuración predeterminada + Estás seguro de que quieres resetear todos los ajustes de Camera a los predefinidos? Disponible No disponible diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2e996c02b..c1122937d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Paramètres Fenêtre de paramètres OK (ce message ne s\'affichera plus) @@ -116,9 +116,9 @@ Préfixe du nom de la vidéo Le préfixe est utilisé pour le nom de fichier des vidéos Afficher l\'application appareil verrouillé - Si activé, Open Camera s\'affichera toujours au-dessus de l\'écran de verrouillage (vous devez déverrouiller pour accéder aux paramètres, galerie, etc.) + Si activé, Camera s\'affichera toujours au-dessus de l\'écran de verrouillage (vous devez déverrouiller pour accéder aux paramètres, galerie, etc.) Faire un auto-focus au démarrage - Active l\'auto-focus au démarrage de Open Camera. Si vous avez un problème de flash qui s\'allume au démarrage, désactivez cette option + Active l\'auto-focus au démarrage de Camera. Si vous avez un problème de flash qui s\'allume au démarrage, désactivez cette option Verrouiller l\'écran lors de l\'enregistrement vidéo Lors de l\'enregistrement vidéo, l\'interface graphique sera verrouillée pour éviter d\'arrêter accidentellement l\'enregistrement. Balayez l\'écran pour déverrouiller. Notez que l\'enregistrement vidéo sera toujours arrêté si l\'application passe en arrière-plan ou si l\'écran est occulté. Pivoter l\'aperçu @@ -160,7 +160,7 @@ Ajouter une bordure à la photo Affiche une bordure à l\'écran pour indiquer la prise d\'une photo Garder l\'écran allumé - Si activé, l\'appareil ne se mettra pas en veille tant qu\'Open Camera sera actif + Si activé, l\'appareil ne se mettra pas en veille tant qu\'Camera sera actif Forcer la luminosité maximale Affichage de l\'écran avec une luminosité au maximum, plutôt que la valeur par défaut du périphérique @@ -219,7 +219,7 @@ Divers Aide en ligne - Ouvre le site web de Open Camera dans votre navigateur + Ouvre le site web de Camera dans votre navigateur Faire un don pour soutenir le développement Si vous aimez ce logiciel, n\'hésitez pas à faire un don. Vous pouvez le faire via l\'achat de mon «\u00A0application de don\u00A0» - Cliquer sur cette option va ouvrir la page de l\'application de don. Merci\u00A0! Utiliser l\'API Camera2 @@ -227,8 +227,8 @@ À propos Informations de l\'application et de debug Réinitialiser les paramètres - Réinitialise tout les paramètres aux valeurs par défaut d\'Open Camera - Êtes-vous sûr de vouloir réinitialiser tout les réglages d\'Open Camera par défaut\u00A0? + Réinitialise tout les paramètres aux valeurs par défaut d\'Camera + Êtes-vous sûr de vouloir réinitialiser tout les réglages d\'Camera par défaut\u00A0? Disponible Non disponible diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 1baf8472f..e7be78dbc 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Beállítások Felugró beállítások OK (Ez az üzenet nem jelenik meg újra) @@ -118,9 +118,9 @@ A videók mentésekor használt fájlnév előtag Fájlnév időformátum Kamera megjelenítése zárolt állapotban - Ha engedélyezve van, az Open Camera látható marad a zárképernyő alatt is (de fel kell oldanod a beállítások, geléria, stb. eléréséhez) + Ha engedélyezve van, az Camera látható marad a zárképernyő alatt is (de fel kell oldanod a beállítások, geléria, stb. eléréséhez) Autofókusz indításkor - Automatikus fókuszálás, amikor az Open Camera elindul. Ha gondok vannak az induláskor bekapcsoló vakuval, tiltsd ezt le + Automatikus fókuszálás, amikor az Camera elindul. Ha gondok vannak az induláskor bekapcsoló vakuval, tiltsd ezt le Képernyő zárolása videofelvétel alatt Videó készítése alatt a felhasználói felület zárolva lesz, megakadályozva a felvétel véletlen leállítását. Feloldáshoz csúsztad az ujjad a képernyőn. Megjegyzendő, hogy a felvétel le fog állni, ha az alkalmazás háttérbe kerül vagy a képernyő kikapcsol. Előnézet forgatása @@ -162,7 +162,7 @@ Keret megjelenítése exponáláskor Keret megjelenítése a kijelzőn, jelezve hogy fotó készül Kijelző bekapcsolva tartása - Ha engedélyezve van, akkor a képernyő nem kapcsol ki, míg az Open Camera főképernyője aktív + Ha engedélyezve van, akkor a képernyő nem kapcsol ki, míg az Camera főképernyője aktív Maximális fényerő kényszerítése A kijelző mindenképpen maximális fényerővel üzemel, az eszköz alapértelmezése helyett @@ -223,7 +223,7 @@ Egyéb Online súgó - Open Camera weboldal megnyitása böngészőben + Camera weboldal megnyitása böngészőben Támogasd a fejlesztést adománnyal A tetszik az alkalmazás, fontold meg adomány küldését a fejlesztés támogatására. Ezt a „támogatói alkalmazás” megvásárlásával teheted meg – kattints ide, hogy megnyisd a támogató alkalmazás oldalát. Köszönjük! Camera2 API használata @@ -231,8 +231,8 @@ Névjegy App és hibakeresési információk Beállítások visszaállítása - Az Open Camera összes beállítását alaphelyzetbe állítja - Biztosan vissza szeretnéd állítani az Open Camera összes beállítását az alapértelmezettre? + Az Camera összes beállítását alaphelyzetbe állítja + Biztosan vissza szeretnéd állítani az Camera összes beállítását az alapértelmezettre? Elérhető Nem elérhető diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1fe2440c4..71a2740df 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Impostazioni Impostazioni Popup OK (Non mostrare più) @@ -119,9 +119,9 @@ Prefisso da usare per il nome file di salvataggio dei video Formato tempo da utilizzare nel nome file Mostra la fotocamera quando dispositivo bloccato - Se abilitato, Open Camera sarà mostrata sopra il blocco schermo (dovrai comunque sbloccarlo per accedere a Impostazioni, Galleria, ecc.) + Se abilitato, Camera sarà mostrata sopra il blocco schermo (dovrai comunque sbloccarlo per accedere a Impostazioni, Galleria, ecc.) Autofocus all\'avvio - Usa la messa a fuoco automatica quando Open Camera si avvia. Se il flash non dovesse attivarsi, disattiva questa opzione + Usa la messa a fuoco automatica quando Camera si avvia. Se il flash non dovesse attivarsi, disattiva questa opzione Blocco schermo nella registrazione video Quando si registra un video l\'interfaccia sarà bloccata per prevenire accidentali interruzioni. Trascina il dito sullo schermo per sbloccare. Nota che la registrazione del video sarà interrotta se l\'app andrà in background o se lo schermo è oscurato. Ruota anteprima @@ -163,7 +163,7 @@ visualizza bordo su scatto foto Visualizza bordo sul display per indicare che si sta scattando una foto Mantieni display attivo - Se abilitato, il display non viene spento fintanto che l\'interfaccia principale di Open Camera è attiva + Se abilitato, il display non viene spento fintanto che l\'interfaccia principale di Camera è attiva Forza luminosità massima Imposta lo schermo al massimo della luminosità, invece di usare le impostazioni predefinite @@ -224,7 +224,7 @@ Varie Aiuto online - Apre il sito web di Open Camera nel browser + Apre il sito web di Camera nel browser Dona per supportare lo sviluppo Se questa applicazione ti piace, considera la possibilità di fare una donazione. Puoi farlo comprando la mia \"app donazione\" - cliccando su questa opzione aprirai la pagina per la donazione. Grazie! Usa le API Camera2 @@ -232,8 +232,8 @@ Informazioni App e informazioni di debug Reset impostazioni - Reimposta tutti i settaggi di Open Camera ai valori predefiniti - Sei sicuro di voler reimpostare tutti i settaggi di Open Camera ai valori predefiniti? + Reimposta tutti i settaggi di Camera ai valori predefiniti + Sei sicuro di voler reimpostare tutti i settaggi di Camera ai valori predefiniti? Disponibile Non disponibile @@ -718,7 +718,7 @@ Gestione impostazioni Salva impostazioni - Salva tutte le impostazioni di Open Camera in un file + Salva tutte le impostazioni di Camera in un file Nome per le impostazioni salvate Ripristina impostazioni @@ -792,7 +792,7 @@ Bluetooth non supportato. Dispositivo sconosciuto Riduci luminosità schermo su disconnessione - Suggerimento: imposta la luminosità di default al minimo prima di avviare Open Camera. + Suggerimento: imposta la luminosità di default al minimo prima di avviare Camera. Usa Saltwater per il calcolo della profondità Per gli alloggiamenti subacquei, improva l\'accuratezza se viene selezionato il tipo corretto di acqua. Dispositivo remoto collegato diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0fff85700..8f2175de5 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera 設定 ポップアップ設定 了解しました (この内容を再度表示しない) @@ -119,9 +119,9 @@ 保存するビデオのファイル名の手前につける内容を設定します ファイル名に使用する時刻フォーマット ロック画面上でもカメラを表示する - 有効にするとOpen Cameraがロック画面上でも表示されます(ギャラリーを既定のアプリにしているなど、ロックの解除が必要になる場合もあります) + 有効にするとCameraがロック画面上でも表示されます(ギャラリーを既定のアプリにしているなど、ロックの解除が必要になる場合もあります) 起動時にオートフォーカスを行う - Open Camera の起動時にオートフォーカスを行います。もし起動時にライトが点灯する問題が起こる場合は設定をオフにしてください。 + Camera の起動時にオートフォーカスを行います。もし起動時にライトが点灯する問題が起こる場合は設定をオフにしてください。 録画中は画面を固定する 録画が停止しないように画面を固定します。固定は画面をスワイプすると解除されます。アプリをバックグラウンドに移すか画面を消灯しても録画は停止します。 プレビューを回転 @@ -222,7 +222,7 @@ その他の内容 オンラインヘルプ - Open Camera のWEBサイトをブラウザで開きます + Camera のWEBサイトをブラウザで開きます サポートのために寄付をする このアプリが気に入りましたら寄付をお願いします。この項目を押すと寄付への窓口が開きます。寄付権を購入する事で寄付ができます。寄付してくれたらありがとう! Camera2 APIを使う @@ -230,7 +230,7 @@ このアプリについて アプリとデバッグの情報を表示します 設定をリセットする - Open Cameraの設定をすべてリセットします + Cameraの設定をすべてリセットします 本当にすべての設定をリセットしますか? 利用可能 @@ -682,7 +682,7 @@ 設定マネージャー 設定を保存 - Open Camera のすべての設定をファイルに保存します + Camera のすべての設定をファイルに保存します 保存する設定の名前 設定を復元 @@ -754,7 +754,7 @@ Bluetooth をサポートしていません。 不明なデバイス 接続先から切断された場合は画面を暗くする - ヒント: Open Camera の起動時にデフォルトの輝度を最小輝度に設定します。 + ヒント: Camera の起動時にデフォルトの輝度を最小輝度に設定します。 深度計算のために海水を使用する 水中ハウジングの場合、正しい水のタイプを選択すると精度が向上します。 接続されています diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 8ebcacdc6..64383893a 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Innstillinger Oppsprettsinnstillinger OK (Denne meldingen vil ikke bli vist igjen) @@ -118,9 +118,9 @@ Forstavelsen som skal brukes til lagringsfilnavnene til bildene. Tidsformatet til filnavnene Vis kameraet når mobilen er låstShow camera when locked - Hvis dette er aktivert, vil Open Camera fortsett vises over enhver låseskjerm (Du vil fortsatt måtte låse opp for å få tilgang til Innstillinger, Galleri, osv.). + Hvis dette er aktivert, vil Camera fortsett vises over enhver låseskjerm (Du vil fortsatt måtte låse opp for å få tilgang til Innstillinger, Galleri, osv.). Utfør auto-fokusering ved oppstart - Hvorvidt det skal auto-fokuseres når Open Camera startes opp. Hvis du har problemer med at blitsen skrur seg på ved oppstart, skru av denne innstillingen. + Hvorvidt det skal auto-fokuseres når Camera startes opp. Hvis du har problemer med at blitsen skrur seg på ved oppstart, skru av denne innstillingen. Lås skjermen under videoopptak Under opptak av video, vil brukergrensesnitt bli låst for å unngå at opptaket blir stoppet ved et uhell. Sveip skjermen for å låse opp. Bemerk at opptak alltid vil bli stoppet dersom appen går inn i bakgrunnen eller at skjermen blir blank. Rotér forhåndsvisningen @@ -162,7 +162,7 @@ Vis kanter når du tar et bilde Vis kanter på skjermen når du tar et bilde. Hold skjermen skrudd på - Hvis dette er valgt, vil skjermen ikke skru seg av mens Open Cameras hovedgrensesnitt er aktivt. + Hvis dette er valgt, vil skjermen ikke skru seg av mens Cameras hovedgrensesnitt er aktivt. Fremtving makslysstyrke Tving skjermvisningen til å ha maks lysstyrke, og ikke enhetsstandarden. @@ -223,16 +223,16 @@ Diverse Netthjelp - Gå til Open Camera-nettsiden i nettleseren din. + Gå til Camera-nettsiden i nettleseren din. Doner for å støtte utviklingen. Hvis du liker denne appen, så tenk gjerne på om du vil gi meg en donasjon for å støtte utviklingen. Du kan gjøre dette ved å kjøpe min "donasjonsapp" — Klikk på denne innstillingen for å gå til siden for min donasjonsapp. Takk! Bruk Camera2-APIen Aktiverer Camera2-API - Den tilbyr ekstra egenskaper, men kan kanskje ikke virke riktig på alle enheter (Vil føre til en omstart). - Om Open Camera + Om Camera App- og avlusings-informasjon Tilbakestill innstillinger - Tilbakestill alle Open Camera-innstillinger til sine standarder. - Er du sikker på at du vil tilbakestille alle Open Camera-innstillinger til sine standarder? + Tilbakestill alle Camera-innstillinger til sine standarder. + Er du sikker på at du vil tilbakestille alle Camera-innstillinger til sine standarder? Tilgjengelig Ikke tilgjengelig diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 1f319db43..e1627b8d5 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,6 +1,6 @@  - Open Camera + Camera Ustawienia Ustawienia wyskakujących okienek OK (Ta wiadomość nie pokaże się ponownie) @@ -116,7 +116,7 @@ Przedrostek używany w nazwach plików filmów Format czasu w nazwie pliku Pokaż aparat, gdy zablokowany - Jeśli włączono, aplikacja Open Camera będzie widoczna ponad ekranem blokady (dostęp do opcji, galerii itp. wymaga odblokowania) + Jeśli włączono, aplikacja Camera będzie widoczna ponad ekranem blokady (dostęp do opcji, galerii itp. wymaga odblokowania) Automatyczna ostrość podczas uruchamiania Autofokus będzie uruchamiany podczas włączania aplikacji. Jeśli występuje problem z włączaniem lampy błyskowej podczas uruchamiania, wyłącz tę opcję Blokuj ekranu podczas nagrywania filmu @@ -161,7 +161,7 @@ Ramka Wyświetla ramkę wokół ekranu po wykonaniu zdjęcia Utrzymuj ekran włączony - Ekran nie wyłączy się jeśli aplikacja Open Camera będzie aktywna + Ekran nie wyłączy się jeśli aplikacja Camera będzie aktywna Wymuś maksymalną jasność Wymusza maksymalną jasność ekranu pomijając ustawienie systemu operacyjnego urządzenia Ustawienia zdjęć i filmów @@ -221,7 +221,7 @@ Jeśli włączono, lampa błyskowa będzie się włączać i wyłączać (przydatne w przypadku gdy chcemy z większej odległości stwierdzić czy kamera wciąż nagrywa) Różne Pomoc on-line - Otwiera stronę aplikacji Open Camera w przeglądarce internetowej + Otwiera stronę aplikacji Camera w przeglądarce internetowej Przekaż darowiznę Jeśli spodobała ci się ta aplikacja rozważ przekazanie darowizny, która wesprze rozwój aplikacji. Możesz to zrobić poprzez zakup specjalnej aplikacji - dotknij tutaj, aby otworzyć stronę. Dzięki! Camera2 API @@ -230,7 +230,7 @@ Informacje o aplikacji i debugowanie Resetuj ustawienia Resetuje wszystkie ustawienia do wartości domyślnych - Na pewno chcesz przywrócić wszystkie ustawienia aplikacji Open Camera do wartości domyślnych? + Na pewno chcesz przywrócić wszystkie ustawienia aplikacji Camera do wartości domyślnych? Dostępne Niedostępne Kopiuj do schowka @@ -638,7 +638,7 @@ Menedżer ustawień Zapisz ustawienia - Zapisuje wszystkie ustawienia aplikacji Open Camera do pliku + Zapisuje wszystkie ustawienia aplikacji Camera do pliku Nazwa zapisanych ustawień Przywróć ustawienia @@ -708,7 +708,7 @@ Bluetooth niewspierany. Nieznane urządzenie Przyciemnij ekran, jeśli nastąpi rozłączenie - Wskazówka: ustaw domyślną jasność na minimalny poziom przed uruchomieniem aplikacji Open Camera. + Wskazówka: ustaw domyślną jasność na minimalny poziom przed uruchomieniem aplikacji Camera. Użyj słonej wody do obliczeń głębokości W przypadku obudów podwodnych poprawia dokładność, jeśli zostanie wybrany właściwy rodzaj wody. Połączono zdalnie diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f32ad1711..3e094ae67 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Configurações Configurações rápidas OK (Essa mensagem não será mostrada novamente) @@ -108,7 +108,7 @@ Salvar prefixo de vídeo O prefixo usado para salvar o nome dos arquivos de vídeo Mostrar câmera quando travado - Se habilitado, o Open Camera ainda será exibido acima de qualquer tela de bloqueio + Se habilitado, o Camera ainda será exibido acima de qualquer tela de bloqueio Travar tela enquanto filma Trava a tela enquanto filma para prevenir falhas acidentais na filmagem. Deslize na tela para desbloquear. Rotação de visualização @@ -145,7 +145,7 @@ Mostrar animação para captura de fotos Exibe uma animação quando uma foto é tirada Manter a tela ligada - Se habilitada, a tela não desligará enquanto a IU do Open Camera estiver aberta + Se habilitada, a tela não desligará enquanto a IU do Camera estiver aberta Forçar brilho máximo Força a exibição da tela a ser em brilho máximo, em vez de no padrão do dispositivo diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index f8ed8efee..a2f52303d 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Definições Definições rápidas OK (Esta mensagem não será mostrada novamente) @@ -118,9 +118,9 @@ O prefixo usado para guardar o nome dos ficheiros dos vídeos Fuso horário do nome dos ficheiros Mostrar câmara quando bloqueado - Se ativado, o Open Camera continuará a ser mostrado acima de qualquer ecrã de bloqueio (terá na mesma de desbloquear para aceder às Definições, Galeria, etc.) + Se ativado, o Camera continuará a ser mostrado acima de qualquer ecrã de bloqueio (terá na mesma de desbloquear para aceder às Definições, Galeria, etc.) Efetuar autofocagem na inicialização - Autofocar quando o Open Camera é iniciado. Se tiver o problema de o flash ligar no início, desative esta opção + Autofocar quando o Camera é iniciado. Se tiver o problema de o flash ligar no início, desative esta opção Bloquear ecrã durante a gravação de vídeo Durante a gravação de vídeo, a interface será bloqueada para prevenir parar a gravação acidentalmente. Deslize o ecrã para desbloquear. Note que a gravação de vídeo será sempre parada se a aplicação entrar em segundo plano ou se o ecrã for desligado. Rodar pré-visualização @@ -162,7 +162,7 @@ Mostrar contorno quando tirada uma fotografia Exibir contorno no ecrã para indicar que está a ser tirada uma fotografia Manter ecrã ligado - Se ativado, o ecrã não será desligado se a interface principal do Open Camera estiver ativa + Se ativado, o ecrã não será desligado se a interface principal do Camera estiver ativa Forçar brilho máximo Forçar o ecrã a estar com o brilho máximo, em vez da predefinição do dispositivo @@ -223,7 +223,7 @@ Diversos Ajuda online - Abrir o website do Open Camera no seu navegador + Abrir o website do Camera no seu navegador Doar para apoiar o desenvolvimento Se gosta desta aplicação, por favor concidere fazer um donativo para apoiar o desenvolvimento. Pode fazê-lo ao comprar a minha "aplicação de donativo" - clique nesta opção para abrir a página da minha aplicação de donativo. Obrigado! Usar API Camera2 @@ -231,8 +231,8 @@ Sobre Informações da aplicação e de depuração Repor definições - Repor todas as definições do Open Camera para as predefinidas - Tem a certeza que pretende repor todas as definições do Open Camera para as predefinidas? + Repor todas as definições do Camera para as predefinidas + Tem a certeza que pretende repor todas as definições do Camera para as predefinidas? Disponível Não disponível diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 25343bbe3..19058ed3a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Настройки Настройки всплывающих окон Ок (Это сообщение больше не появится) @@ -119,9 +119,9 @@ Префикс имен файлов для сохраняемых видео Формат времени для имени файла Камера на экране блокировки - Если включено, то Open Camera будет отображаться поверх экрана блокировки (вы можете получить доступ к настройкам, галерее и т.д.) + Если включено, то Camera будет отображаться поверх экрана блокировки (вы можете получить доступ к настройкам, галерее и т.д.) Автофокус при запуске - Включить автофокус при запуске Open Camera. Если у вас проблемы со включением вспышки при запуске, отключите эту опцию + Включить автофокус при запуске Camera. Если у вас проблемы со включением вспышки при запуске, отключите эту опцию Блокировать экран при записи видео При записи видео графический интерфейс будет заблокирован для предотвращения случайной остановки записи. Проведите по экрану, чтобы разблокировать. Обратите внимание, что запись видео остановится, если приложение перейдет в фоновый режим или погаснет экран. Поворот предпросмотра @@ -163,7 +163,7 @@ Показывать рамку во время фотосъемки Показывать рамку на экране для индикации фотосъемки Не выключать дисплей - Если включено, экран не будет выключаться, пока Open Camera открыта + Если включено, экран не будет выключаться, пока Camera открыта Максимальная яркость Включение максимальной яркости во время съемки @@ -224,7 +224,7 @@ Разное Помощь в Интернете - Открыть веб-сайт Open Camera в вашем браузере + Открыть веб-сайт Camera в вашем браузере Пожертвовать Если вам нравится это приложение, киньте мне копейку. Вы можете сделать это, купив мое приложение. Спасибо! Использовать Camera2 API @@ -232,8 +232,8 @@ О программе Информация Сброс настроек - Сброс всех настроек Open Camera на стандартные значения - Сбросить все настройки Open Camera на стандартные значения? + Сброс всех настроек Camera на стандартные значения + Сбросить все настройки Camera на стандартные значения? Доступно Недоступно @@ -719,7 +719,7 @@ Управление настройками Сохранить настройки - Сохраняет все настройки Open Camera в файл + Сохраняет все настройки Camera в файл Имя сохраненных настроек Восстановить настройки @@ -792,7 +792,7 @@ Bluetooth не поддерживается. Неизвестное устройство Выключать экран при отключении удаленного управления - Подсказка: установите яркость по умолчанию на минимальный уровень перед запуском Open Camera. + Подсказка: установите яркость по умолчанию на минимальный уровень перед запуском Camera. Использовать Saltwater для более точных вычислений При размещении под водой улучшает точность, если выбран правильный тип воды. Удаленное устройство подключено diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 348a0e15b..5b0807190 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Nastavitve Nastavitve pojavnih oken V redu (to sporočilo se ne bo več prikazovalo) @@ -119,7 +119,7 @@ Predpona imena datotek videoposnetkov Oblika časa za ime datoteke Prikaži fotoaparat, ko je zaklenjeno - Če je omogočeno, se bo Open Camera še vedno prikazoval nad zaklenjenim zaslonom (še vedno boste morali odkleniti za dostop do nastavitev, galerije itd.) + Če je omogočeno, se bo Camera še vedno prikazoval nad zaklenjenim zaslonom (še vedno boste morali odkleniti za dostop do nastavitev, galerije itd.) Izvedi samodejno ostrenje ob zagonu Ali naj se izvede samodejno ostrenje ob zagonu Open Camere. Če imate težavo z vklopom bliskavice ob zagonu, onemogočite to možnost Zakleni zaslon ob snemanju videoposnetkov @@ -224,7 +224,7 @@ Razno Spletna pomoč - Zaženi spletno stran Open Camera v brskalniku + Zaženi spletno stran Camera v brskalniku Daruj za podporo razvoju Če vam je ta program všeč, razmislite o darovanju, da podprete razvoj. To lahko naredite z nakupom mojega "programa za darovanje" - kliknite na to možnost za odpiranje strani z mojim programom. Hvala! Uporabi API Camera2 @@ -232,8 +232,8 @@ O programu Program in podatki za razhroščevanje Ponastavi nastavitve - Ponastavi vse nastavitve Open Camera na privzete - Ali res želite ponastaviti vse nastavitve Open Camera na privzete? + Ponastavi vse nastavitve Camera na privzete + Ali res želite ponastaviti vse nastavitve Camera na privzete? Na voljo Ni na voljo diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 8d50d1e4a..4e2b0441d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Ayarlar Popup Ayarları TAMAM (Bu mesaj tekrar gösterilmeyecektir.) @@ -114,7 +114,7 @@ vidyo adlandırma öneki kaydet Vidyolarda dosya adlarını kaydetmede kullanılacak önek Kilitlendiğinde kamerayı göster - Etkinleştirilirse, Open Camera yukarıda kilit ekranı göstermeye devam edecektir(Sizin\' ayarlara, galeriye vb. erişmek için yine de ekranı açamanız gerekir) + Etkinleştirilirse, Camera yukarıda kilit ekranı göstermeye devam edecektir(Sizin\' ayarlara, galeriye vb. erişmek için yine de ekranı açamanız gerekir) Vidyo kaydederken ekranı kilitle Vidyo kaydederken, GUI kazara kaydı durdurmayı önlemek için kilitlenecek. Kilidi açmak için ekranı kaydırın. Vidyo kaydederken eğer uygulama arkaplana giderse ya da ekran boşsa kayıt daima durdurulacaktır. @@ -154,7 +154,7 @@ Önizleme animasyonunu göster Fotoğraf çekerken önizleme animasyon hareketini göster Ekranı açık tut - Etkinleştirilirse, Open Camera kullanıcı arayüzü aktifken ekran kapanmayacaktır + Etkinleştirilirse, Camera kullanıcı arayüzü aktifken ekran kapanmayacaktır Maksimum parlaklık için zorla Cihazın öntanımlı ayarına bakmaksızın ekran görüntüsünü maksimum parlaklık için zorlar @@ -216,8 +216,8 @@ Hakkında Uygulama ve eksiklik bilgisi Ayarları temizle - Tüm Open Camera ayarlarını öntanımlı ayarlara döndür - Tüm Open Camera ayarlarını öntanımlı ayarlara döndürmek istediğinize emin misiniz? + Tüm Camera ayarlarını öntanımlı ayarlara döndür + Tüm Camera ayarlarını öntanımlı ayarlara döndürmek istediğinize emin misiniz? Etkinleştir Etkin değil diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 3284a15fd..59e9a8da6 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Налаштування Налаштування зринаючих вікон "Гаразд (Більше це повідомлення не з'явиться.)" @@ -119,7 +119,7 @@ Префікс імен файлів для відео Формат часу для імені файлу Камера на екрані блокування - Якщо увімкнуто, то Open Camera все одно буде показуватись над будь-яким екраном блокування (ви можете отримати доступ до налаштувань, галереї и т.п.) + Якщо увімкнуто, то Camera все одно буде показуватись над будь-яким екраном блокування (ви можете отримати доступ до налаштувань, галереї и т.п.) Автофокус під час запуску Блокувати екран під час запису відео @@ -163,7 +163,7 @@ Показувати рамку під час фотографування Показувати рамку на екрані для індикації режиму фотографування Не вимикати екран - Якщо увімкнуто, екран не буде вимикатися, доки активний інтерфейс Open Camera + Якщо увімкнуто, екран не буде вимикатися, доки активний інтерфейс Camera Максимальна яскравість Встановлення максимальної яскравості під час зйомки @@ -224,7 +224,7 @@ Різне Онлайн допомога - Відкрити сайт Open Camera в веб браузері + Відкрити сайт Camera в веб браузері Подякувати Якщо вам сподобався цей додаток, киньте монетку. Ви можете зробити це, придбавши мій додаток. Дякую! Використовувати Camera2 API @@ -232,8 +232,8 @@ Про додаток Інформація Скидання налаштувань - Скинути всі налаштування Open Camera на стандартні значення - Ви дійсно бажаєте скинути всі налаштування Open Camera на стандартні значення? + Скинути всі налаштування Camera на стандартні значення + Ви дійсно бажаєте скинути всі налаштування Camera на стандартні значення? Доступно Не доступно diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e735dd28b..e3fb12dec 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1,7 +1,7 @@  - Open Camera + Camera Cài đặt Cài đặt cửa sổ bật lên OK (Thông báo này không hiển thị nữa) @@ -118,9 +118,9 @@ Đặt tiền tố trong tên tệp khi lưu video Định dạng thời gian tên tệp Hiển thị máy ảnh khi đã khóa - Nếu kích hoạt, Open Camera vẫn hiển thị trên bất kỳ màn hình khóa nào (bạn vẫn phải mở khóa để truy cập Cài đặt, Thư viện, v.v…) + Nếu kích hoạt, Camera vẫn hiển thị trên bất kỳ màn hình khóa nào (bạn vẫn phải mở khóa để truy cập Cài đặt, Thư viện, v.v…) Tự động lấy nét khi khởi động - Tự động lấy nét khi Open Camera được khởi động. Nếu bạn gặp sự cố bật đèn flash khi khởi động, hãy tắt tùy chọn này. + Tự động lấy nét khi Camera được khởi động. Nếu bạn gặp sự cố bật đèn flash khi khởi động, hãy tắt tùy chọn này. Khóa màn hình khi quay video Khi quay video, giao diện người dùng sẽ bị khóa để ngăn việc vô tình dừng quay. Trượt màn hình để mở khóa. Lưu ý video sẽ dừng quay nếu ứng dụng chạy dưới nền hoặc màn hình bị trống. Xoay xem trước @@ -162,7 +162,7 @@ Hiển thị đường viền Hiện đường viền trên màn hình khi chụp ảnh Giữ màn hình bật - Nếu kích hoạt, màn hình sẽ không tắt khi Giao diện người dùng chính của Open Camera đang hoạt động + Nếu kích hoạt, màn hình sẽ không tắt khi Giao diện người dùng chính của Camera đang hoạt động Buộc độ sáng tối đa Bắt buộc màn hình hiển thị ở độ sáng tối đa, thay vì mặc định của thiết bị @@ -223,7 +223,7 @@ Xem thêm Trợ giúp trực tuyến - Truy cập trang chủ Open Camera bằng trình duyệt của bạn + Truy cập trang chủ Camera bằng trình duyệt của bạn Hỗ trợ phát triển Nếu bạn thích ứng dụng này, vui lòng cân nhắc việc quyên góp để hỗ trợ phát triển. Bạn có thể quyên góp bằng cách mua ứng dụng quyên góp của tôi - nhấn vào đây để mở trang ứng dụng. Xin cảm ơn! Sử dụng Camera2 API @@ -231,8 +231,8 @@ Giới thiệu Thông tin ứng dụng và gỡ lỗi Khôi phục cài đặt - Khôi phục cài đặt Open Camera về mặc định ban đầu - Bạn có chắc muốn khôi phục cài đặt Open Camera về mặc định ban đầu không? + Khôi phục cài đặt Camera về mặc định ban đầu + Bạn có chắc muốn khôi phục cài đặt Camera về mặc định ban đầu không? Khả dụng Không khả dụng @@ -717,7 +717,7 @@ Quản lý cài đặt Sao lưu thiết lập - Lưu tất cả thiết lập của Open Camera vào một tệp + Lưu tất cả thiết lập của Camera vào một tệp Tên tệp thiết lập Khôi phục thiết lập diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a91ada226..ff840a1a5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera 设置 弹出设置 好 (此消息将不再显示) @@ -116,9 +116,9 @@ 保存视频前缀 用于保存视频文件名的前缀 锁定时显示相机 - 如果开启,Open Camera 将仍然在任何锁屏之上显示 (你仍然必须解锁来访问设置,图库等) + 如果开启,Camera 将仍然在任何锁屏之上显示 (你仍然必须解锁来访问设置,图库等) 启动时执行自动对焦 - Open Camera 启动时是否执行自动对焦。如果启动时开启闪光灯有问题,禁用此选项 + Camera 启动时是否执行自动对焦。如果启动时开启闪光灯有问题,禁用此选项 录像时锁定屏幕 当录制视频时,图形用户界面将被锁定以防止意外的停止录像。滑动屏幕以解锁。注意,如果程序转到后台或屏幕是空白,视频录制总是会停止。 旋转预览 @@ -158,7 +158,7 @@ 显示缩略图动画 当拍照时显示移动缩略图动画 保持屏幕常亮 - 如果开启,当 Open Camera 的主界面激活时,屏幕将不会关闭。 + 如果开启,当 Camera 的主界面激活时,屏幕将不会关闭。 强制最大亮度 强制屏幕以最大亮度显示,而不是设备默认值 @@ -223,8 +223,8 @@ 关于 应用程序和调试信息 复位设置 - 重设所有 Open Camera 设置为默认 - 你确定要重设所有 Open Camera 设置为默认值吗? + 重设所有 Camera 设置为默认 + 你确定要重设所有 Camera 设置为默认值吗? 可用 不可用 @@ -339,7 +339,7 @@ RAW 使用后台线程 使用后台线程保存照片(操作更流畅) - 在浏览器中打开Open Camera网站 + 在浏览器中打开Camera网站 切换到前摄像头 切换到后摄像头 切换到摄像模式 @@ -652,12 +652,12 @@ 配置管理器 保存配置 - 保存Open Camera所有选项的至文件中 + 保存Camera所有选项的至文件中 保存的文件名 恢复配置 - 恢复配置文件到Open Camera。注意这会覆盖现在的所有设定值! - 这个选项允许你选择一个先前保存的配置文件并恢复到Open Camera中。需要注意这个文件载入后会覆盖当前所有选项的设定值! + 恢复配置文件到Camera。注意这会覆盖现在的所有设定值! + 这个选项允许你选择一个先前保存的配置文件并恢复到Camera中。需要注意这个文件载入后会覆盖当前所有选项的设定值! 视频格式 录像的编码和格式\n%s @@ -749,7 +749,7 @@ 不支持蓝牙 未知设备 断开控制时熄屏 - 提示:打开Open Camera前,请把默认亮度调到最低 + 提示:打开Camera前,请把默认亮度调到最低 使用盐水计算深度 设置正确的水下兔笼的类型,可以提高水下拍摄时深度计算的准确性 控制器已连接 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index acebc7bd1..91012d47e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera 設定 彈出設定 好 (此訊息將不再顯示) @@ -119,9 +119,9 @@ 用於儲存影片檔名的前置字串 檔案名稱的時間格式 鎖定時顯示相機 - 如果開啟,Open Camera 將在任何鎖定畫面上顯示 (您仍然必須解鎖來存取設定、相簿等) + 如果開啟,Camera 將在任何鎖定畫面上顯示 (您仍然必須解鎖來存取設定、相簿等) 啟動時自動對焦 - Open Camera 啟動時是否要自動對焦。如果您有啟動時閃光燈開啟的問題,請停用此選項 + Camera 啟動時是否要自動對焦。如果您有啟動時閃光燈開啟的問題,請停用此選項 錄影時鎖定螢幕 當錄製影片時,圖形化使用者介面將被鎖定以防止意外的停止錄影。滑動螢幕以解鎖。注意,如果程式進入背景或螢幕關閉,影片錄製會停止。 旋轉預覽 @@ -163,7 +163,7 @@ 拍照時顯示邊緣 在螢幕上顯示邊緣來表示拍照 保持螢幕常亮 - 如果開啟,當 Open Camera 的使用者介面啟動時,螢幕將不會關閉。 + 如果開啟,當 Camera 的使用者介面啟動時,螢幕將不會關閉。 強制最大亮度 強制螢幕以最大亮度顯示,而不是裝置預設值 @@ -224,7 +224,7 @@ 其他 線上說明 - 在瀏覽器中開啟 Open Camera 網站 + 在瀏覽器中開啟 Camera 網站 捐贈以支援開發 如果您喜歡這個程式,請考慮捐助。您可以透過購買我的“捐助 app”來進行捐助 - 點擊此選項將打開我的捐助 app 頁面。謝謝! 使用 Camera2 API @@ -232,8 +232,8 @@ 關於 應用程式和除錯資訊 重設設定 - 重設所有 Open Camera 設定為預設值 - 您確定要重設所有 Open Camera 設定為預設值嗎? + 重設所有 Camera 設定為預設值 + 您確定要重設所有 Camera 設定為預設值嗎? 可用 不可用 @@ -720,7 +720,7 @@ 設定管理員 儲存設定 - 將所有 Open Camera 的設定儲存在一個檔案中 + 將所有 Camera 的設定儲存在一個檔案中 儲存的檔案名稱 還原設定 @@ -793,7 +793,7 @@ 不支援藍牙。 未知裝置 遠端中斷連線時螢幕變暗 - 提示:啟動 Open Camera 前,請把預設亮度調到最低。 + 提示:啟動 Camera 前,請把預設亮度調到最低。 使用鹽水計算深度 使用水下防水盒時,如果選擇正確的水的類型,可以提高拍攝的準確性。 遠端已連線 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8528f4e3c..45d719103 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ - Open Camera + Camera Settings Popup settings OK (This message won\'t show again) @@ -120,9 +120,9 @@ The prefix to use for the save filenames for videos Time format for filename Show camera when locked - If enabled, Open Camera will still show above any lockscreen (you\'ll still have to unlock to access Settings, Gallery etc) + If enabled, Camera will still show above any lockscreen (you\'ll still have to unlock to access Settings, Gallery etc) Perform auto-focus on startup - Whether to auto-focus when Open Camera is started. If you have the problem of flash turning on when starting, disable this option + Whether to auto-focus when Camera is started. If you have the problem of flash turning on when starting, disable this option Lock screen when recording video When recording video, the GUI will be locked to prevent accidentally stopping recording. Swipe the screen to unlock. Note that video recording will always stop if the app goes into background or the screen is blanked. Rotate preview @@ -164,7 +164,7 @@ Show border when taking photo Display a border on the display to indicate taking a photo Keep display on - If enabled, the screen won\'t switch off while the main Open Camera UI is active + If enabled, the screen won\'t switch off while the main Camera UI is active Force maximum brightness Force screen display to be at maximum brightness, rather than device default @@ -225,7 +225,7 @@ Misc Online help - Launch the Open Camera website in your browser + Launch the Camera website in your browser Donate to support development If you like this app, please consider making a donation to support development. You can do this by purchasing my "donation app" - click this option to open up the page for my donation app. Thanks! Use Camera2 API @@ -233,8 +233,8 @@ About App and debug information Reset settings - Reset all Open Camera settings to default - Are you sure you want to reset all Open Camera settings to default? + Reset all Camera settings to default + Are you sure you want to reset all Camera settings to default? Available Not available @@ -723,7 +723,7 @@ Settings manager Save settings - Saves all of Open Camera\'s settings to a file + Saves all of Camera\'s settings to a file Saved settings name Restore settings @@ -797,7 +797,7 @@ Bluetooth not supported. Unknown device Dim screen if remote disconnects - Hint: set default brightness to minimum level before starting Open Camera. + Hint: set default brightness to minimum level before starting Camera. Use Saltwater for depth calculations For underwater housings, improves accuracy if correct water type is selected. Remote connected @@ -1033,8 +1033,8 @@ - Open Camera is developed by Mark Harman. - <br/>Open Camera accesses camera sensor and microphone data to fulfil its purpose as a camera. + Camera is developed by Mark Harman. + <br/>Camera accesses camera sensor and microphone data to fulfil its purpose as a camera. Microphone is also used for the optional \"Audio control\". <br/>Access to files is needed (at least for Android 9 and earlier) to save resultant files such as photos and videos to your device. <br/>Location permission is requested in order to deliver the optional geotagging features (for photos and videos, @@ -1044,12 +1044,12 @@ the Bluetooth remote control feature also requires location permission (on Android 11 or earlier) or Nearby Devices permission (on Android 12 or later). <br/>Resultant data such as photos or videos can be shared with - other apps if you use the share option in Open Camera, or when Open Camera is called by + other apps if you use the share option in Camera, or when Camera is called by another app on your device, or when you use the Storage Access Framework option to save to another app or service. - <br/>Data handling procedures, data retention and deletion policies: Open Camera + <br/>Data handling procedures, data retention and deletion policies: Camera does not transmit personal or sensitive information to me. - <br/>Since Open Camera also uses operating system APIs, you should review relevant privacy policies + <br/>Since Camera also uses operating system APIs, you should review relevant privacy policies such as for your device, manufacturer, operating system and/or Google accounts. For example: <br/>*Apps/services such as cloud services on your device may auto-upload photos and videos that are saved on your device. <br/>If you have inquiries about my privacy policy, please contact me by email at @@ -1057,13 +1057,13 @@ Open Source licences - Open Camera - Open Camera is © 2013–2024 Mark Harman, released under the GPL v3 or later. Tap here for full licence text and terms of service. + Camera + Camera is © 2013–2024 Mark Harman, released under the GPL v3 or later. Tap here for full licence text and terms of service. AndroidX libraries - Open Camera uses the AndroidX/Jetpack libraries + Camera uses the AndroidX/Jetpack libraries under the Apache license version 2.0. Tap here for full licence text. Google\'s Material Design icons - Open Camera uses icons from Google\'s Material Design icons + Camera uses icons from Google\'s Material Design icons (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , @@ -1075,7 +1075,7 @@ - [This dialog is shown when Open Camera is updated. You can disable it under + [This dialog is shown when Camera is updated. You can disable it under Settings/On screen GUI/Show What\'s New dialog.] \n\nv1.53:\n
      -- GitLab From 86dfa302029b8da58254ab939a769dde172bb08c Mon Sep 17 00:00:00 2001 From: Phie Date: Fri, 10 Jul 2020 14:26:24 +0200 Subject: [PATCH 05/58] tmp fix to fix save picture in android Q --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a25745d04..e6d513b51 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,7 @@ android:name=".OpenCameraApplication" android:theme="@style/AppTheme" android:largeHeap="true" + android:requestLegacyExternalStorage="true" > Date: Wed, 5 Jan 2022 12:01:59 +0530 Subject: [PATCH 06/58] Camera: Declare SYSTEM_CAMERA permission * This will allow us to access cameras that are declared as "System Cameras" by the Camera HAL * Together with this, the app will have to be installed as a system app or signed with the same signature as system (protection level of system|signature) to be granted this permission --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e6d513b51..496e1b0de 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ android:maxSdkVersion="28" tools:ignore="ScopedStorage" /> + -- GitLab From 01ccb6184fee1ff0354e765e4e9a5c3f40e07e5b Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Tue, 29 Mar 2022 05:18:28 +0000 Subject: [PATCH 07/58] 3551-Hide_zoom_slider_control_by_default --- app/src/main/java/net/sourceforge/opencamera/MainActivity.java | 2 +- app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java | 2 +- app/src/main/res/xml/preferences_sub_gui.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 07360e281..abccba6df 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -5535,7 +5535,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } }); - if( sharedPreferences.getBoolean(PreferenceKeys.ShowZoomSliderControlsPreferenceKey, true) ) { + if( sharedPreferences.getBoolean(PreferenceKeys.ShowZoomSliderControlsPreferenceKey, false) ) { if( !mainUI.inImmersiveMode() ) { zoomSeekBar.setVisibility(View.VISIBLE); } diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java index ea1ae939a..668674c6d 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java @@ -1386,7 +1386,7 @@ public class MainUI { if( main_activity.getPreview().supportsZoom() && sharedPreferences.getBoolean(PreferenceKeys.ShowZoomControlsPreferenceKey, false) ) { zoomControls.setVisibility(visibility); } - if( main_activity.getPreview().supportsZoom() && sharedPreferences.getBoolean(PreferenceKeys.ShowZoomSliderControlsPreferenceKey, true) ) { + if( main_activity.getPreview().supportsZoom() && sharedPreferences.getBoolean(PreferenceKeys.ShowZoomSliderControlsPreferenceKey, false) ) { zoomSeekBar.setVisibility(visibility); } if( main_activity.showManualFocusSeekbar(false) ) diff --git a/app/src/main/res/xml/preferences_sub_gui.xml b/app/src/main/res/xml/preferences_sub_gui.xml index 340828710..1b3371249 100644 --- a/app/src/main/res/xml/preferences_sub_gui.xml +++ b/app/src/main/res/xml/preferences_sub_gui.xml @@ -119,7 +119,7 @@ android:key="preference_show_zoom_slider_controls" android:title="@string/preference_show_zoom_slider_controls" android:summary="@string/preference_show_zoom_slider_controls_summary" - android:defaultValue="true" + android:defaultValue="false" /> Date: Thu, 31 Mar 2022 10:04:55 +0000 Subject: [PATCH 08/58] 147-Remove_UI_placement_settings --- app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java | 2 ++ app/src/main/res/xml/preferences_sub_gui.xml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java index 668674c6d..d57db8b04 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java @@ -188,6 +188,8 @@ public class MainUI { } private UIPlacement computeUIPlacement() { + // Default top + if (true) return UIPlacement.UIPLACEMENT_TOP; SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(main_activity); String ui_placement_string = sharedPreferences.getString(PreferenceKeys.UIPlacementPreferenceKey, "ui_top"); switch( ui_placement_string ) { diff --git a/app/src/main/res/xml/preferences_sub_gui.xml b/app/src/main/res/xml/preferences_sub_gui.xml index 1b3371249..25304dfaf 100644 --- a/app/src/main/res/xml/preferences_sub_gui.xml +++ b/app/src/main/res/xml/preferences_sub_gui.xml @@ -2,14 +2,14 @@ - + /> --> Date: Tue, 5 Apr 2022 05:00:29 +0000 Subject: [PATCH 09/58] 165-Set_maximise_preview_size_as_default --- .../java/net/sourceforge/opencamera/MyApplicationInterface.java | 2 +- .../opencamera/preview/BasicApplicationInterface.java | 2 +- .../main/java/net/sourceforge/opencamera/ui/DrawPreview.java | 2 +- app/src/main/res/xml/preferences_sub_preview.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java index e0c997e5b..f6d51f626 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java +++ b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java @@ -1100,7 +1100,7 @@ public class MyApplicationInterface extends BasicApplicationInterface { @Override public String getPreviewSizePref() { - return sharedPreferences.getString(PreferenceKeys.PreviewSizePreferenceKey, "preference_preview_size_wysiwyg"); + return sharedPreferences.getString(PreferenceKeys.PreviewSizePreferenceKey, "preference_preview_size_display"); } @Override diff --git a/app/src/main/java/net/sourceforge/opencamera/preview/BasicApplicationInterface.java b/app/src/main/java/net/sourceforge/opencamera/preview/BasicApplicationInterface.java index e95b27fe7..c380d17af 100644 --- a/app/src/main/java/net/sourceforge/opencamera/preview/BasicApplicationInterface.java +++ b/app/src/main/java/net/sourceforge/opencamera/preview/BasicApplicationInterface.java @@ -189,7 +189,7 @@ public abstract class BasicApplicationInterface implements ApplicationInterface @Override public String getPreviewSizePref() { - return "preference_preview_size_wysiwyg"; + return "preference_preview_size_display"; } @Override diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java index 682ccf095..9a6fae0a3 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java @@ -677,7 +677,7 @@ public class DrawPreview { show_geo_direction_pref = sharedPreferences.getBoolean(PreferenceKeys.ShowGeoDirectionPreferenceKey, false); take_photo_border_pref = sharedPreferences.getBoolean(PreferenceKeys.TakePhotoBorderPreferenceKey, true); - preview_size_wysiwyg_pref = sharedPreferences.getString(PreferenceKeys.PreviewSizePreferenceKey, "preference_preview_size_wysiwyg").equals("preference_preview_size_wysiwyg"); + preview_size_wysiwyg_pref = sharedPreferences.getString(PreferenceKeys.PreviewSizePreferenceKey, "preference_preview_size_display").equals("preference_preview_size_wysiwyg"); store_location_pref = sharedPreferences.getBoolean(PreferenceKeys.LocationPreferenceKey, false); show_angle_line_pref = sharedPreferences.getBoolean(PreferenceKeys.ShowAngleLinePreferenceKey, false); diff --git a/app/src/main/res/xml/preferences_sub_preview.xml b/app/src/main/res/xml/preferences_sub_preview.xml index 29db987d8..fefdf8dab 100644 --- a/app/src/main/res/xml/preferences_sub_preview.xml +++ b/app/src/main/res/xml/preferences_sub_preview.xml @@ -8,7 +8,7 @@ android:summary="%s" android:entries="@array/preference_preview_size_entries" android:entryValues="@array/preference_preview_size_values" - android:defaultValue="preference_preview_size_wysiwyg" + android:defaultValue="preference_preview_size_display" /> Date: Thu, 5 Sep 2024 19:45:02 +0530 Subject: [PATCH 10/58] camera: sign debug with AOSP test keys --- app/build.gradle | 15 ++++++++++++++- app/keys/platform.jks | Bin 0 -> 3052 bytes 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 app/keys/platform.jks diff --git a/app/build.gradle b/app/build.gradle index 0d9198c36..2e1ba0a2f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,16 @@ android { compileSdk 34 compileOptions.encoding = 'UTF-8' + signingConfigs { + // These are public keys provided by AOSP, Use different passcode protected keys for production + debug { + storeFile file('keys/platform.jks') + storePassword 'platform' + keyAlias 'platform' + keyPassword 'platform' + } + } + defaultConfig { applicationId "foundation.e.camera" minSdkVersion 15 @@ -25,8 +35,11 @@ android { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } - } + debug { + signingConfig signingConfigs.debug + } + } // needed to use android.test package (ActivityInstrumentationTestCase2 etc) when targetting sdk 28 (Android 9) - // see https://developer.android.com/training/testing/set-up-project diff --git a/app/keys/platform.jks b/app/keys/platform.jks new file mode 100644 index 0000000000000000000000000000000000000000..b778840542e79c048bcf570aa960243eeb9b9d53 GIT binary patch literal 3052 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 X4gBin;_WFr#VkVgR?9E{583|$1Z;)? literal 0 HcmV?d00001 -- GitLab From 176233bf2da84fb0aff804a50f65543d1b653164 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 22 Aug 2024 15:06:01 +0530 Subject: [PATCH 11/58] 220-Remove_immersive_mode_settings --- .../java/net/sourceforge/opencamera/MainActivity.java | 8 ++++---- .../java/net/sourceforge/opencamera/ui/DrawPreview.java | 2 +- .../main/java/net/sourceforge/opencamera/ui/MainUI.java | 2 +- app/src/main/res/xml/preferences_sub_gui.xml | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index abccba6df..7c0268abb 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -3607,7 +3607,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen return; SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_low_profile"); + String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_off"); boolean hide_ui = immersive_mode.equals("immersive_mode_gui") || immersive_mode.equals("immersive_mode_everything"); if( visible ) { @@ -3783,7 +3783,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen // whether we are using a Kit Kat style immersive mode (either hiding navigation bar, GUI, or everything) if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_low_profile"); + String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_off"); if( immersive_mode.equals("immersive_mode_navigation") || immersive_mode.equals("immersive_mode_gui") || immersive_mode.equals("immersive_mode_everything") ) return true; } @@ -3794,7 +3794,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen // whether we are using a Kit Kat style immersive mode for everything if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_low_profile"); + String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_off"); if( immersive_mode.equals("immersive_mode_everything") ) return true; } @@ -3854,7 +3854,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } else { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_low_profile"); + String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_off"); if( immersive_mode.equals("immersive_mode_low_profile") ) getWindow().getDecorView().setSystemUiVisibility(saved_flags | View.SYSTEM_UI_FLAG_LOW_PROFILE); else diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java index 9a6fae0a3..4ac8929b1 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java @@ -684,7 +684,7 @@ public class DrawPreview { show_pitch_lines_pref = sharedPreferences.getBoolean(PreferenceKeys.ShowPitchLinesPreferenceKey, false); show_geo_direction_lines_pref = sharedPreferences.getBoolean(PreferenceKeys.ShowGeoDirectionLinesPreferenceKey, false); - String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_low_profile"); + String immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_off"); immersive_mode_everything_pref = immersive_mode.equals("immersive_mode_everything"); has_stamp_pref = applicationInterface.getStampPref().equals("preference_stamp_yes"); diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java index d57db8b04..a68d80d18 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java @@ -1395,7 +1395,7 @@ public class MainUI { focusSeekBar.setVisibility(visibility); if( main_activity.showManualFocusSeekbar(true) ) focusBracketingTargetSeekBar.setVisibility(visibility); - String pref_immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_low_profile"); + String pref_immersive_mode = sharedPreferences.getString(PreferenceKeys.ImmersiveModePreferenceKey, "immersive_mode_off"); if( pref_immersive_mode.equals("immersive_mode_everything") ) { if( sharedPreferences.getBoolean(PreferenceKeys.ShowTakePhotoPreferenceKey, true) ) { View takePhotoButton = main_activity.findViewById(R.id.take_photo); diff --git a/app/src/main/res/xml/preferences_sub_gui.xml b/app/src/main/res/xml/preferences_sub_gui.xml index 25304dfaf..1412f619a 100644 --- a/app/src/main/res/xml/preferences_sub_gui.xml +++ b/app/src/main/res/xml/preferences_sub_gui.xml @@ -12,14 +12,14 @@ /> --> - + android:defaultValue="immersive_mode_off" + /> --> Date: Thu, 21 Apr 2022 14:45:12 +0000 Subject: [PATCH 12/58] 171-223-r-Fix_preview_not_drawn_under_navigation_bar --- .../sourceforge/opencamera/MainActivity.java | 50 +++++++++++++++++++ .../opencamera/preview/Preview.java | 26 +++++++++- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 7c0268abb..9ef95bae3 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -750,10 +750,41 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen notificationManager.createNotificationChannel(channel); }*/ + calculateNavigationGap(); + if( MyDebug.LOG ) Log.d(TAG, "onCreate: total time for Activity startup: " + (System.currentTimeMillis() - debug_time)); } + /** + * if navigationMode is no gesture, then retrieve navigationBar's height & update navigation_gap + */ + private void calculateNavigationGap() { + int resourceId = getResources().getIdentifier("config_navBarInteractionMode", "integer", "android"); + if (resourceId > 0) { + int navType = getResources().getInteger(resourceId); + if (navType != 2) { //gesture mode = 2 + resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); + if (resourceId > 0) { + navigation_gap = getResources().getDimensionPixelSize(resourceId); + } + } + } + } + + public void handleDecorFitsSystemWindows() { + setDecorFitsSystemWindows(!isInFullScreenMode()); + } + + /** + * check is the preview size = maximise && is not in video mode, then return true + */ + public boolean isInFullScreenMode() { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + String preview_size = sharedPreferences.getString(PreferenceKeys.PreviewSizePreferenceKey, "preference_preview_size_display"); + return !(preview_size.equals("preference_preview_size_wysiwyg") || preview.isVideo()); + } + /** Whether to use codepaths that are compatible with scoped storage. */ public static boolean useScopedStorage() { @@ -3592,7 +3623,13 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } } + /** + * if sdk>=R & not in full screen, means the DecorFitsSystemWindows=true, then we can ignore navigationGap. + */ public int getNavigationGap() { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !isInFullScreenMode()) { + return 0; + } return want_no_limits ? navigation_gap : 0; } @@ -3865,6 +3902,18 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen getWindow().getDecorView().setSystemUiVisibility(saved_flags); } + /** + * setDecorFitsSystemWindows for build >=R + * @return if the operation successful or not + */ + public boolean setDecorFitsSystemWindows(boolean decorFitsSystemWindows) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + getWindow().setDecorFitsSystemWindows(decorFitsSystemWindows); + return true; + } + return false; + } + /** Sets the brightness level for normal operation (when camera preview is visible). * If force_max is true, this always forces maximum brightness; otherwise this depends on user preference. */ @@ -4059,6 +4108,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } setImmersiveMode(false); + setDecorFitsSystemWindows(true); camera_in_background = true; // we disable location listening when showing settings or a dialog etc - saves battery life, also better for privacy diff --git a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java index cc1698d22..f98e770b7 100644 --- a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java +++ b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java @@ -3,8 +3,8 @@ package net.sourceforge.opencamera.preview; import net.sourceforge.opencamera.HDRProcessor; import net.sourceforge.opencamera.JavaImageFunctions; import net.sourceforge.opencamera.JavaImageProcessing; +import net.sourceforge.opencamera.MainActivity; import net.sourceforge.opencamera.cameracontroller.RawImage; -//import net.sourceforge.opencamera.MainActivity; import net.sourceforge.opencamera.MyDebug; import net.sourceforge.opencamera.R; import net.sourceforge.opencamera.ScriptC_histogram_compute; @@ -3873,6 +3873,21 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu return optimalSize; } + private static CameraController.Size getClosestSizeForFullScreen(List sizes, double targetRatio) { + if (MyDebug.LOG) + Log.d(TAG, "getClosestSize()"); + CameraController.Size optimalSize = null; + double minDiff = Double.MIN_VALUE; + for (CameraController.Size size : sizes) { + double ratio = (double) size.width / size.height; + if ((ratio - targetRatio) > minDiff) { + optimalSize = size; + minDiff = ratio - targetRatio; + } + } + return (optimalSize != null) ? optimalSize : getClosestSize(sizes, targetRatio, null); + } + public CameraController.Size getOptimalPreviewSize(List sizes) { if( MyDebug.LOG ) Log.d(TAG, "getOptimalPreviewSize()"); @@ -3908,6 +3923,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu Log.d(TAG, "swapped display_size to: " + display_size.x + " x " + display_size.y); } } + ((MainActivity)getContext()).handleDecorFitsSystemWindows(); double targetRatio = calculateTargetRatioForPreview(display_size); int targetHeight = Math.min(display_size.y, display_size.x); if( targetHeight <= 0 ) { @@ -3937,7 +3953,11 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu // can't find match for aspect ratio, so find closest one if( MyDebug.LOG ) Log.d(TAG, "no preview size matches the aspect ratio"); - optimalSize = getClosestSize(sizes, targetRatio, null); + if (((MainActivity)getContext()).isInFullScreenMode()) { + optimalSize = getClosestSizeForFullScreen(sizes, targetRatio); + } else { + optimalSize = getClosestSize(sizes, targetRatio, null); + } } if( MyDebug.LOG ) { Log.d(TAG, "chose optimalSize: " + optimalSize.width + " x " + optimalSize.height); @@ -4786,6 +4806,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu else { if( this.isOnTimer() ) { cancelTimer(); + ((MainActivity)getContext()).setDecorFitsSystemWindows(true); this.is_video = true; } else if( this.phase == PHASE_TAKING_PHOTO ) { @@ -4794,6 +4815,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu Log.d(TAG, "wait until photo taken"); } else { + ((MainActivity)getContext()).setDecorFitsSystemWindows(true); this.is_video = true; } } -- GitLab From a910476fd49c327816e4b1f9c7d379c9b39f2569 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Fri, 22 Apr 2022 11:25:21 +0600 Subject: [PATCH 13/58] 224-Remove_welcome_alert issue: https://gitlab.e.foundation/e/os/backlog/-/issues/224 Welcome popup has a layout popup not fully rotating issue. & The popup actually don't add any extra business value. --- app/src/main/java/net/sourceforge/opencamera/MainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 9ef95bae3..1b55d3426 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -612,7 +612,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "onCreate: time after setting system ui visibility listener: " + (System.currentTimeMillis() - debug_time)); // show "about" dialog for first time use - if( !has_done_first_time ) { + if(false) { if( !is_test ) { AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); alertDialog.setTitle(R.string.app_name); -- GitLab From 6a44c4d4b910c915d0b508e3d85b75e8441459a0 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Fri, 22 Apr 2022 10:57:50 +0000 Subject: [PATCH 14/58] 229-Optimize_preview_when_taking_picture --- .../java/net/sourceforge/opencamera/PreferenceSubPhoto.java | 2 +- .../java/net/sourceforge/opencamera/preview/Preview.java | 5 +++++ .../main/java/net/sourceforge/opencamera/ui/PopupView.java | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java b/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java index f6a648628..e55d6845f 100644 --- a/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java +++ b/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java @@ -71,7 +71,7 @@ public class PreferenceSubPhoto extends PreferenceSubScreen { if( MyDebug.LOG ) Log.d(TAG, "supports_photo_video_recording: " + supports_photo_video_recording); - if( widths != null && heights != null && supports_burst != null ) { + if( false && widths != null && heights != null && supports_burst != null ) { CharSequence [] entries = new CharSequence[widths.length]; CharSequence [] values = new CharSequence[widths.length]; for(int i=0;i Date: Thu, 28 Apr 2022 04:16:48 +0000 Subject: [PATCH 15/58] 5334-Revert_force_resolution_set_on_camera_mode issue: https://gitlab.e.foundation/e/backlog/-/issues/5334 --- .../sourceforge/opencamera/MainActivity.java | 11 ++++--- .../opencamera/PreferenceSubPhoto.java | 2 +- .../opencamera/preview/Preview.java | 32 +++++-------------- .../sourceforge/opencamera/ui/PopupView.java | 2 +- 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 1b55d3426..677630278 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -154,6 +154,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen //private boolean ui_placement_right = true; private boolean want_no_limits; // whether we want to run with FLAG_LAYOUT_NO_LIMITS + private boolean can_draw_nav_bar = true; private boolean set_window_insets_listener; // whether we've enabled a setOnApplyWindowInsetsListener() private int navigation_gap; public static volatile boolean test_preview_want_no_limits; // test flag, if set to true then instead use test_preview_want_no_limits_value; needs to be static, as it needs to be set before activity is created to take effect @@ -772,8 +773,10 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } } - public void handleDecorFitsSystemWindows() { - setDecorFitsSystemWindows(!isInFullScreenMode()); + public void handleDecorFitsSystemWindows(double previewRatio, double screenRatio) { + boolean decorFitsSystemWindows = screenRatio >= previewRatio; + setDecorFitsSystemWindows(decorFitsSystemWindows); + can_draw_nav_bar = !decorFitsSystemWindows; } /** @@ -3624,10 +3627,10 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } /** - * if sdk>=R & not in full screen, means the DecorFitsSystemWindows=true, then we can ignore navigationGap. + * if sdk>=R & can't draw navigation bar, means the DecorFitsSystemWindows=true, then we can ignore navigationGap. */ public int getNavigationGap() { - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !isInFullScreenMode()) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !can_draw_nav_bar) { return 0; } return want_no_limits ? navigation_gap : 0; diff --git a/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java b/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java index e55d6845f..f6a648628 100644 --- a/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java +++ b/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java @@ -71,7 +71,7 @@ public class PreferenceSubPhoto extends PreferenceSubScreen { if( MyDebug.LOG ) Log.d(TAG, "supports_photo_video_recording: " + supports_photo_video_recording); - if( false && widths != null && heights != null && supports_burst != null ) { + if( widths != null && heights != null && supports_burst != null ) { CharSequence [] entries = new CharSequence[widths.length]; CharSequence [] values = new CharSequence[widths.length]; for(int i=0;i sizes, double targetRatio) { - if (MyDebug.LOG) - Log.d(TAG, "getClosestSize()"); - CameraController.Size optimalSize = null; - double minDiff = Double.MIN_VALUE; - for (CameraController.Size size : sizes) { - double ratio = (double) size.width / size.height; - if ((ratio - targetRatio) > minDiff) { - optimalSize = size; - minDiff = ratio - targetRatio; - } - } - return (optimalSize != null) ? optimalSize : getClosestSize(sizes, targetRatio, null); - } - public CameraController.Size getOptimalPreviewSize(List sizes) { if( MyDebug.LOG ) Log.d(TAG, "getOptimalPreviewSize()"); @@ -3923,7 +3908,6 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu Log.d(TAG, "swapped display_size to: " + display_size.x + " x " + display_size.y); } } - ((MainActivity)getContext()).handleDecorFitsSystemWindows(); double targetRatio = calculateTargetRatioForPreview(display_size); int targetHeight = Math.min(display_size.y, display_size.x); if( targetHeight <= 0 ) { @@ -3953,16 +3937,10 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu // can't find match for aspect ratio, so find closest one if( MyDebug.LOG ) Log.d(TAG, "no preview size matches the aspect ratio"); - if (((MainActivity)getContext()).isInFullScreenMode()) { - optimalSize = getClosestSizeForFullScreen(sizes, targetRatio); - } else { - optimalSize = getClosestSize(sizes, targetRatio, null); - } + optimalSize = getClosestSize(sizes, targetRatio, null); } - if (((MainActivity)getContext()).isInFullScreenMode()) { - camera_controller.setPictureSize(optimalSize.width, optimalSize.height); - } + handleDecorFitsSystemWindows(optimalSize, display_size); if( MyDebug.LOG ) { Log.d(TAG, "chose optimalSize: " + optimalSize.width + " x " + optimalSize.height); @@ -3971,6 +3949,12 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu return optimalSize; } + private void handleDecorFitsSystemWindows(CameraController.Size optimalSize, Point display_size) { + double previewRatio = (double) optimalSize.width / optimalSize.height; + double screenRatio = (double) display_size.x / display_size.y; + ((MainActivity)getContext()).handleDecorFitsSystemWindows(previewRatio, screenRatio); + } + public CameraController.Size getOptimalVideoPictureSize(List sizes, double targetRatio) { if( MyDebug.LOG ) Log.d(TAG, "getOptimalVideoPictureSize()"); diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/PopupView.java b/app/src/main/java/net/sourceforge/opencamera/ui/PopupView.java index 162c137b4..6aa0ca0c5 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/PopupView.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/PopupView.java @@ -375,7 +375,7 @@ public class PopupView extends LinearLayout { if( MyDebug.LOG ) Log.d(TAG, "PopupView time 8: " + (System.nanoTime() - debug_time)); - if( !preview.isVideo() && photo_mode != MyApplicationInterface.PhotoMode.Panorama && !main_activity.isInFullScreenMode()) { + if( !preview.isVideo() && photo_mode != MyApplicationInterface.PhotoMode.Panorama ) { // Only show photo resolutions in photo mode - even if photo snapshots whilst recording video is supported, the // resolutions for that won't match what the user has requested for photo mode resolutions. // And Panorama mode chooses its own resolution. -- GitLab From 6181ca3cb7c46babfd870574bf585454532cc7a8 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 22 Aug 2024 15:17:36 +0530 Subject: [PATCH 16/58] Revert "165-Set_maximise_preview_size_as_default" This reverts commit 9445a17dfb4754aadd59e376d4f93a78230847c9. --- .../java/net/sourceforge/opencamera/MyApplicationInterface.java | 2 +- .../opencamera/preview/BasicApplicationInterface.java | 2 +- .../main/java/net/sourceforge/opencamera/ui/DrawPreview.java | 2 +- app/src/main/res/xml/preferences_sub_preview.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java index f6d51f626..e0c997e5b 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java +++ b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java @@ -1100,7 +1100,7 @@ public class MyApplicationInterface extends BasicApplicationInterface { @Override public String getPreviewSizePref() { - return sharedPreferences.getString(PreferenceKeys.PreviewSizePreferenceKey, "preference_preview_size_display"); + return sharedPreferences.getString(PreferenceKeys.PreviewSizePreferenceKey, "preference_preview_size_wysiwyg"); } @Override diff --git a/app/src/main/java/net/sourceforge/opencamera/preview/BasicApplicationInterface.java b/app/src/main/java/net/sourceforge/opencamera/preview/BasicApplicationInterface.java index c380d17af..e95b27fe7 100644 --- a/app/src/main/java/net/sourceforge/opencamera/preview/BasicApplicationInterface.java +++ b/app/src/main/java/net/sourceforge/opencamera/preview/BasicApplicationInterface.java @@ -189,7 +189,7 @@ public abstract class BasicApplicationInterface implements ApplicationInterface @Override public String getPreviewSizePref() { - return "preference_preview_size_display"; + return "preference_preview_size_wysiwyg"; } @Override diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java index 4ac8929b1..af769206e 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java @@ -677,7 +677,7 @@ public class DrawPreview { show_geo_direction_pref = sharedPreferences.getBoolean(PreferenceKeys.ShowGeoDirectionPreferenceKey, false); take_photo_border_pref = sharedPreferences.getBoolean(PreferenceKeys.TakePhotoBorderPreferenceKey, true); - preview_size_wysiwyg_pref = sharedPreferences.getString(PreferenceKeys.PreviewSizePreferenceKey, "preference_preview_size_display").equals("preference_preview_size_wysiwyg"); + preview_size_wysiwyg_pref = sharedPreferences.getString(PreferenceKeys.PreviewSizePreferenceKey, "preference_preview_size_wysiwyg").equals("preference_preview_size_wysiwyg"); store_location_pref = sharedPreferences.getBoolean(PreferenceKeys.LocationPreferenceKey, false); show_angle_line_pref = sharedPreferences.getBoolean(PreferenceKeys.ShowAngleLinePreferenceKey, false); diff --git a/app/src/main/res/xml/preferences_sub_preview.xml b/app/src/main/res/xml/preferences_sub_preview.xml index fefdf8dab..29db987d8 100644 --- a/app/src/main/res/xml/preferences_sub_preview.xml +++ b/app/src/main/res/xml/preferences_sub_preview.xml @@ -8,7 +8,7 @@ android:summary="%s" android:entries="@array/preference_preview_size_entries" android:entryValues="@array/preference_preview_size_values" - android:defaultValue="preference_preview_size_display" + android:defaultValue="preference_preview_size_wysiwyg" /> Date: Fri, 15 Jul 2022 05:46:39 +0000 Subject: [PATCH 17/58] 5664-continuous_burst_mode_not_stopping_issue issue: e/backlog#5664 When user long press capture button & start continuousBrustMode & remove touch before cameraController start taking image, causes unwanted behavior where burst-mode doesn't stop. Here when user remove the touch should_run_continuous_fast_burst is maintained. When 1 burst image is taken an event is passed EventBus to the MainActivity. On listening the event, the flag is checked & burst-mode stop called if necessary. --- app/build.gradle | 2 ++ .../ContinuousBurstImageRunningAction.java | 19 ++++++++++++++ .../sourceforge/opencamera/MainActivity.java | 26 ++++++++++++++++++- .../cameracontroller/CameraController2.java | 6 +++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/net/sourceforge/opencamera/ContinuousBurstImageRunningAction.java diff --git a/app/build.gradle b/app/build.gradle index 2e1ba0a2f..cbc622632 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,6 +63,8 @@ dependencies { // appcompat version must be 1.4.0 or later to satisfy emoji policy! implementation 'androidx.appcompat:appcompat:1.6.1' + implementation "org.greenrobot:eventbus:3.3.1" + implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.exifinterface:exifinterface:1.3.7' diff --git a/app/src/main/java/net/sourceforge/opencamera/ContinuousBurstImageRunningAction.java b/app/src/main/java/net/sourceforge/opencamera/ContinuousBurstImageRunningAction.java new file mode 100644 index 000000000..b5cf989e7 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ContinuousBurstImageRunningAction.java @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.sourceforge.opencamera; + +public class ContinuousBurstImageRunningAction { } diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 677630278..1566b4ac1 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -11,6 +11,10 @@ import net.sourceforge.opencamera.ui.FolderChooserDialog; import net.sourceforge.opencamera.ui.MainUI; import net.sourceforge.opencamera.ui.ManualSeekbars; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -145,6 +149,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen private ValueAnimator gallery_save_anim; private boolean last_continuous_fast_burst; // whether the last photo operation was a continuous_fast_burst private Future update_gallery_future; + private boolean should_run_continuous_fast_burst = false; private TextToSpeech textToSpeech; private boolean textToSpeechSuccess; @@ -757,6 +762,12 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "onCreate: total time for Activity startup: " + (System.currentTimeMillis() - debug_time)); } + @Override + protected void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + } + /** * if navigationMode is no gesture, then retrieve navigationBar's height & update navigation_gap */ @@ -1279,6 +1290,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen if( MyDebug.LOG ) Log.d(TAG, "onStop"); super.onStop(); + EventBus.getDefault().unregister(this); // we stop location listening in onPause, but done here again just to be certain! applicationInterface.getLocationSupplier().freeLocationListeners(); @@ -5337,6 +5349,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen closePopup(); this.last_continuous_fast_burst = continuous_fast_burst; + this.should_run_continuous_fast_burst = continuous_fast_burst; this.preview.takePicturePressed(photo_snapshot, continuous_fast_burst); } @@ -6532,7 +6545,18 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen public void takePhotoButtonLongClickCancelled() { if( MyDebug.LOG ) Log.d(TAG, "takePhotoButtonLongClickCancelled"); - if( preview.getCameraController() != null && preview.getCameraController().isContinuousBurstInProgress() ) { + if (preview.getCameraController() == null) { + return; + } + if (preview.getCameraController().isContinuousBurstInProgress()) { + preview.getCameraController().stopContinuousBurst(); + } + should_run_continuous_fast_burst = false; + } + + @Subscribe(threadMode = ThreadMode.MAIN_ORDERED) + public void onContinuousBurstImageRunningAction(ContinuousBurstImageRunningAction action) { + if (!should_run_continuous_fast_burst && preview.getCameraController() != null && preview.getCameraController().isContinuousBurstInProgress()) { preview.getCameraController().stopContinuousBurst(); } } diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java index c94d6d938..06e59c556 100644 --- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java +++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java @@ -1,5 +1,6 @@ package net.sourceforge.opencamera.cameracontroller; +import net.sourceforge.opencamera.ContinuousBurstImageRunningAction; import net.sourceforge.opencamera.HDRProcessor; import net.sourceforge.opencamera.MyDebug; @@ -64,6 +65,8 @@ import android.view.Surface; import android.view.SurfaceHolder; import android.view.TextureView; +import org.greenrobot.eventbus.EventBus; + /** Provides support using Android 5's Camera 2 API * android.hardware.camera2.*. */ @@ -1634,6 +1637,9 @@ public class CameraController2 extends CameraController { takePhotoCompleted(); } + if (n_burst_taken == 1) { + EventBus.getDefault().post(new ContinuousBurstImageRunningAction()); + } if( MyDebug.LOG ) Log.d(TAG, "done onImageAvailable"); } -- GitLab From fcc541fb12b1d5f77e21c115687bbd5a62ce5de4 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 7 Oct 2022 15:29:20 +0530 Subject: [PATCH 18/58] Camera: Disable touch sounds for camera button - Fixes double sound issue mentioned here https://gitlab.e.foundation/e/backlog/-/issues/5580 Change-Id: I2ee8e44815e64989727db8830e67a0682fa2e209 --- app/src/main/res/layout/activity_main.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c548ae5c8..b8c240b9a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -18,6 +18,7 @@ android:layout_height="100dp" android:padding="10dp" android:scaleType="fitCenter" + android:soundEffectsEnabled="false" android:contentDescription="@string/take_photo" app:srcCompat="@drawable/take_photo_selector" android:stateListAnimator="@animator/button_animation" -- GitLab From 9e488ec4673771fb064f0503584ccde175acd0fc Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 14 Oct 2022 09:34:44 +0530 Subject: [PATCH 19/58] Camera: Use alternative flash default on xiaomi, fairphone and gigaset - Fixes https://gitlab.e.foundation/e/backlog/-/issues/5818 Change-Id: Id2c1f9f5cc647017fc0469ff3009cb0f9acbe6ca --- .../opencamera/DeviceSettings.java | 34 +++++++++++++++++++ .../sourceforge/opencamera/MainActivity.java | 8 +++++ .../opencamera/PreferenceSubPhoto.java | 12 +++++++ 3 files changed, 54 insertions(+) create mode 100644 app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java diff --git a/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java b/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java new file mode 100644 index 000000000..bf98703a7 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2022 E FOUNDATION + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.sourceforge.opencamera; + +import android.os.Build; + +import java.util.Locale; + +public class DeviceSettings { + + /** Returns whether the the device uses fake flash in Camera API2. + * Some older device have issues in low light. + */ + public static boolean deviceUsingFakeFlash() { + final boolean is_xiaomi = Build.MANUFACTURER.toLowerCase(Locale.US).contains("xiaomi"); + final boolean is_fairphone = Build.MANUFACTURER.toLowerCase(Locale.US).contains("fairphone"); + final boolean is_GS290 = Build.DEVICE != null && Build.DEVICE.equals("GS290"); + return is_fairphone || is_xiaomi || is_GS290; + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 1566b4ac1..3f4137bff 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -892,6 +892,14 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen //Log.d(TAG, "is_pixel_phone? " + is_pixel_phone); //Log.d(TAG, "is_pixel_xl_phone? " + is_pixel_xl_phone); }*/ + if ( DeviceSettings.deviceUsingFakeFlash() ) { + if( MyDebug.LOG ) + Log.d(TAG, "set fake flash for camera2"); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + final SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(PreferenceKeys.Camera2FakeFlashPreferenceKey, true); + editor.apply(); + } /*if( is_samsung || is_oneplus ) { // The problems we used to have on Samsung Galaxy devices are now fixed, by setting // TEMPLATE_PREVIEW for the precaptureBuilder in CameraController2. This also fixes the diff --git a/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java b/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java index f6a648628..9ea7c30fd 100644 --- a/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java +++ b/app/src/main/java/net/sourceforge/opencamera/PreferenceSubPhoto.java @@ -196,6 +196,18 @@ public class PreferenceSubPhoto extends PreferenceSubScreen { pg.removePreference(pref); } + if ( DeviceSettings.deviceUsingFakeFlash() ) { + if( MyDebug.LOG ) + Log.d(TAG, "set fake flash for camera2"); + Preference pref = findPreference(PreferenceKeys.Camera2FakeFlashPreferenceKey); + pref.setDefaultValue(true); + pref.setEnabled(false); + + final SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(PreferenceKeys.Camera2FakeFlashPreferenceKey, true); + editor.apply(); + } + if( !supports_expo_bracketing || max_expo_bracketing_n_images <= 3 ) { Preference pref = findPreference("preference_expo_bracketing_n_images"); //PreferenceGroup pg = (PreferenceGroup) this.findPreference("preference_screen_photo_settings"); -- GitLab From 1a861a8f1ea1947f312f0ba625246ac38f880284 Mon Sep 17 00:00:00 2001 From: althafvly Date: Wed, 26 Oct 2022 10:42:26 +0530 Subject: [PATCH 20/58] Camera: Enable support for editing photo after taken Change-Id: Ib251522ebd6cf1696b8461cbfd5682a5ed11aa75 --- app/src/main/java/net/sourceforge/opencamera/MainActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 3f4137bff..d5481cfa9 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -4680,6 +4680,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen if( MyDebug.LOG ) Log.d(TAG, "launch uri:" + uri); final String REVIEW_ACTION = "com.android.camera.action.REVIEW"; + final String KEY_FROM_SNAPCAM = "from-snapcam"; boolean done = false; if( !is_raw ) { // REVIEW_ACTION means we can view video files without autoplaying. @@ -4691,6 +4692,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "try REVIEW_ACTION"); try { Intent intent = new Intent(REVIEW_ACTION, uri); + intent.putExtra(KEY_FROM_SNAPCAM, true); this.startActivity(intent); done = true; } @@ -4703,6 +4705,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "try ACTION_VIEW"); try { Intent intent = new Intent(Intent.ACTION_VIEW, uri); + intent.putExtra(KEY_FROM_SNAPCAM, true); this.startActivity(intent); } catch(ActivityNotFoundException e) { -- GitLab From 668c004b1650f5bbfa127da12851bf04bd591b0f Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 28 Oct 2022 11:32:13 +0530 Subject: [PATCH 21/58] Camera: Fix camera orientation Change-Id: I228bb71853b3417c8a103710b83a68d933cb314c --- .../java/net/sourceforge/opencamera/preview/Preview.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java index 78b0a079d..31445cfc5 100644 --- a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java +++ b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java @@ -4170,6 +4170,13 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( MyDebug.LOG ) Log.d(TAG, "getImageVideoRotation() lock to portrait, returns " + result); return result; + } else { + int cameraRotationOffset = camera_controller.getCameraOrientation(); + boolean isFrontFacing = camera_controller.getFacing() == CameraController.Facing.FACING_FRONT; + int rotation = isFrontFacing ? cameraRotationOffset + getDisplayRotationDegrees(true) : + cameraRotationOffset - getDisplayRotationDegrees(true); + + current_rotation = (360 + rotation) % 360; } if( MyDebug.LOG ) Log.d(TAG, "getImageVideoRotation() returns current_rotation " + current_rotation); -- GitLab From db39f5452be2dea6efad4e38da629a78ce4a8ad8 Mon Sep 17 00:00:00 2001 From: althafvly Date: Sat, 12 Nov 2022 10:37:02 +0530 Subject: [PATCH 22/58] camera: Fix wrong file uri sent in intent. - Delete option in gallery became unusable - Disable edit only if uri is not accessible at all. --- .../sourceforge/opencamera/MainActivity.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index d5481cfa9..c2d663353 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -4623,8 +4623,9 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen if( MyDebug.LOG ) Log.d(TAG, "openGallery"); //Intent intent = new Intent(Intent.ACTION_VIEW, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - Uri uri = applicationInterface.getStorageUtils().getLastMediaScanned(); - boolean is_raw = uri != null && applicationInterface.getStorageUtils().getLastMediaScannedIsRaw(); + Uri primaryUri = applicationInterface.getStorageUtils().getLastMediaScanned(); + Uri uri = null; + boolean is_raw = false; if( MyDebug.LOG && uri != null ) { Log.d(TAG, "found cached most recent uri: " + uri); Log.d(TAG, " is_raw: " + is_raw); @@ -4675,6 +4676,14 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; is_raw = false; } + + boolean allowEdit = true; + if( uri == null ) { + uri = primaryUri; + is_raw = uri != null && applicationInterface.getStorageUtils().getLastMediaScannedIsRaw(); + allowEdit = false; + } + if( !is_test ) { // don't do if testing, as unclear how to exit activity to finish test (for testGallery()) if( MyDebug.LOG ) @@ -4692,7 +4701,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "try REVIEW_ACTION"); try { Intent intent = new Intent(REVIEW_ACTION, uri); - intent.putExtra(KEY_FROM_SNAPCAM, true); + intent.putExtra(KEY_FROM_SNAPCAM, allowEdit); this.startActivity(intent); done = true; } @@ -4705,7 +4714,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "try ACTION_VIEW"); try { Intent intent = new Intent(Intent.ACTION_VIEW, uri); - intent.putExtra(KEY_FROM_SNAPCAM, true); + intent.putExtra(KEY_FROM_SNAPCAM, allowEdit); this.startActivity(intent); } catch(ActivityNotFoundException e) { -- GitLab From c77ab505cd7469713fef8dd808d67aed89e0b19b Mon Sep 17 00:00:00 2001 From: althafvly Date: Sun, 4 Dec 2022 20:58:07 +0530 Subject: [PATCH 23/58] Camera: Change multi lens switch icon --- app/build.gradle | 4 +- .../sourceforge/opencamera/MainActivity.java | 47 ++++++++++++++----- .../main/res/drawable/ic_lens_background.xml | 9 ++++ app/src/main/res/layout/activity_main.xml | 19 ++++---- app/src/main/res/values/strings.xml | 2 + build.gradle | 1 + 6 files changed, 57 insertions(+), 25 deletions(-) create mode 100644 app/src/main/res/drawable/ic_lens_background.xml diff --git a/app/build.gradle b/app/build.gradle index cbc622632..b0a9606cd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ android { defaultConfig { applicationId "foundation.e.camera" - minSdkVersion 15 + minSdkVersion 25 targetSdkVersion 34 //compileSdkVersion 31 // needed to support appcompat:1.4.0 (which we need for emoji policy support, and not yet ready to target SDK 30) @@ -65,6 +65,8 @@ dependencies { implementation "org.greenrobot:eventbus:3.3.1" + implementation 'foundation.e:elib:0.0.1-alpha11' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.exifinterface:exifinterface:1.3.7' diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index c2d663353..59c837138 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -100,6 +100,7 @@ import android.view.ViewGroup; import android.view.WindowInsets; import android.view.WindowManager; import android.view.animation.AccelerateDecelerateInterpolator; +import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.SeekBar; @@ -2375,20 +2376,8 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.e(TAG, "getNextMultiCameraId() called but not in multi-cam mode"); throw new RuntimeException("getNextMultiCameraId() called but not in multi-cam mode"); } - List camera_set; - // don't use preview.getCameraController(), as it may be null if user quickly switches between cameras int currCameraId = getActualCameraId(); - switch( preview.getCameraControllerManager().getFacing(currCameraId) ) { - case FACING_BACK: - camera_set = back_camera_ids; - break; - case FACING_FRONT: - camera_set = front_camera_ids; - break; - default: - camera_set = other_camera_ids; - break; - } + List camera_set = getCameraSet(currCameraId); int cameraId; int indx = camera_set.indexOf(currCameraId); if( indx == -1 ) { @@ -2412,6 +2401,24 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen return cameraId; } + private List getCameraSet(int currCameraId) { + // don't use preview.getCameraController(), as it may be null if user quickly switches between cameras + List camera_set; + switch( preview.getCameraControllerManager().getFacing(currCameraId) ) { + case FACING_BACK: + camera_set = back_camera_ids; + break; + case FACING_FRONT: + camera_set = front_camera_ids; + break; + default: + camera_set = other_camera_ids; + break; + } + + return camera_set; + } + private void pushCameraIdToast(int cameraId) { if( MyDebug.LOG ) Log.d(TAG, "pushCameraIdToast: " + cameraId); @@ -2562,6 +2569,18 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen showAlert(alertDialog.create()); } + private void updateMultiCameraIcon() { + Button multiCameraButton = findViewById(R.id.switch_multi_camera); + + if (multiCameraButton.getVisibility() != View.GONE) { + int currCameraId = getActualCameraId(); + List camera_set = getCameraSet(currCameraId); + int index = camera_set.indexOf(currCameraId); + String text = getString(R.string.switch_multi_camera_lens) + " " + (index + 1); + multiCameraButton.setText(text); + } + } + /** * Toggles Photo/Video mode */ @@ -3433,6 +3452,8 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen View button = findViewById(R.id.switch_multi_camera); changed = changed || (button.getVisibility() != View.GONE); button.setVisibility(View.GONE); + } else { + updateMultiCameraIcon(); } if( MyDebug.LOG ) Log.d(TAG, "checkDisableGUIIcons: " + changed); diff --git a/app/src/main/res/drawable/ic_lens_background.xml b/app/src/main/res/drawable/ic_lens_background.xml new file mode 100644 index 000000000..27e3ec4a4 --- /dev/null +++ b/app/src/main/res/drawable/ic_lens_background.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b8c240b9a..b425a5580 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -41,22 +41,19 @@ android:backgroundTintMode="src_in" /> - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 45d719103..e051bcd4f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1103,4 +1103,6 @@ - Support for Camera2 API\n - Panorama, including for front camera. Terms of service + + LENS diff --git a/build.gradle b/build.gradle index 80d975728..ab4e9451d 100644 --- a/build.gradle +++ b/build.gradle @@ -13,5 +13,6 @@ allprojects { repositories { google() mavenCentral() + maven { url 'https://gitlab.e.foundation/api/v4/groups/9/-/packages/maven' } } } -- GitLab From 4d21370c7dcdfdf77974107f2034d77c3f8503dc Mon Sep 17 00:00:00 2001 From: althafvly Date: Wed, 19 Oct 2022 19:58:38 +0530 Subject: [PATCH 24/58] camera: import CameraID tools - Imported from https://github.com/vibhorSrv/CameraIDs - Also converted to kotlin Change-Id: I5b5fdb76ffea16da6a76596e53da5d702a89e71e --- app/build.gradle | 2 + .../opencamera/camera2/CameraFinder.kt | 91 +++++++++++++++ .../camera2/CameraFinderAbstract.kt | 68 ++++++++++++ .../opencamera/camera2/CameraIDs.kt | 19 ++++ .../opencamera/camera2/CameraIdentifier.kt | 104 ++++++++++++++++++ .../camera2/CameraIdentifierAbstract.kt | 7 ++ .../opencamera/camera2/CameraUtil.kt | 26 +++++ .../opencamera/camera2/ReflectionApi.kt | 9 ++ .../opencamera/camera2/ReflectionProvider.kt | 25 +++++ .../camera2/model/Camera2ApiProperties.kt | 35 ++++++ .../opencamera/camera2/model/CameraModel.kt | 48 ++++++++ .../opencamera/camera2/model/CameraType.kt | 11 ++ .../camera2/model/DerivedProperties.kt | 9 ++ build.gradle | 1 + 14 files changed, 455 insertions(+) create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/CameraFinder.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/CameraFinderAbstract.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/CameraIDs.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/CameraIdentifier.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/CameraIdentifierAbstract.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/CameraUtil.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/ReflectionApi.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/ReflectionProvider.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/model/Camera2ApiProperties.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/model/CameraModel.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/model/CameraType.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/camera2/model/DerivedProperties.kt diff --git a/app/build.gradle b/app/build.gradle index b0a9606cd..6a5977a68 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.application' +apply plugin: 'org.jetbrains.kotlin.android' android { compileSdk 34 @@ -59,6 +60,7 @@ android { dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.5' + implementation 'androidx.core:core-ktx:1.8.0' // appcompat version must be 1.4.0 or later to satisfy emoji policy! implementation 'androidx.appcompat:appcompat:1.6.1' diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/CameraFinder.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraFinder.kt new file mode 100644 index 000000000..724519065 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraFinder.kt @@ -0,0 +1,91 @@ +package net.sourceforge.opencamera.camera2 + +import android.graphics.ImageFormat +import android.hardware.camera2.CameraCharacteristics +import android.hardware.camera2.CameraManager +import android.hardware.camera2.CameraMetadata +import android.os.Build +import android.util.Size +import net.sourceforge.opencamera.camera2.model.Camera2ApiProperties +import net.sourceforge.opencamera.camera2.model.CameraModel +import net.sourceforge.opencamera.camera2.model.DerivedProperties +import java.util.function.Consumer + +class CameraFinder(cameraManager: CameraManager) : + CameraFinderAbstract>(cameraManager) { + init { + cameraModels = ArrayList() + } + + public override fun createModels() { + validCameraIds.forEach(Consumer { cameraModels.add(CameraModel(it.toInt())) }) + cameraModels.forEach(Consumer { + it.camera2ApiProperties = findProperties(it.id, getCameraCharacteristics(it.id)!!) + }) + cameraModels.forEach(Consumer { + it.derivedProperties = deriveProperties(it.id, it.camera2ApiProperties) + }) + } + + public override fun findProperties( + cameraId: Int, characteristics: CameraCharacteristics): Camera2ApiProperties { + return Camera2ApiProperties(cameraId).apply { + facing = characteristics.get(CameraCharacteristics.LENS_FACING)!! + focalLength = + characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)!![0] + aperture = + characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES)!![0] + aeModes = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES)!! + isFlashSupported = characteristics.get( + CameraCharacteristics.FLASH_INFO_AVAILABLE)!! + val configMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) + if (configMap?.getOutputSizes(ImageFormat.RAW_SENSOR) != null) { + rawSensorSizes = configMap.getOutputSizes(ImageFormat.RAW_SENSOR) + } + sensorSize = characteristics.get( + CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE)!! + pixelArraySize = characteristics.get( + CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE)!! + supportedHardwareLevel = characteristics.get( + CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)!! + supportedHardwareLevelString = reflectionProvider.getResultFieldName( + CameraMetadata::class.java, + "INFO_SUPPORTED_HARDWARE_LEVEL_", + supportedHardwareLevel + ) + physicalIds = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + characteristics.physicalCameraIds + } else { + setOf() + } + } + } + + public override fun deriveProperties( + cameraId: Int, + camera2ApiProperties: Camera2ApiProperties + ): DerivedProperties { + return DerivedProperties(cameraId).apply { + facing = reflectionProvider.getResultFieldName( + CameraMetadata::class.java, + "LENS_FACING_", + camera2ApiProperties.facing + ) + isLogical = camera2ApiProperties.physicalIds.isNotEmpty() + angleOfView = CameraUtil.calculateAngleOfView( + camera2ApiProperties.focalLength, + camera2ApiProperties.sensorSize, + camera2ApiProperties.pixelArraySize + ) + pixelSize = CameraUtil.calculatePixelSize( + camera2ApiProperties.pixelArraySize.width, + camera2ApiProperties.sensorSize.width + ) + mm35FocalLength = + CameraUtil.calculate35mmeqv( + camera2ApiProperties.focalLength, + camera2ApiProperties.sensorSize + ) + } + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/CameraFinderAbstract.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraFinderAbstract.kt new file mode 100644 index 000000000..860dd367a --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraFinderAbstract.kt @@ -0,0 +1,68 @@ +package net.sourceforge.opencamera.camera2 + +import android.hardware.camera2.CameraAccessException +import android.hardware.camera2.CameraCharacteristics +import android.hardware.camera2.CameraManager +import net.sourceforge.opencamera.camera2.model.Camera2ApiProperties +import net.sourceforge.opencamera.camera2.model.CameraModel +import net.sourceforge.opencamera.camera2.model.DerivedProperties +import java.util.* +import java.util.stream.Collectors + +abstract class CameraFinderAbstract>( + private val cameraManager: CameraManager +) : CameraIDs.Finder { + protected val validCameraIds: MutableList = ArrayList() + protected val reflectionProvider = ReflectionProvider() + override lateinit var cameraModels: T + protected set + + override fun init() { + scanCameras(cameraManager) + createModels() + } + + protected abstract fun createModels() + protected abstract fun findProperties( + cameraId: Int, + characteristics: CameraCharacteristics + ): Camera2ApiProperties + + protected abstract fun deriveProperties( + cameraId: Int, + camera2ApiProperties: Camera2ApiProperties + ): DerivedProperties + + private fun scanCameras(cameraManager: CameraManager) { + for (id in 0..511) { + try { + cameraManager.getCameraCharacteristics(id.toString()) + validCameraIds.add(id.toString()) + } catch (ignored: IllegalArgumentException) { + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + override fun getCameraCharacteristics(cameraId: Int): CameraCharacteristics? { + try { + return cameraManager.getCameraCharacteristics(cameraId.toString()) + } catch (e: CameraAccessException) { + e.printStackTrace() + } + return null + } + + override val apiCameraIdList: List + get() { + try { + return Arrays.stream(cameraManager.cameraIdList).collect(Collectors.toList()) + } catch (e: CameraAccessException) { + e.printStackTrace() + } + return ArrayList() + } + override val allCameraIdList: List + get() = validCameraIds +} diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/CameraIDs.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraIDs.kt new file mode 100644 index 000000000..059eb1a63 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraIDs.kt @@ -0,0 +1,19 @@ +package net.sourceforge.opencamera.camera2 + +import android.hardware.camera2.CameraCharacteristics +import net.sourceforge.opencamera.camera2.model.CameraModel + +interface CameraIDs { + interface Finder> { + fun init() + fun getCameraCharacteristics(cameraId: Int): CameraCharacteristics? + val cameraModels: T + val apiCameraIdList: List + val allCameraIdList: List + } + + interface Identifier> { + fun init() + fun identifyCamera(cameraModels: T) + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/CameraIdentifier.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraIdentifier.kt new file mode 100644 index 000000000..df908f1e1 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraIdentifier.kt @@ -0,0 +1,104 @@ +package net.sourceforge.opencamera.camera2 + +import android.hardware.camera2.CameraCharacteristics +import net.sourceforge.opencamera.camera2.model.Camera2ApiProperties +import net.sourceforge.opencamera.camera2.model.CameraModel +import net.sourceforge.opencamera.camera2.model.CameraType +import java.util.TreeSet +import java.util.function.Consumer +import kotlin.Comparator +import kotlin.collections.ArrayList + +class CameraIdentifier(cameraModels: ArrayList) : + CameraIdentifierAbstract>(cameraModels) { + private val frontCameraModels = ArrayList() + private val backCameraModels = ArrayList() + private val widerThanMain = TreeSet(SORT_BY_ANGLE_OF_VIEW) + private val narrowerThanMain = ArrayList() + private val propertiesArrayList = ArrayList() + override fun init() { + cameraModels.forEach(Consumer { + propertiesArrayList.add(it.camera2ApiProperties) + }) + frontOrBack(cameraModels) + identifyCamera(frontCameraModels) + identifyCamera(backCameraModels) + } + + private fun frontOrBack(cameraModels: Collection) { + for (model in cameraModels) { + if (model.camera2ApiProperties.facing == CameraCharacteristics.LENS_FACING_BACK) { + backCameraModels.add(model) + } + if (model.camera2ApiProperties.facing == CameraCharacteristics.LENS_FACING_FRONT) { + frontCameraModels.add(model) + } + } + } + + override fun identifyCamera(cameraModels: ArrayList) { + if (cameraModels.isNotEmpty()) { + val main = cameraModels[0] + main.cameraType = CameraType.MAIN + main.zoomFactor = 1f + cameraModels.removeAt(0) + + //Determine whether camera is logical + cameraModels.forEach(Consumer { model: CameraModel -> + if (model.derivedProperties.isLogical || getBit(6, model.id)) { + model.cameraType = CameraType.LOGICAL + } + propertiesArrayList.forEach(Consumer { + if (model.id != it.id && model.camera2ApiProperties == it) { + model.cameraType = CameraType.LOGICAL + } + }) + }) + cameraModels.removeIf { it.isTypeSet } + cameraModels.sortWith(SORT_BY_ANGLE_OF_VIEW) + cameraModels.forEach(Consumer { + val zoom = + it.derivedProperties.mm35FocalLength / main.derivedProperties.mm35FocalLength + it.zoomFactor = zoom + + //Determine whether camera is Depth or Other + it.cameraType = CameraType.OTHER + if (!it.camera2ApiProperties.isFlashSupported) { + it.cameraType = CameraType.DEPTH + } else { + if (it.derivedProperties.angleOfView > main.derivedProperties.angleOfView) { + widerThanMain.add(it) + } else { + narrowerThanMain.add(it) + } + } + }) + + //Determine whether camera is Ultrawide or Macro + widerThanMain.forEach(Consumer { + it.cameraType = if ( + it.derivedProperties.angleOfView == + widerThanMain.last().derivedProperties.angleOfView + ) { + CameraType.ULTRAWIDE + } else { + CameraType.MACRO + } + }) + + // Determine whether camera is Tele + narrowerThanMain.forEach(Consumer { cameraModel: CameraModel -> + cameraModel.cameraType = CameraType.TELE + }) + } + } + + private fun getBit(num: Int, `val`: Int): Boolean { + return `val` shr num - 1 and 1 == 1 + } + + companion object { + private val SORT_BY_ANGLE_OF_VIEW = + Comparator.comparingDouble { cameraModel: CameraModel -> cameraModel.derivedProperties.angleOfView } + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/CameraIdentifierAbstract.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraIdentifierAbstract.kt new file mode 100644 index 000000000..9f2e1d8a8 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraIdentifierAbstract.kt @@ -0,0 +1,7 @@ +package net.sourceforge.opencamera.camera2 + +import net.sourceforge.opencamera.camera2.model.CameraModel + +abstract class CameraIdentifierAbstract>( + protected val cameraModels: T +) : CameraIDs.Identifier diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/CameraUtil.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraUtil.kt new file mode 100644 index 000000000..cfef5db59 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/CameraUtil.kt @@ -0,0 +1,26 @@ +package net.sourceforge.opencamera.camera2 + +import android.util.Size +import android.util.SizeF +import kotlin.math.atan +import kotlin.math.pow +import kotlin.math.sqrt + +object CameraUtil { + fun calculatePixelSize(pixelArrayWidth: Int, sensorWidth: Float): Float { + return sensorWidth / pixelArrayWidth.toFloat() * 1000.0f + } + + fun calculateAngleOfView( + focalLength: Float, sensorSize: SizeF, pixelArraySize: Size + ): Double { + val pixelSize = calculatePixelSize(pixelArraySize.width, sensorSize.width) + return Math.toDegrees(atan(sqrt((sensorSize.width * pixelSize).toDouble().pow(2.0) + + (sensorSize.height * pixelSize).toDouble().pow(2.0) + ) / (2.0f * focalLength).toDouble()) * 2.0) + } + + fun calculate35mmeqv(focalLength: Float, sensorSize: SizeF): Float { + return 36.0f / sensorSize.width * focalLength + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/ReflectionApi.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/ReflectionApi.kt new file mode 100644 index 000000000..73240f6a4 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/ReflectionApi.kt @@ -0,0 +1,9 @@ +package net.sourceforge.opencamera.camera2 + +import java.lang.reflect.Field +import java.lang.reflect.Method + +interface ReflectionApi { + fun getFields(aClass: Class<*>): Array + fun getMethods(aClass: Class<*>): Array +} diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/ReflectionProvider.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/ReflectionProvider.kt new file mode 100644 index 000000000..16400bed9 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/ReflectionProvider.kt @@ -0,0 +1,25 @@ +package net.sourceforge.opencamera.camera2 + +import java.lang.reflect.Field +import java.lang.reflect.Method + +class ReflectionProvider : ReflectionApi { + override fun getFields(aClass: Class<*>): Array { + return aClass.declaredFields + } + + override fun getMethods(aClass: Class<*>): Array { + return aClass.declaredMethods + } + + fun getResultFieldName(aClass: Class<*>, prefix: String, value: Int): String { + for (f in getFields(aClass)) if (f.name.startsWith(prefix)) { + try { + if (f.getInt(f) == value) return f.name.replace(prefix, "") + } catch (e: IllegalAccessException) { + e.printStackTrace() + } + } + return "" + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/model/Camera2ApiProperties.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/model/Camera2ApiProperties.kt new file mode 100644 index 000000000..d8bba062a --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/model/Camera2ApiProperties.kt @@ -0,0 +1,35 @@ +package net.sourceforge.opencamera.camera2.model + +import android.util.Size +import android.util.SizeF +import java.util.Objects + +class Camera2ApiProperties(val id: Int) { + var facing = 0 + var focalLength = 0f + var aperture = 0f + lateinit var aeModes: IntArray + lateinit var rawSensorSizes: Array + lateinit var sensorSize: SizeF + lateinit var pixelArraySize: Size + var isFlashSupported = false + var supportedHardwareLevel = 0 + lateinit var supportedHardwareLevelString: String + lateinit var physicalIds: Set + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other == null || javaClass != other.javaClass) return false + val that = other as Camera2ApiProperties + return facing == that.facing && that.focalLength.compareTo(focalLength) == 0 && that.aperture.compareTo( + aperture + ) == 0 && isFlashSupported == that.isFlashSupported && + aeModes.contentEquals(that.aeModes) && sensorSize == that.sensorSize + } + + override fun hashCode(): Int { + var result = Objects.hash(facing, focalLength, aperture, sensorSize, isFlashSupported) + result = 31 * result + aeModes.contentHashCode() + return result + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/model/CameraModel.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/model/CameraModel.kt new file mode 100644 index 000000000..eaa1d8ece --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/model/CameraModel.kt @@ -0,0 +1,48 @@ +package net.sourceforge.opencamera.camera2.model + +import java.util.Locale +import kotlin.math.roundToInt + +class CameraModel(val id: Int) { + var cameraType: CameraType? = null + var zoomFactor = 0f + lateinit var camera2ApiProperties: Camera2ApiProperties + lateinit var derivedProperties: DerivedProperties + + val isTypeSet: Boolean + get() = cameraType != null + + fun cameraFullModel(): MutableMap { + return mutableMapOf().apply { + this["CameraID"] = "[$id]" + if (cameraType != CameraType.LOGICAL) { + this["CameraID"] += " \u2605" + } else if (camera2ApiProperties.physicalIds.isNotEmpty()) { + this["CameraID"] += + " = ${camera2ApiProperties.physicalIds.toString().replace(", ", "+")}" + } + + this["Facing"] = "${derivedProperties.facing}" + + if (cameraType != CameraType.LOGICAL) { + this["Zoom"] = String.format(Locale.ROOT, "%.2fx", zoomFactor) + .replace(".00", "") + } + + this["Type"] = "$cameraType" + this["FocalLength"] = String.format( + Locale.ROOT, "%.2fmm", camera2ApiProperties.focalLength) + this["35mm eqv FocalLength"] = String.format( + Locale.ROOT, "%.2fmm", derivedProperties.mm35FocalLength) + this["Aperture"] = "${camera2ApiProperties.aperture}" + this["SensorSize"] = "${camera2ApiProperties.sensorSize}" + this["PixelArray"] = "${camera2ApiProperties.pixelArraySize}" + this["PixelSize"] = String.format(Locale.ROOT, "%.2fµm", derivedProperties.pixelSize) + this["AngleOfView(Diagonal)"] = "${derivedProperties.angleOfView.roundToInt()}°" + this["AEModes"] = camera2ApiProperties.aeModes.contentToString() + this["FlashSupported"] = "${camera2ApiProperties.isFlashSupported}" + this["RAW_SENSOR sizes"] = camera2ApiProperties.rawSensorSizes.contentDeepToString() + this["SupportedHardwareLevel"] = camera2ApiProperties.supportedHardwareLevelString + } + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/model/CameraType.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/model/CameraType.kt new file mode 100644 index 000000000..601886465 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/model/CameraType.kt @@ -0,0 +1,11 @@ +package net.sourceforge.opencamera.camera2.model + +enum class CameraType { + MAIN, + ULTRAWIDE, + TELE, + MACRO, + DEPTH, + LOGICAL, + OTHER +} \ No newline at end of file diff --git a/app/src/main/java/net/sourceforge/opencamera/camera2/model/DerivedProperties.kt b/app/src/main/java/net/sourceforge/opencamera/camera2/model/DerivedProperties.kt new file mode 100644 index 000000000..266a9349c --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/camera2/model/DerivedProperties.kt @@ -0,0 +1,9 @@ +package net.sourceforge.opencamera.camera2.model + +class DerivedProperties(val id: Int) { + var isLogical = false + var facing: String? = null + var angleOfView = 0.0 + var mm35FocalLength = 0f + var pixelSize = 0f +} diff --git a/build.gradle b/build.gradle index ab4e9451d..d8593c698 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:8.2.1' + classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10' } } -- GitLab From c2970edd31fe52c67eb2bc289f56f76731413ba2 Mon Sep 17 00:00:00 2001 From: althafvly Date: Wed, 19 Oct 2022 20:20:30 +0530 Subject: [PATCH 25/58] Camera: Switch between zoom level with multi-lens button - Optionally allow logical camera ids - Optionally allow zoom level switch - Allow setting up zoom levels with overlay --- .../sourceforge/opencamera/MainActivity.java | 179 +++++++++++++++--- .../opencamera/preview/Preview.java | 8 +- app/src/main/res/values/config.xml | 20 ++ 3 files changed, 183 insertions(+), 24 deletions(-) create mode 100644 app/src/main/res/values/config.xml diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 59c837138..35f85b9a2 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -1,8 +1,12 @@ package net.sourceforge.opencamera; +import net.sourceforge.opencamera.camera2.CameraFinder; +import net.sourceforge.opencamera.camera2.CameraIdentifier; import net.sourceforge.opencamera.cameracontroller.CameraController; import net.sourceforge.opencamera.cameracontroller.CameraControllerManager; import net.sourceforge.opencamera.cameracontroller.CameraControllerManager2; +import net.sourceforge.opencamera.camera2.model.CameraModel; +import net.sourceforge.opencamera.camera2.model.CameraType; import net.sourceforge.opencamera.preview.Preview; import net.sourceforge.opencamera.preview.VideoProfile; import net.sourceforge.opencamera.remotecontrol.BluetoothRemoteControl; @@ -42,6 +46,9 @@ import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraMetadata; import android.hardware.display.DisplayManager; import android.media.MediaMetadataRetriever; import android.net.Uri; @@ -124,6 +131,11 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen // components: always non-null (after onCreate()) private BluetoothRemoteControl bluetoothRemoteControl; private PermissionHandler permissionHandler; + private CameraManager cameraManager; + private CameraFinder camerafinder; + private CameraIdentifier cameraIdentifier; + private ArrayList cameraModel; + private CameraCharacteristics cameraCharacteristics; private SettingsManager settingsManager; private MainUI mainUI; private ManualSeekbars manualSeekbars; @@ -155,6 +167,9 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen private TextToSpeech textToSpeech; private boolean textToSpeechSuccess; + private List frontZoomRatios = new ArrayList<>(); + private List backZoomRatios = new ArrayList<>(); + private AudioListener audio_listener; // may be null - created when needed //private boolean ui_placement_right = true; @@ -175,6 +190,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen private List back_camera_ids; private List front_camera_ids; private List other_camera_ids; + private List logical_camera_ids; private final ToastBoxer switch_video_toast = new ToastBoxer(); private final ToastBoxer screen_locked_toast = new ToastBoxer(); @@ -217,6 +233,8 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen //private final String CHANNEL_ID = "open_camera_channel"; //private final int image_saving_notification_id = 1; + private final float defaultLensZoom = 1.0F; + private static final float WATER_DENSITY_FRESHWATER = 1.0f; private static final float WATER_DENSITY_SALTWATER = 1.03f; private float mWaterDensity = 1.0f; @@ -409,6 +427,13 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen getWindow().setAttributes(layout); } + cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); + camerafinder = new CameraFinder(cameraManager); + cameraModel = camerafinder.getCameraModels(); + cameraIdentifier = new CameraIdentifier(cameraModel); + camerafinder.init(); + cameraIdentifier.init(); + // Setup multi-camera buttons (must be done after creating preview so we know which Camera API is being used, // and before initialising on-screen visibility). // We only allow the separate icon for switching cameras if: @@ -419,24 +444,48 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen // If there are more than two cameras, but all cameras have the same "facing, we still stick // with using the switch camera icon to iterate over all cameras. int n_cameras = preview.getCameraControllerManager().getNumberOfCameras(); + if (getResources().getBoolean(R.bool.zoom_level_switch_supported)) { + n_cameras = camerafinder.getAllCameraIdList().size(); + } if( n_cameras > 2 ) { this.back_camera_ids = new ArrayList<>(); this.front_camera_ids = new ArrayList<>(); this.other_camera_ids = new ArrayList<>(); - for(int i=0;i(); + + if (!cameraModel.isEmpty()) { + for (CameraModel model : cameraModel) { + if (model.getCameraType() == CameraType.LOGICAL) { + logical_camera_ids.add(model.getId()); + } + } + } + + for(String cameraId: camerafinder.getAllCameraIdList()) { + int id = Integer.parseInt(cameraId); + cameraCharacteristics = camerafinder.getCameraCharacteristics(id); + Integer facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING); + if (!logical_camera_ids.contains(id) + || getResources().getBoolean(R.bool.allow_logical_camera_ids)) { + switch(facing) { + case CameraMetadata.LENS_FACING_BACK: + back_camera_ids.add(id); + break; + case CameraMetadata.LENS_FACING_FRONT: + front_camera_ids.add(id); + break; + case CameraMetadata.LENS_FACING_EXTERNAL: + other_camera_ids.add(id); + break; + } } } + if( MyDebug.LOG ) { + Log.d(TAG, "back_camera_ids: " + back_camera_ids); + Log.d(TAG, "front_camera_ids: " + front_camera_ids); + Log.d(TAG, "other_camera_ids: " + other_camera_ids); + Log.d(TAG, "logical_camera_ids" + logical_camera_ids); + } boolean multi_same_facing = back_camera_ids.size() >= 2 || front_camera_ids.size() >= 2 || other_camera_ids.size() >= 2; int n_facing = 0; if( back_camera_ids.size() > 0 ) @@ -453,6 +502,10 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "is_multi_cam: " + is_multi_cam); } + if (getResources().getBoolean(R.bool.zoom_level_switch_supported)) { + initZoomRatios(); + } + if( !is_multi_cam ) { this.back_camera_ids = null; this.front_camera_ids = null; @@ -847,15 +900,15 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen int cameraId = getActualCameraId(); switch( preview.getCameraControllerManager().getFacing(cameraId) ) { case FACING_BACK: - if( back_camera_ids.size() > 0 ) + if( back_camera_ids.size() > 1 ) return true; break; case FACING_FRONT: - if( front_camera_ids.size() > 0 ) + if( front_camera_ids.size() > 1 ) return true; break; default: - if( other_camera_ids.size() > 0 ) + if( other_camera_ids.size() > 1 ) return true; break; } @@ -2435,7 +2488,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } } - private void userSwitchToCamera(int cameraId) { + private void userSwitchToCamera(int cameraId, boolean is_multi_cam) { if( MyDebug.LOG ) Log.d(TAG, "userSwitchToCamera: " + cameraId); View switchCameraButton = findViewById(R.id.switch_camera); @@ -2445,13 +2498,93 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen switchMultiCameraButton.setEnabled(false); applicationInterface.reset(true); this.getApplicationInterface().getDrawPreview().setDimPreview(true); - this.preview.setCamera(cameraId); + if (is_multi_cam && getResources().getBoolean(R.bool.zoom_level_switch_supported)) { + changeZoomFactor(); + } else { + this.preview.setCamera(cameraId); + } switchCameraButton.setEnabled(true); switchMultiCameraButton.setEnabled(true); // no need to call mainUI.setSwitchCameraContentDescription - this will be called from Preview.cameraSetup when the // new camera is opened } + private void initZoomRatios() { + String[] auxZoomRatios = getResources().getStringArray(R.array.config_auxCameraZoomRatios); + if (auxZoomRatios.length == 0 && !cameraModel.isEmpty()) { + for (CameraModel model : cameraModel) { + cameraCharacteristics = camerafinder.getCameraCharacteristics(model.getId()); + Integer facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING); + CameraType cameraType = model.getCameraType(); + if (cameraType != CameraType.LOGICAL) { + if (facing == CameraMetadata.LENS_FACING_BACK) { + if (cameraType == CameraType.MAIN || cameraType == CameraType.ULTRAWIDE + || cameraType == CameraType.TELE || cameraType == CameraType.MACRO) { + backZoomRatios.add(model.getZoomFactor()); + } + } else if (facing == CameraMetadata.LENS_FACING_FRONT) { + if (cameraType == CameraType.MAIN || cameraType == CameraType.ULTRAWIDE) { + frontZoomRatios.add(model.getZoomFactor()); + } + } + } + } + } else { + for (String zoom : auxZoomRatios) { + String[] separated = zoom.split(":"); + float id = Integer.parseInt(separated[0]); + float zoomRatio = Float.parseFloat(separated[1]); + if (id == 1) { + frontZoomRatios.add(zoomRatio); + } else { + backZoomRatios.add(zoomRatio); + } + } + } + + if( MyDebug.LOG ) { + Log.d(TAG, "frontZoomRatios" + frontZoomRatios); + Log.d(TAG, "backZoomRatios" + backZoomRatios); + } + } + + private void changeZoomFactor() { + float zoom = getNextMultiZoomRatio(backZoomRatios); + if (preview.getCameraControllerManager().getFacing(getActualCameraId()) + == CameraController.Facing.FACING_FRONT) { + zoom = getNextMultiZoomRatio(frontZoomRatios); + } + + preview.zoomTo(preview.findNxZoom(zoom), true); + updateMultiPixelIcon(backZoomRatios.indexOf(zoom)); + + if( MyDebug.LOG ) + Log.d(TAG, "changeZoomFactor" + zoom); + } + + public float getNextMultiZoomRatio(List zoomRations) { + float currentZoom = preview.getZoomRatio(); + float zoomRatio; + int index = zoomRations.indexOf(currentZoom); + if ( index == -1 ) { + zoomRatio = zoomRations.get(0); + } else { + index = (index+1) % zoomRations.size(); + zoomRatio = zoomRations.get(index); + } + if( MyDebug.LOG ) + Log.d(TAG, "next zoom: " + zoomRatio); + return zoomRatio; + } + + private void updateMultiPixelIcon(int index) { + Button multiCameraButton = findViewById(R.id.switch_multi_camera); + if (multiCameraButton.getVisibility() != View.GONE) { + String text = getString(R.string.switch_multi_camera_lens) + " " + (index + 1); + multiCameraButton.setText(text); + } + } + /** * Selects the next camera on the phone - in practice, switches between * front and back cameras @@ -2480,7 +2613,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen // disappear when the user touches the screen anyway.) preview.clearActiveFakeToast(); } - userSwitchToCamera(cameraId); + userSwitchToCamera(cameraId, false); push_switched_camera = true; } @@ -2502,7 +2635,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen if( this.preview.canSwitchCamera() ) { int cameraId = getNextMultiCameraId(); pushCameraIdToast(cameraId); - userSwitchToCamera(cameraId); + userSwitchToCamera(cameraId, true); } } @@ -2551,7 +2684,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen MainActivity.this.closePopup(); if( MainActivity.this.preview.canSwitchCamera() ) { pushCameraIdToast(which); - userSwitchToCamera(which); + userSwitchToCamera(which, true); } } setWindowFlagsForCamera(); @@ -3452,9 +3585,9 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen View button = findViewById(R.id.switch_multi_camera); changed = changed || (button.getVisibility() != View.GONE); button.setVisibility(View.GONE); - } else { - updateMultiCameraIcon(); } + updateMultiCameraIcon(); + if( MyDebug.LOG ) Log.d(TAG, "checkDisableGUIIcons: " + changed); return changed; @@ -5631,6 +5764,8 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen // if hasSmoothZoom()==true, then the preview already handled zooming to the current value if( !preview.hasSmoothZoom() ) preview.zoomTo(preview.getMaxZoom() - progress, false); + + updateMultiCameraIcon(); } @Override diff --git a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java index 31445cfc5..96f9ba5dc 100644 --- a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java +++ b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java @@ -2276,9 +2276,13 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } } - private int find1xZoom() { + public int find1xZoom() { + return findNxZoom(1.0f); + } + + public int findNxZoom(float zoom) { for(int i=0;i + + false + false + + + + + + -- GitLab From e893439e769ef7686cd4b0699ef6dbe79808b287 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Tue, 7 Feb 2023 08:25:19 +0000 Subject: [PATCH 26/58] 203-Update_widget_names --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e051bcd4f..2d826a946 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -240,7 +240,7 @@ Not available Copy to clipboard - Take Photo + Take photo Gallery Exposure Lock exposure -- GitLab From b4801535240100443db21efbff69a3289052500c Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Tue, 5 Apr 2022 11:37:42 +0000 Subject: [PATCH 27/58] 166-Update_into_text_string --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2d826a946..d6cd6ae66 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -910,7 +910,7 @@ This feature provides no guarantees on availability or accuracy. Results are a best guess, and not guaranteed to be meaningful or correct. \n%s - Touch to focus, and press the circular blue shutter button to take photos. + Touch to focus, and press the circular white shutter button to take photos. \n\nTo disable maximum screen brightness, see Settings/On screen GUI/\"Force maximum brightness\". To save to SD cards on Android 5+, see Settings/More camera controls/\"Storage Access Framework\". For more help, click \"Online help\" from Settings. -- GitLab From 8d5a788db50b3fd0f8c098683a51d36805f58519 Mon Sep 17 00:00:00 2001 From: althafvly Date: Tue, 21 Mar 2023 12:20:37 +0530 Subject: [PATCH 28/58] camera: Avoid aux camera changes for non-aux device --- .../sourceforge/opencamera/MainActivity.java | 91 ++++++++++++------- app/src/main/res/values/config.xml | 2 +- 2 files changed, 58 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 35f85b9a2..28b3ffb00 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -427,12 +427,14 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen getWindow().setAttributes(layout); } - cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); - camerafinder = new CameraFinder(cameraManager); - cameraModel = camerafinder.getCameraModels(); - cameraIdentifier = new CameraIdentifier(cameraModel); - camerafinder.init(); - cameraIdentifier.init(); + if (getResources().getBoolean(R.bool.zoom_level_switch_supported)) { + cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); + camerafinder = new CameraFinder(cameraManager); + cameraModel = camerafinder.getCameraModels(); + cameraIdentifier = new CameraIdentifier(cameraModel); + camerafinder.init(); + cameraIdentifier.init(); + } // Setup multi-camera buttons (must be done after creating preview so we know which Camera API is being used, // and before initialising on-screen visibility). @@ -446,40 +448,61 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen int n_cameras = preview.getCameraControllerManager().getNumberOfCameras(); if (getResources().getBoolean(R.bool.zoom_level_switch_supported)) { n_cameras = camerafinder.getAllCameraIdList().size(); - } - if( n_cameras > 2 ) { - this.back_camera_ids = new ArrayList<>(); - this.front_camera_ids = new ArrayList<>(); - this.other_camera_ids = new ArrayList<>(); - this.logical_camera_ids = new ArrayList<>(); - - if (!cameraModel.isEmpty()) { - for (CameraModel model : cameraModel) { - if (model.getCameraType() == CameraType.LOGICAL) { - logical_camera_ids.add(model.getId()); + if( n_cameras > 2 ) { + this.back_camera_ids = new ArrayList<>(); + this.front_camera_ids = new ArrayList<>(); + this.other_camera_ids = new ArrayList<>(); + this.logical_camera_ids = new ArrayList<>(); + + if (!cameraModel.isEmpty()) { + for (CameraModel model : cameraModel) { + if (model.getCameraType() == CameraType.LOGICAL) { + logical_camera_ids.add(model.getId()); + } } } - } - for(String cameraId: camerafinder.getAllCameraIdList()) { - int id = Integer.parseInt(cameraId); - cameraCharacteristics = camerafinder.getCameraCharacteristics(id); - Integer facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING); - if (!logical_camera_ids.contains(id) - || getResources().getBoolean(R.bool.allow_logical_camera_ids)) { - switch(facing) { - case CameraMetadata.LENS_FACING_BACK: - back_camera_ids.add(id); - break; - case CameraMetadata.LENS_FACING_FRONT: - front_camera_ids.add(id); - break; - case CameraMetadata.LENS_FACING_EXTERNAL: - other_camera_ids.add(id); - break; + for(String cameraId: camerafinder.getAllCameraIdList()) { + int id = Integer.parseInt(cameraId); + cameraCharacteristics = camerafinder.getCameraCharacteristics(id); + Integer facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING); + if (!logical_camera_ids.contains(id) + || getResources().getBoolean(R.bool.allow_logical_camera_ids)) { + switch(facing) { + case CameraMetadata.LENS_FACING_BACK: + back_camera_ids.add(id); + break; + case CameraMetadata.LENS_FACING_FRONT: + front_camera_ids.add(id); + break; + case CameraMetadata.LENS_FACING_EXTERNAL: + other_camera_ids.add(id); + break; + } } } } + } else if (n_cameras > 2) { + this.back_camera_ids = new ArrayList<>(); + this.front_camera_ids = new ArrayList<>(); + this.other_camera_ids = new ArrayList<>(); + for (int i = 0; i < n_cameras; i++) { + switch (preview.getCameraControllerManager().getFacing(i)) { + case FACING_BACK: + back_camera_ids.add(i); + break; + case FACING_FRONT: + front_camera_ids.add(i); + break; + default: + // we assume any unknown cameras are also external + other_camera_ids.add(i); + break; + } + } + } + + if (n_cameras > 2) { if( MyDebug.LOG ) { Log.d(TAG, "back_camera_ids: " + back_camera_ids); Log.d(TAG, "front_camera_ids: " + front_camera_ids); diff --git a/app/src/main/res/values/config.xml b/app/src/main/res/values/config.xml index 1ea0bb403..8a88dcd24 100644 --- a/app/src/main/res/values/config.xml +++ b/app/src/main/res/values/config.xml @@ -1,7 +1,7 @@ false - false + true -- GitLab From d98da3ffc76207a23ecad245695159687002d782 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 15 Sep 2023 14:43:54 +0530 Subject: [PATCH 30/58] camera: add support to ignore camera IDs --- .../net/sourceforge/opencamera/MainActivity.java | 12 ++++++++++++ app/src/main/res/values/config.xml | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 0c8fe512b..29dfaa086 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -446,6 +446,11 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen cameraIdentifier.init(); } + String[] ignoredCameraIDs = getResources().getStringArray(R.array.config_ignoredCameraIds); + if( MyDebug.LOG ) { + Log.d(TAG, "ignoredCameraIDs: " + Arrays.toString(ignoredCameraIDs)); + } + // Setup multi-camera buttons (must be done after creating preview so we know which Camera API is being used, // and before initialising on-screen visibility). // We only allow the separate icon for switching cameras if: @@ -473,6 +478,9 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } for(String cameraId: camerafinder.getAllCameraIdList()) { + if (Arrays.stream(ignoredCameraIDs).anyMatch(id -> id.equals(cameraId))) { + continue; + } int id = Integer.parseInt(cameraId); cameraCharacteristics = camerafinder.getCameraCharacteristics(id); Integer facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING); @@ -497,6 +505,10 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen this.front_camera_ids = new ArrayList<>(); this.other_camera_ids = new ArrayList<>(); for (int i = 0; i < n_cameras; i++) { + String currentCameraID = String.valueOf(i); + if (Arrays.stream(ignoredCameraIDs).anyMatch(id -> id.equals(currentCameraID))) { + continue; + } switch (preview.getCameraControllerManager().getFacing(i)) { case FACING_BACK: back_camera_ids.add(i); diff --git a/app/src/main/res/values/config.xml b/app/src/main/res/values/config.xml index 8a88dcd24..05cdb8261 100644 --- a/app/src/main/res/values/config.xml +++ b/app/src/main/res/values/config.xml @@ -17,4 +17,9 @@ + + + + + -- GitLab From e2c96a1c40ff1fb4d655e115686399fb91aa3388 Mon Sep 17 00:00:00 2001 From: althafvly Date: Tue, 19 Dec 2023 14:41:34 +0530 Subject: [PATCH 31/58] camera: Log if its debug build --- app/src/main/java/net/sourceforge/opencamera/MyDebug.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MyDebug.java b/app/src/main/java/net/sourceforge/opencamera/MyDebug.java index 00e82f8f5..260c4550b 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MyDebug.java +++ b/app/src/main/java/net/sourceforge/opencamera/MyDebug.java @@ -1,8 +1,10 @@ package net.sourceforge.opencamera; +import foundation.e.camera.BuildConfig; + /** Global constant to control logging, should always be set to false in * released versions. */ public class MyDebug { - public static final boolean LOG = false; + public static final boolean LOG = BuildConfig.DEBUG; } -- GitLab From 6e5fb89333d2c25c8bfa596b6c5c3e4c57560f9a Mon Sep 17 00:00:00 2001 From: althafvly Date: Tue, 19 Dec 2023 14:40:47 +0530 Subject: [PATCH 32/58] camera: allow to set default resolution --- .../sourceforge/opencamera/MainActivity.java | 17 +++++++++++++++++ app/src/main/res/values/config.xml | 5 +++++ 2 files changed, 22 insertions(+) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 29dfaa086..482e18a3d 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -1064,6 +1064,23 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } } } + + String[] defaultResolutions = getResources().getStringArray( + R.array.config_e_os_camera_default_resolution_lens); + SharedPreferences.Editor editor = sharedPreferences.edit(); + + for (String entry : defaultResolutions) { + if (!entry.matches("\\d+:\\d+x\\d+")) continue; + + String[] mainParts = entry.split(":"); + String[] resParts = mainParts[1].split("x"); + int cameraId = Integer.parseInt(mainParts[0]); + String resolution = resParts[0] + " " + resParts[1]; + + editor.putString(PreferenceKeys.getResolutionPreferenceKey(cameraId), resolution); + } + + editor.apply(); } /** Switches modes if required, if called from a relevant intent/tile. diff --git a/app/src/main/res/values/config.xml b/app/src/main/res/values/config.xml index 05cdb8261..13ff57447 100644 --- a/app/src/main/res/values/config.xml +++ b/app/src/main/res/values/config.xml @@ -22,4 +22,9 @@ + + + + + -- GitLab From 79ab0aabfac26dc255b8fad319bb2eb817d0350a Mon Sep 17 00:00:00 2001 From: althafvly Date: Mon, 25 Dec 2023 11:26:27 +0530 Subject: [PATCH 33/58] camera: adjust focus timeout for faster clicks --- .../opencamera/cameracontroller/CameraController2.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java index 06e59c556..714160985 100644 --- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java +++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java @@ -183,7 +183,7 @@ public class CameraController2 extends CameraController { private boolean previewIsVideoMode; private AutoFocusCallback autofocus_cb; private long autofocus_time_ms = -1; // time we set autofocus_cb to non-null - private static final long autofocus_timeout_c = 1000; // timeout for calling autofocus_cb (applies for both auto and continuous focus) + private static final long autofocus_timeout_c = 250; // timeout for calling autofocus_cb (applies for both auto and continuous focus) private boolean capture_follows_autofocus_hint; private boolean ready_for_capture; private FaceDetectionListener face_detection_listener; @@ -268,8 +268,8 @@ public class CameraController2 extends CameraController { private static final int STATE_WAITING_FAKE_PRECAPTURE_DONE = 5; private int state = STATE_NORMAL; private long precapture_state_change_time_ms = -1; // time we changed state for precapture modes - private static final long precapture_start_timeout_c = 2000; - private static final long precapture_done_timeout_c = 3000; + private static final long precapture_start_timeout_c = 500; + private static final long precapture_done_timeout_c = 1000; private boolean use_fake_precapture; // see CameraController.setUseCamera2FakeFlash() for details - this is the user/application setting, see use_fake_precapture_mode for whether fake precapture is enabled (as we may do this for other purposes, e.g., front screen flash) private boolean use_fake_precapture_mode; // true if either use_fake_precapture is true, or we're temporarily using fake precapture mode (e.g., for front screen flash or exposure bracketing) -- GitLab From 07707a56b96e925a306554797e68617934b58606 Mon Sep 17 00:00:00 2001 From: althafvly Date: Mon, 25 Dec 2023 11:36:22 +0530 Subject: [PATCH 34/58] camera: enable hw accelerated for smooth animations - Speed up the animation aswell --- app/src/main/AndroidManifest.xml | 1 + .../main/java/net/sourceforge/opencamera/ui/DrawPreview.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 496e1b0de..ad9a752c5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,6 +39,7 @@ android:name=".OpenCameraApplication" android:theme="@style/AppTheme" android:largeHeap="true" + android:hardwareAccelerated="true" android:requestLegacyExternalStorage="true" > diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java index af769206e..69392e972 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java @@ -2613,7 +2613,7 @@ public class DrawPreview { if( camera_controller != null && this.thumbnail_anim && last_thumbnail != null ) { int ui_rotation = preview.getUIRotation(); long time = time_ms - this.thumbnail_anim_start_ms; - final long duration = 500; + final long duration = 400; if( time > duration ) { if( MyDebug.LOG ) Log.d(TAG, "thumbnail_anim finished"); -- GitLab From ae6044fe50c51b51c5705472b0485e3e47424409 Mon Sep 17 00:00:00 2001 From: althafvly Date: Mon, 25 Dec 2023 12:35:38 +0530 Subject: [PATCH 35/58] camera: alert user if camera is unable to focus --- .../sourceforge/opencamera/MainActivity.java | 1 + .../net/sourceforge/opencamera/MyDebug.java | 1 - .../cameracontroller/CameraController2.java | 35 +++++++++++++++---- app/src/main/res/values/strings.xml | 1 + 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 482e18a3d..173560b09 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -1067,6 +1067,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen String[] defaultResolutions = getResources().getStringArray( R.array.config_e_os_camera_default_resolution_lens); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = sharedPreferences.edit(); for (String entry : defaultResolutions) { diff --git a/app/src/main/java/net/sourceforge/opencamera/MyDebug.java b/app/src/main/java/net/sourceforge/opencamera/MyDebug.java index 260c4550b..f3ff6fff9 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MyDebug.java +++ b/app/src/main/java/net/sourceforge/opencamera/MyDebug.java @@ -1,6 +1,5 @@ package net.sourceforge.opencamera; -import foundation.e.camera.BuildConfig; /** Global constant to control logging, should always be set to false in * released versions. diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java index 714160985..6b47e10f0 100644 --- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java +++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java @@ -3,6 +3,7 @@ package net.sourceforge.opencamera.cameracontroller; import net.sourceforge.opencamera.ContinuousBurstImageRunningAction; import net.sourceforge.opencamera.HDRProcessor; import net.sourceforge.opencamera.MyDebug; +import net.sourceforge.opencamera.R; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -64,6 +65,7 @@ import android.view.Display; import android.view.Surface; import android.view.SurfaceHolder; import android.view.TextureView; +import android.widget.Toast; import org.greenrobot.eventbus.EventBus; @@ -103,6 +105,8 @@ public class CameraController2 extends CameraController { private long min_exposure_time; private long max_exposure_time; + private int toastCounter = 0; + private final static int tonemap_log_max_curve_points_c = 64; private final static float [] jtvideo_values_base = new float[] { 0.00f, 0.00f, @@ -183,7 +187,7 @@ public class CameraController2 extends CameraController { private boolean previewIsVideoMode; private AutoFocusCallback autofocus_cb; private long autofocus_time_ms = -1; // time we set autofocus_cb to non-null - private static final long autofocus_timeout_c = 250; // timeout for calling autofocus_cb (applies for both auto and continuous focus) + private static final long autofocus_timeout_c = 500; // timeout for calling autofocus_cb (applies for both auto and continuous focus) private boolean capture_follows_autofocus_hint; private boolean ready_for_capture; private FaceDetectionListener face_detection_listener; @@ -8408,14 +8412,17 @@ public class CameraController2 extends CameraController { // need to check af_state != null, I received Google Play crash in 1.33 where it was null boolean focus_success = af_state != null && ( af_state == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED || af_state == CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED ); if( MyDebug.LOG ) { - if( focus_success ) + if( focus_success ) { Log.d(TAG, "autofocus success"); - else + } else { Log.d(TAG, "autofocus failed"); - if( af_state == null ) + onFocusFailed(); + } + if( af_state == null ) { Log.e(TAG, "continuous focus mode but af_state is null"); - else + } else { Log.d(TAG, "af_state: " + af_state); + } } if( af_state == null ) { test_af_state_null_focus++; @@ -8468,10 +8475,12 @@ public class CameraController2 extends CameraController { ) { boolean focus_success = af_state == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED || af_state == CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED; if( MyDebug.LOG ) { - if( focus_success ) + if( focus_success ) { Log.d(TAG, "onCaptureCompleted: autofocus success"); - else + } else { Log.d(TAG, "onCaptureCompleted: autofocus failed"); + onFocusFailed(); + } Log.d(TAG, "af_state: " + af_state); } state = STATE_NORMAL; @@ -8661,6 +8670,18 @@ public class CameraController2 extends CameraController { } } + private void onFocusFailed() { + // Show only if focus failed twice. + if (toastCounter == 1) { + Toast.makeText(context, + R.string.preference_failed_focus_mode_message, + Toast.LENGTH_SHORT).show(); + toastCounter = 0; + } else { + toastCounter++; + } + } + private void handleContinuousFocusMove(CaptureResult result) { Integer af_state = result.get(CaptureResult.CONTROL_AF_STATE); if( af_state != null && af_state == CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN && af_state != last_af_state ) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d6cd6ae66..977672c4d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -783,6 +783,7 @@ Unlock exposure Low light mode: please hold the camera steady + Please hold the camera steady for better photos. Pano Panorama -- GitLab From 5a04c3e5e4a053e6675dcdee98c2778eba5549b0 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 12 Jan 2024 12:04:21 +0530 Subject: [PATCH 36/58] camera: change resolution for existing users aswell --- .../sourceforge/opencamera/MainActivity.java | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 173560b09..75f9fb13b 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -1065,23 +1065,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } } - String[] defaultResolutions = getResources().getStringArray( - R.array.config_e_os_camera_default_resolution_lens); - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor editor = sharedPreferences.edit(); - - for (String entry : defaultResolutions) { - if (!entry.matches("\\d+:\\d+x\\d+")) continue; - - String[] mainParts = entry.split(":"); - String[] resParts = mainParts[1].split("x"); - int cameraId = Integer.parseInt(mainParts[0]); - String resolution = resParts[0] + " " + resParts[1]; - - editor.putString(PreferenceKeys.getResolutionPreferenceKey(cameraId), resolution); - } - - editor.apply(); + updateCameraResolution(); } /** Switches modes if required, if called from a relevant intent/tile. @@ -3216,6 +3200,10 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen if( preview.getCurrentPictureSize() != null ) { bundle.putInt("resolution_width", preview.getCurrentPictureSize().width); bundle.putInt("resolution_height", preview.getCurrentPictureSize().height); + SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); + if (pref.getBoolean("isFirstTimeResolution_" + preview.getCameraId(), true)) { + updateCameraResolution(); + } } //List video_quality = this.preview.getVideoQualityHander().getSupportedVideoQuality(); @@ -3366,6 +3354,38 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen return true; } + private void updateCameraResolution() { + SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); + SharedPreferences.Editor editor = pref.edit(); + String[] defaultResolutions = getResources().getStringArray( + R.array.config_e_os_camera_default_resolution_lens); + for (String entry : defaultResolutions) { + if (!entry.matches("\\d+:\\d+x\\d+")) continue; + + String[] mainParts = entry.split(":"); + String[] resParts = mainParts[1].split("x"); + int cameraId = Integer.parseInt(mainParts[0]); + String resolution = resParts[0] + " " + resParts[1]; + + boolean existing = true; + if (preview != null && preview.getSupportedPictureSizes(false) != null) { + List supportedResolutions = + preview.getSupportedPictureSizes(false); + String highestResolution = supportedResolutions.get(0).width + " " + + supportedResolutions.get(0).height; + String currentResolution = pref.getString( + PreferenceKeys.getResolutionPreferenceKey(cameraId), ""); + existing = highestResolution.equals(currentResolution) && cameraId == preview.getCameraId(); + } + if (existing) { + editor.putString(PreferenceKeys.getResolutionPreferenceKey(cameraId), resolution); + editor.putBoolean("isFirstTimeResolution_" + cameraId, false); + } + } + + editor.apply(); + } + public void updateForSettings(boolean update_camera) { updateForSettings(update_camera, null); } -- GitLab From 3cecb2e2691bfcd12632ffbfc5ba04509fd998b5 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 11 Jan 2024 14:08:24 +0530 Subject: [PATCH 37/58] camera: Turn off edge mode algorithm for one - Over sharpen images --- .../net/sourceforge/opencamera/DeviceSettings.java | 7 +++++++ .../net/sourceforge/opencamera/MainActivity.java | 12 ++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java b/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java index bf98703a7..ed6011b1c 100644 --- a/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java +++ b/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java @@ -31,4 +31,11 @@ public class DeviceSettings { final boolean is_GS290 = Build.DEVICE != null && Build.DEVICE.equals("GS290"); return is_fairphone || is_xiaomi || is_GS290; } + + public static boolean isMurenaOne() { + final boolean isMurena = Build.MANUFACTURER.equals("Secure_Phone") + || Build.MANUFACTURER.equals("Murena"); + final boolean isOne = Build.DEVICE.equals("one") || Build.DEVICE.equals("X2"); + return isMurena && isOne; + } } diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 75f9fb13b..342dfd995 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -373,11 +373,20 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen if( MyDebug.LOG ) Log.d(TAG, "onCreate: time after updating folder history: " + (System.currentTimeMillis() - debug_time)); + SharedPreferences.Editor editor = sharedPreferences.edit(); + if (DeviceSettings.isMurenaOne()) { + boolean isFirstTime = sharedPreferences.getBoolean("isFirstTimeMurenaOne", true); + if (isFirstTime && applicationInterface.getEdgeModePref().equals("default")) { + editor.putString(PreferenceKeys.EdgeModePreferenceKey, "off"); + editor.putBoolean("isFirstTimeMurenaOne", false); + editor.apply(); + } + } + boolean isFirstTimeSaveLocation = sharedPreferences.getBoolean("isFirstTimeSaveLocation", true); String save_location = sharedPreferences.getString(PreferenceKeys.SaveLocationPreferenceKey, "Camera"); if (isFirstTimeSaveLocation && save_location.equals("OpenCamera")) { - SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(PreferenceKeys.SaveLocationPreferenceKey, "Camera"); editor.putBoolean("isFirstTimeSaveLocation", false); editor.apply(); @@ -795,7 +804,6 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen // We set the latest_version whether or not the dialog is shown - if we showed the first time dialog, we don't // want to then show the What's New dialog next time we run! Similarly if the user had disabled showing the dialog, // but then enables it, we still shouldn't show the dialog until the new time Open Camera upgrades. - SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt(PreferenceKeys.LatestVersionPreferenceKey, version_code); editor.apply(); } -- GitLab From 0b344ab795c56d64984fefe84aa81bad9f94ae09 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 15 Feb 2024 22:14:43 +0530 Subject: [PATCH 38/58] camera: Turn off max brightness by default --- .../java/net/sourceforge/opencamera/MainActivity.java | 9 ++++++++- app/src/main/res/xml/preferences_sub_gui.xml | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 342dfd995..cb51a7acc 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -392,6 +392,13 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen editor.apply(); } + boolean isFirstTimeMaxBrightness = sharedPreferences.getBoolean("isFirstTimeMaxBrightness", true); + if (isFirstTimeMaxBrightness) { + editor.putBoolean(PreferenceKeys.MaxBrightnessPreferenceKey, false); + editor.putBoolean("isFirstTimeMaxBrightness", false); + editor.apply(); + } + // set up sensors mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); @@ -4192,7 +4199,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen // done here rather than onCreate, so that changing it in preferences takes effect without restarting app SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); final WindowManager.LayoutParams layout = getWindow().getAttributes(); - if( force_max || sharedPreferences.getBoolean(PreferenceKeys.MaxBrightnessPreferenceKey, true) ) { + if( force_max || sharedPreferences.getBoolean(PreferenceKeys.MaxBrightnessPreferenceKey, false) ) { layout.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL; } else { diff --git a/app/src/main/res/xml/preferences_sub_gui.xml b/app/src/main/res/xml/preferences_sub_gui.xml index 1412f619a..0d7ee2062 100644 --- a/app/src/main/res/xml/preferences_sub_gui.xml +++ b/app/src/main/res/xml/preferences_sub_gui.xml @@ -162,7 +162,7 @@ android:key="preference_max_brightness" android:title="@string/preference_max_brightness" android:summary="@string/preference_max_brightness_summary" - android:defaultValue="true" + android:defaultValue="false" /> -- GitLab From 51b229ed1a2937e8fe046c7e074984260e00895a Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 15 Feb 2024 22:41:10 +0530 Subject: [PATCH 39/58] camera: Use a switch case for future changes --- .../sourceforge/opencamera/MainActivity.java | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index cb51a7acc..410dbedb7 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -374,30 +374,28 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "onCreate: time after updating folder history: " + (System.currentTimeMillis() - debug_time)); SharedPreferences.Editor editor = sharedPreferences.edit(); - if (DeviceSettings.isMurenaOne()) { - boolean isFirstTime = sharedPreferences.getBoolean("isFirstTimeMurenaOne", true); - if (isFirstTime && applicationInterface.getEdgeModePref().equals("default")) { - editor.putString(PreferenceKeys.EdgeModePreferenceKey, "off"); - editor.putBoolean("isFirstTimeMurenaOne", false); - editor.apply(); - } - } - - boolean isFirstTimeSaveLocation = sharedPreferences.getBoolean("isFirstTimeSaveLocation", true); - String save_location = sharedPreferences.getString(PreferenceKeys.SaveLocationPreferenceKey, "Camera"); - - if (isFirstTimeSaveLocation && save_location.equals("OpenCamera")) { - editor.putString(PreferenceKeys.SaveLocationPreferenceKey, "Camera"); - editor.putBoolean("isFirstTimeSaveLocation", false); - editor.apply(); + int isFirstTime = sharedPreferences.getInt("isFirstTimeChange", 0); + switch (isFirstTime) { + case 0: + String edge_pref = applicationInterface.getEdgeModePref(); + if (DeviceSettings.isMurenaOne() && edge_pref.equals("default")) { + editor.putString(PreferenceKeys.EdgeModePreferenceKey, "off"); + } + String save_location = sharedPreferences.getString( + PreferenceKeys.SaveLocationPreferenceKey, "Camera"); + if (save_location.equals("OpenCamera")) { + editor.putString(PreferenceKeys.SaveLocationPreferenceKey, "Camera"); + } + isFirstTime++; + case 1: + editor.putBoolean(PreferenceKeys.MaxBrightnessPreferenceKey, false); + isFirstTime++; + break; + default: + break; } - boolean isFirstTimeMaxBrightness = sharedPreferences.getBoolean("isFirstTimeMaxBrightness", true); - if (isFirstTimeMaxBrightness) { - editor.putBoolean(PreferenceKeys.MaxBrightnessPreferenceKey, false); - editor.putBoolean("isFirstTimeMaxBrightness", false); - editor.apply(); - } + editor.putInt("isFirstTimeChange", isFirstTime).apply(); // set up sensors mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); -- GitLab From e1732e2d88e35fc0c840d10b04aca2df4eb8c1eb Mon Sep 17 00:00:00 2001 From: althafvly Date: Tue, 26 Mar 2024 17:58:20 +0530 Subject: [PATCH 40/58] camera: Use openLegacy() for older HAL1 devices - We have seperate checks for APIs --- .../cameracontroller/CameraController1.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController1.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController1.java index 3e573d219..3596a0e55 100644 --- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController1.java +++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController1.java @@ -3,6 +3,7 @@ package net.sourceforge.opencamera.cameracontroller; import net.sourceforge.opencamera.MyDebug; import java.io.IOException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -58,15 +59,28 @@ public class CameraController1 extends CameraController { if( MyDebug.LOG ) Log.d(TAG, "create new CameraController1: " + cameraId); this.camera_error_cb = camera_error_cb; + try { - camera = Camera.open(cameraId); + Method openMethod = Class.forName("android.hardware.Camera") + .getMethod("openLegacy", int.class, int.class); + camera = (Camera) openMethod.invoke(null, + cameraId, 0x100); + } catch (Exception e) { + /* Retry with open if openLegacy doesn't exist/fails */ + camera = null; } - catch(RuntimeException e) { - if( MyDebug.LOG ) - Log.e(TAG, "failed to open camera"); - e.printStackTrace(); - throw new CameraControllerException(); + + if (camera == null) { + try { + camera = Camera.open(cameraId); + } catch (RuntimeException e) { + if (MyDebug.LOG) + Log.e(TAG, "failed to open camera"); + e.printStackTrace(); + throw new CameraControllerException(); + } } + if( camera == null ) { // Although the documentation says Camera.open() should throw a RuntimeException, it seems that it some cases it can return null // I've seen this in some crashes reported in Google Play; also see: -- GitLab From 69fb4e849017e1485b9f76ce60458c699cd36c92 Mon Sep 17 00:00:00 2001 From: Nishith Khanna Date: Mon, 18 Sep 2023 14:56:54 +0530 Subject: [PATCH 41/58] Update app icon according to new design --- .../drawable-hdpi/ic_launcher_foreground.png | Bin 0 -> 10553 bytes .../drawable-mdpi/ic_launcher_foreground.png | Bin 0 -> 5747 bytes .../drawable-xhdpi/ic_launcher_foreground.png | Bin 0 -> 16304 bytes .../ic_launcher_foreground.png | Bin 0 -> 29993 bytes .../ic_launcher_foreground.png | Bin 0 -> 46896 bytes .../res/drawable/ic_launcher_background.png | Bin 0 -> 14969 bytes .../res/mipmap-anydpi-v26/ic_launcher.xml | 20 +++++++++++++++--- .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 ------ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 5610 -> 0 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 1686 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 5288 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 3368 -> 0 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 1121 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 3073 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 8114 -> 0 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 2168 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 7554 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 13065 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 3637 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 12862 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 19126 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 5181 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 19078 -> 0 bytes 23 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/drawable-mdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/drawable/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..04b8847f09d818ed8c1e4165c9b4c7413c9146cb GIT binary patch literal 10553 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 F{{XDW%zpp? literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..278280e5cd462e7bc3d94a2926becb6f6baf2e2d GIT binary patch literal 16304 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f70dc48b5b0280da0a16eba5869a50f4dd2796 GIT binary patch literal 29993 zcmeEsRaae2uq_V3-E||ug1gJc9X9SxaCdhI?(XgyEV#P|cZcBam+#(jf5Le?4{NNk z`ejwm>Z)0@x*`yJUshfzNwa{_2{ZGAZ>}R$=_~2_ zBeE=s|74l!c!LcxmnedF$|DFcU@+wxST$mtBt$1 zXx%)fR#e(-dSzXL!9hU;2$7=x@9TdE0)ntFeCw*O+1=;!QMXgTw#|?% z5!H#7^13TXJ-2>sV+;#lMG3#ROjLsDrG^hhBaNB%0z|2)=M+S`6Ody*9Rk?wt>$1_l^p z26%^}l`)2tA=dgn!v~Afp)Rax4eHL&s>g-p&Eq29GP$7JXRwiVl}a1Q1n>HdUMygM-0#X7YFP+^`T0zKqq$zByvpw!*Xq6A6dt zedv$AGq+a{l>d>ni(ICqU49q|ADUtxW1=Bi5Y>*~hnc~PM5c_152b*xEBXZhUXoO` za9{s{P~#SApDeUPLH?#P1vEQ)KJtt=vSWBAx8GFBK3on=Fe-GQ4GfYevJ~2TFg#B3 z91pPD5Q-<_Sy$4yx>50jkUbxn)P~F|!@b7=mG4LRC_SpR;2ZS2W==$sJYW*ITz*!? zpLcgtH?+$5LUh+2ti8?>^ol%5J!ORl_FS7_IF)i}USP0N1 zy3SXeISu1mdQcU`dT)zeZTZ3c{|%F^qIP24Z$V1Bs$_=<<8G)ATR0ZrJFFb(2;V!{?=R^Om>jK*^SBU9aYC4kzWcQz0o`Rj%ykJO!sZp(+@}9jVGfmD3 zXeh%9W?J8H_F0p1X#R`*Wz299OdWJtg|qVJO)E}=i*^S}syu^nvS8|EOw=7pLs!Y4 z{KZY}9IyZ({$eN6M7t=AsBc<9qqHT+xC?asZxkLi@tBZY#Qqs7sDw+jpSJL)y&56I z-)ogo0)?&+Md6gLny!~U__1B%-&lMkVeJd2?&Y-1jqyj3jSKRevMl8HOCvu1>71R$ zfUbv80rG4|et!r9;p6Zfn?Qz}S7j-K8nNW$bRcYMYzhZ%pGAnI1ERe68d%RIp z(l+dd4>E^s66xFASsrTB9=wN!5T1+PLjmLnc$fIW<{5CHujBBSa zD6U^WSm_R2DK4-Sf(+OjDohbh@5Y+2(czdKV@eaRZyCFH#sY`L3?m#o&IR3j&4h?TF7r_nS7=c9Wn&crOW2u| zuT{oT3+WEg*j#V~<2X81?*y%=a&XEmy(SqJw-YC|pILye*+!|390bBSr~t-FlfXsu zkB#hkR*0D`T;dX)Q`HQr(Fic&Hax`vz8{txtFu-&NFh@5hX#sBcwm?NKW2Vxr2R|a zoEJ_-Pd(c?0K7!jKNK?}nf@D0N*pGdUQaMCwbdbhWeZb4HVf!4CI{n$EH9pgy2ZHr z>I-4^T0N<_RpgN?_jGnJNc=}Ab3Bue5LeFe z8?;p@x+df#LxJI#6yK7RJi%WtF%|Bne_%k!Bp5_A7}0h}Hn`~^({}VUYM09h8egF0 zUrPm&0b>!<37s%Tc9voYm41jr(`0a?AHo_D!860texb!Q!iK!M^4cVCN9n{RM~H^c z0;-^BV?vBH&Bcvo0S*49LfuWD&C|((s+vVSP?)*JYG+r&LYHk?wH7|3J&l9pGJB1J z zL!-UBg(fR)1&z+AhhaV=MYRzwgYZ0cGbSpS;t^P!8FjWpZcsbf2=@r?_&jNEM(}{Xf!O$p%tWp5|LAGxG)S5e^x;yP??cXpbA8iH3R8u zUj?d|Z#B5z0rC1n38>N#^x;gL1Co}r-v=iq(s7+Iz)Qhofx)<$-&FUmwFtMm+)`gi z;c}8uMZB>CL52&H7r?})lweFU3`3kzfM~)vH>xlcj^-}8swB`{S^J+Ovw9Z7F^1uD zqw>GkAONg3mgRJ({(#cNc!hpEmFXsZAnQaz3L}4R0l9!N!{RSD6k2W`RV) zl(}SWv`b|bjaB$eT&_~U(7U;>ZJR{6SY$N0Xv@F&!UnsiBHUKY+#dS**Qr_!Q~#MMQ~MisG$Nl)8m8*c1Iw5?6AMr`GZ4^Z;HuUv zIc*(9FPIC7MEvI^Y!H*t5$<%6J_e1JGG5-2^IO$KoSY0_8Q6@wwApf5akW9}t|s*5 zUNGrmDb<&2+qpIxQx>3VxRMC~UBX)cPnmuf%BJ3OrkXC0XsjJ7IaSai zh_Y2F!<33P%88_;C8EKsgSMTMR}7B$Sv4XK25!!b=zBH6LQ+yt$KYpcQFt{bvo_mI5-Sx0JxyWzwlezUg_BKcynTdqivLaC+7P$7~mK991WiRtn>%gq{st_z^knYH7Q!CgK^8ctTTIElFw z3#)X+x+FUgCTu?_0(T8RlxW`I<~qOcBh?bUZ<0i|QfmUi3LY8?r%nTW%~1&+!bFav zAS8Raoikq+gV52_3s9>Z1WH1g6q49~ym4E!sBMpaCmw$MnQ5BV@AA$h(1n0M3BD|R z8vx$=!o5WL4SCg#y>b{oVQ*%J6p<}cu~JM;IOTMv2plirPJjNdhIY$QaoKcjsVwAH3x9Gf)z~eqPSN;U`{7O3D@2H zL;mXM=Pa`n)LCy1lQg{M@ZhxN#}U}Eq7ln_;aQ7O%|9YvPKMsSW?i{7*_i5RPeG)q z4y`aAlnph(CMSD2tyBC3UOHn@36qX^p0$`yDFKKY6cY`kqx&InXuKs3@%F$O`O~NM zW31EZk+?_PHv<^Q=s7yR-6MnC5Lpz>ILq;KL11a3jR5-~a8e^iINRp@u z$Q)0n9GUYjaf!I+RIV!y4VF~VsFbNYfDcC9#R?ssE^;f`xUi9Gf!>f`dqH59L=~%o zPk*c8i7KoEg-E9Cw~*h+q`yUp$X3%%unZR2``RKO9v-&Q5tVm&ecm+Mf2wyyQC+XF zPnDGx$kk5?->>}MdVPOTG4dW}aKC@-A|Aayuy#~oOv=wEqZl?U(_WM`!3~`n)l0P33GMccevBTJ{kz%0D~pza9CN=&^!_6^h*oa<4d)Lv$$y2uEk0 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_launcher_background.png b/app/src/main/res/drawable/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..1f231ab42df764ba6bdf054d9e9b3145d7fe6359 GIT binary patch literal 14969 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 + - - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 1a4bfc938..000000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 16f68f552435f05e61cd80e30787773c0b091df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5610 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 Ef>C0AzW@LL diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/app/src/main/res/mipmap-hdpi/ic_launcher_background.png deleted file mode 100644 index 5e6c717efdddda1d07be2a42bdf037ea289e5e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1686 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 578ed3f7e5dea205096c9e4f72fdd76f4a35d7f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3368 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 05995e2ddd928dbf0a99f606164ca2e9eced5bc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3073 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 M07*qoM6N<$g6VvHkpKVy diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png deleted file mode 100644 index 58b8a1982c7e6be83cf48cdfe8e904e2c4c4b0d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2168 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index eed849e4bd56019da473b865bcc43ca72eaf64e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13065 zcmV+kGxp4hP)@s73FQE9^;lAN`t<$K?kJLU2KwZ?8n*b9@c|58s3D?H3Xb)(B9S z7&Kz2QFz3x@A8Z){Leyw;DN}3uGome?hRoD-QR@gcNfEJRiHM|dC&!Ty%$8d@HxJA z9@GY^3WKk~uMLCm5f0xAzh`J+=Rz&~3|l~X4A${R9zzHX{N`|Hg@1z#VFg`#LkqgHLkhYd#LqxoXauH>&n#Ub=_?C z2QcDF?tNJHm|`HIja>Kb;;41qC(NKJ?CJw>E<^$_00}&2uqeq504b>tK?(t&z=Z%X zlLS*<*NNaf(_&1{&65BAlKzp$z`=G~0nTnLUlRK=|CzBOun_g4ZmRE1p^q6$qtme33q zpfEQAWC2r8a8Boi;9LPDP=41}A-UZ@u?lS?56ANyd2SH1?myQ;X!^_&oXA2`AHYNG z!E+IWFS`Iyh;pg=EJ4!en?4K9H(h6zY>(te_8)R^qBoom#84G2fz!twhsbp?xX*wc zC|5xUQl6<#j}TFrHU{Uk2P)m8k%yA&z;noRUIcJDC3w1eEWsI!`&`rjaRude_UOTp zI7prPoQ@X-2O4oB%OqKFo%N>cqStpHLU5>Lp~{s24Q2Qm2tayCeR^;t8AylaVePWd zjTYpQvBGn3ndKrl>$)*i_1Xf*UG6hX`Hww-sKAYS0ip{*xm^UM%jsIKbPq4P0YQ8k zS#Vwj!0eE_4umigZ3mw3L-=wAAQ7bO&I>^~Cc;75p)crAiB5Fcgf!W(eN=wOZvmPP znd|fo7d#hB__7O74pkpOB)CyWP*&@`O854ApYO!1?~YS)oxuVWafyd72LNJ{xsfib zBOY$)sPA=NB=oYv-Xr6p*L8is;lZwXudCo0YWHzR?@R9}Kpa_y|B^8;(hvz28k5@^3eXsNvV7UY<7R+Fh_sn4Evn@uQI}*m6R3~LY!3i% z>W34a%Ord$LZr@UZt!1n=+X*jLRUQ^yLu*oQ`#RqgUx$}!+kE6@MQ-e3Xv9iXX@1Y zGVfPD_q;T^_7c`kIL=|72NJp$MwooQy`BC|%UklR{N`r(K4LnXlBdNo2cq}x$ z0Co0hF{w^#B7w_}{O+RanF&dAbV_3&fYZtV>gsVA4v^77z^;KvF1cBZ2W}_d=UpG3@yeA6pm|mEXC{UfvTm9HGks90?$q zqga8`Zd0MTZFUtRs@+P#IfAS~(xV1Hc<2~F*?8@`piVWAfMrM5V%rVd_>hn^N9MI$ zV=wO+T6j8bf)lO)jtB@eyqR)ZtrVKwVpAa~c#kMKP&smd%t6vy%B}9h0m_DaD5ncT zSq<@fdDl%esgB(?X1GGv=%{t3{Ys(BmEhQg2cU__w+)RTyWp6?(jvPug=QPgl_mc- z0%YWBk;GvN&S~Sa21!rVp{Stj4%fPm1Q3Xavejn}LmQ4A@=zv(uIPgHzbS<-x5C4L zk*hy&!sOssLDOOmOO8=eb~C`zOhU2@wgvBzBnQbzg0otfvaLbVTgd_*CAkD1Stv_s zBmu7-Ts*X)jE!WD3QMb)53bY3Lszde;5ZGB0yL63%zz2EN{ZXv6%~}-ZWAJ%pg{tp$?oh0CxV2!qTTN=|I)Eg zHUy*8JogzLRnSo=gsv!e!D9y+LAJmN2WY|-z=_ChC9iL3B?qfI$g$c^a;&DqT(vUQ zIIeAH+Q}Uo4I)&*q6CnPB2an&NiRawrT~wnEa0&Ll2Z=ELzz0gnfS*Z-9$&J-QBGh z66dJ&#)SY+FWuO{&bqCEf)m*fG&F4G%VCj#p#osS6>^*CJR^B-b1SK8Y9q#$R+nq* zsaEofO^qZZqmcwtHG$+HF_`oSksyRg22@aXn+=HC0T@BnAUO{YOQSeh-?D{p$uFoqlE;-7H_6w zL+%P=g8PJJ)!i(uRUaC7WsgM;~vQ3NL{$3R~H+DIzh36H2&a-gD>{Orwo z5|UPD1(F^ivH?<1rc7DpFzKjlL!`9@kzIJWa=Q8g*PbI@&wY8P`&>wHpMuU$89=5U zmw{sikG1O{I1zc)E+c`%pb5)1@`Ttxli?VE=ef_D-RnFG5N$cxLhjm#5Y+-i3?w~( zq)%@IfSR~uFhPh5qB3%s!=yvm07)wc$Pyw408-_2_Mi*-#~%6GEiNRuPiT7WLUB{4 zL9AJK44zI29049HXp9t^Z~%r%)_X#QXEl+d{ke|K*@TAsI=>aA^ zf<$3LkR+Ib(hVdiLy$R4I)F%&0!UhW5cTIiOe`0QFDJfFe|)pcT}bG8Mdr8V+jAeM z!Rg0&1aPqD6b1U>hE{Uh+b!gdO)cbSZyQ0)?D|%-s5{;=fSTZW6M5~cp>`f~8NiA5 z07Un_Q%7#wPz!?V8>o6v1E`VQ_9m){{DjItZd`95SLPZRP#_%ur309B6eJE)mK-Dj zASI9-28gJ0Og-u}1My$7&&545KJF8=ve*}r<~Hs=y@Livag4_ro~XQ5^7H@KO7e@^ z$ad%|AF1vj$7|ck2~>@>j&tGv*BXWo9zobUJJZkxpUG0~RyqbMI@eA>QF;vhQTieOj({1GLcMzZ^22r{IQ8NWdi?Rh#7MBC?P{Dg4 zjP(R2)e)Z;x5Q$bFL?COSXaz>p~gfObR1$`cl&!14s2S&8lFgSp4hEz!y1ByU#;X& zWgEF=eFMPLD1pS?NCe0Vq5%NJ!0p+Ye@rOvru0(yDI|_FWdX&K(pu z3hrapO^1Bv#~Z==>n~?`BsVJDXCRRobwroeUdX!ZW5uVZUHkB?0f#X$d?l6NEFK%+f}$@)_Yvl@_#olUZ?r)7*Ej-?OvziSiEd2^ z(XBmAv?&0Q;6h?36Y`<90RcqaCrfl82xH~M>+$z~G2k$E6Z@hu;h9aVS@`Ndd5&-z zAZZqz0>lRhZ+^o__Kg5!rqnG}0MH4djVmSEwWo+SwU)V1hTMe)29Oy%=t9}1p1|Zr z;`72cnaF_i07<>Cagn+0yO{&o1}MT=iG^StvH~zUK+RG^NUg{ZM^f07WFVzbfQ|w{$7KMWhER5v=#r{z{Jg(!DWHY-4(CA_ z>lQ6SyBZ&s+qz{i0NGq#EGvAsOrWt8-Y z?k0MwJw(3@uFLkY=Yn3{N@4r^#y#L%)k6SK1<|cKLIKiY9u!wbdt?-#1aP6GYH%V0 zgGdCZ!!AI!;6VjsclHEA9^|`t?;e^5ArlVeK|KHQ`CZ~1Xy6)lM5L+LCE!>AWS&5? zB{c2_=;)am^3ulLmO34VPCxg~BZ$@}UA zscmQ;0)URO?z{ld+OtFp0BI5{i5AC*(wiLu$R0eXz^u+*RhEhPFFo2Y@tWWJvF^MB zbwWIRU7?NLcO|&bcO0NTmw=-HkhpR}s3deVK*a#hZ&SV@;Y%P)E!{yvUf*d3PB4ci z7$9NVZ?0IbWkmqceySh;y6X-Ge_*1`Oht+oVxda*ofWn3tpdH65 z$enAy0@vBbTt|Qh!GW+80^o!oG|Tss5D;GV0F556%Zu1^04I3)0WS7jkAl}j!Hu5Z zbby?zYjQ&pjQ|~H08s}zNwo2n06`c_uBP344TQ460HlIM8UX5}iS%DKJ&a5^lt^=c z#)YL-zl;Ed<#+bF1RAUDRjdIDbt6E>%WKJfXdJ?P>(5Oa@Se3?RsZQfdJpaG|s&f=ieO1Q3QX z9Fa~nKu_$ejg$$8y7D*0Vh%JhG}HKTctJOASkU7#aE1Y(re-5~cgIN*fjQ6XI~2m! zJ_^on3XYRcj?~dAMx#RU8vfhR(ne0#wUUIdD#;DW#Q@A9Nh=RBAxHqxFVgpsBWLPd z+l@znRzo*_btw;Fr_2FLW&mjffKnSl2vNJ!@Ti2ISb8h*d1*Tq+fU+b^as#Q_@+tF zphe;NUAU!Nugkz027pS=)sy=&cQSaETEl~(>FIxzkrP!$S_tn*eNL0HjeGgBt+#QyTo&HH=d^*`oPLZ$#H0rW0Z6DHrxXFe4X*9RuMz-~g|NhP)&Qk8 zNDh={0Emo44Nl}JJR(5QmG^z^V7bQ>Z%;O{8avuv4F?V&j`9523*OMEwFnS2c&|&K z83usrnwrT2IeWPKNJ+Dh^W2?(jGU=64q_y`mArqjj$EB^l)29efJYF36u$Z(S-0)9 zOI*k-gsqVQlyH^;gk5+I4_^{MO%gy9qGp>ADFTFJLD-dFdbDBs!bK_yklirG02=Fc ze~KC!x5XYngW05er~twd;_FuLFdJPKdRte;A0+=eP&4SC(b(Kdo_g;zIL{#o9u5$? z(c_zrlbXh6_W(rmA0>cf`HvhR5u%QM;gJL6x1ywN=1q@<(=!W3%JX043 zsLy5K^b3&Dr2uW%T1Fz530-z!kdV30?>8I=hjLARvbCgSa2O!JN8gSJE$BKQhB*)b z6y_>$h7h0zgOS93aEye-3ZaXQFe5ynEB2F&trafoA)T&mCiiYArND>)aYd{-M0S?c zx)`8RTHY#*0f_)5LH=U_kXq(IY7wAj5h9fX0L@>0>c6w@eC=9f!!AGz*iiL&-#>4P z4lC&T-=z#tErg9H-a0};VuguO<~}%37_;U8`SMt;%K&OHw2+rSI?DiB$pKn*lqwh! z-}j5ETnNw!3xFyB95x1|Nv@RuN;3z@93CcBdJ7*g?8kvtow_jd7q488Yz*cLhL|B0xF-Na%rC z0hGc4N@W146#)|9;Q*z#DncaXKxOA={q*^3DL@Mz9osKJ-oH-|1#nCppk8+aME6?G zZsD6+x(1-?hGz268^s);-6B93!me3+knAa|cWGf-{N^)!3`hW|m?{YL*4`S|0kj4I zk|t6$3FkOKnE%KDY9gvsN8o8;&oitcqT@ga(2A0-X+M7EYKH;xyl06nG_TX>Zh%7h z4)E>(sIJLK{{G$x$bYy4#R>ow(b4Dk_gA_Mpc;Vnsdq|5fOKN`Dkh<8j*-p9^{xR3 zYof8FRRpM90*Fpy@G+p22I@Z602$3gmjI9O+yWwT9BA3`*2xPWi0U68UWqvCM-Taj z=Cswg3n2LcCGG+U7vsfmJ_SiMuPTh)Cjx{c(91t6b=^#VMFaVHrU1_oR(gs_G&Fd0 z!f|q_yvYp!osj@ak^@vv)BupmDtz?=j|fnk2$2ZT>xUc0>u=UmfY@|~eSko-L$g~? zB0wQ|oh}7PIxeZ*tpK4uJWxfVR`L>5OrT>KKv;@#N7_MBR^^&$hIe1#56afvMwz-tf)(_@qoULgh zzsUi3mLHS>#NY{r@U{5UbEMwT;u3(gd>%{$C_w@U2NBiDbrc>oB+%vnIRTFdP&+*D z=naIc?@K$50u!E`4ZCHnqdWp{!Z*zfNvr)Rtbi7j^|<_Gzaat$=b)Z?_XN#@TYsaNQ0LRwjRToJ6eLPiNq1^1NDdpXh`WLeQgiHWl_@Gu2twf6+38OglAZN_qrS)2{~0QoF@Xpf6# z<3BxIORkP9l7%p#ijWnA-IKYO>>I$U3WVqF9c8ovF=)j>DR~wFI!=DG;WVjgY;hw% z<+PMlBLKw17Xn1VN#hcsaU338nF`(bo`B>A;`PLbxb58x&W7EU8KeBJeHNFpP7hjn zY%v1VUkGy;8V3NP=S{d6pmUIaJo!#3Urn)}m7da4)PuATEEF8+7pc3+=7Z&Q_TG^$ z``MaClK4q6xn|W)S?J>MtQOp-guJ!Sl?7!CAe{w3xEe#9SPkw|D+8#>3?S=ndq42d z@I~{W-hj1LWbQ+6Bp?&c05mP|g|B{x0Lcdu2Ly`)0MTQS+yoG6=g9_g<(dN|XxVsD7(nFkq&Wu@xY43Ondtp<3 z9!R?m+~<5~9tEe*W$?%V3K6gF1qi$JI8q$Bsz_W_A=ELmO2WgCSRW$#rF&@c*?n2N z$Z~)w`^)2`@S75n_SrG=;@bzvt#R8(=#s4fViC`IWW6pCo@3<3jFaTZIoB4|ivZy$ zblfSTp#W6?JaT||_~HPm1X+&t*mE8(NS^z!EAPMj*nel;`poUDBJqzC`UQyh^CwSG zT^A6N-CBtNK|}Yt5+LbFNK1f>ZUKnSjX^H*>_5wBsi_#oRvwf}QN>!GgUqR*>mRmk z7l~N5lg{YVL>wK5gCkB?h|a@8*AG%k$vZ_2E-k2+1BCNn8UzS>VQK-Oq-wJSTAgaJ z0LVFbC_ou)tekc6-n#KVkvIl4*<-UPsTMfU(pt z0L02JARqe2NxJ+dm;|^Sz>~sCI8^Bt`HzFnBji7US)DxriM7P*(M{`- z1fVa4#0G%M3H2_c?0|*BZMSzm(nERx# zDGW1!oPmb|)XoyadM^o?>ZcT?S5Q+;MVO!71|Q-Ud?LQA%_qkp(x(iMnTHjRzrUOW*NCT<2Z?4Tg*e3 z1W?GDW8|8Y67sXWGV;{>739MsO{Bb`&8@CuzC&3x(X1+=0I>v`1C+o3!Xz5u5hhVp z>CFn0r2RM#1*wBgVZhhTd-ikO;%+`=!NCMtN~HDIPlcYDorwRRD?cdj}iI*0N?&S_8new$s(CL%YQt z0JOS`ZxRubJj(0xji1 zk+)$_Y>v+#bMMmUclLy^FxEF%c!F~~`MK$~0lIOB0kQ>@T*G}%2Lq@S@*n7d#R&lM zF`y(ih-ecaN8!Qn#j6l~mmlkycH4`;M+Q8?ZgMz*mgPZO%!6it0`+Ni#|G;{6r5Z~ z0Wu6LKo{#i(IP<9fhs6KD%mKsSOX*iWHGyLFKh{gWSO14xHFm0vtOQqw%1Vx7z?AE z1IWW;%=Gy;%)~rMy|gIV8Gy`SQPK!N0|bcoz~WggG)`lvk{CcLc@Y@`l+j`Xpbk6m zbco^0^P$3Z*!I)>uAN0!q&f+ZJP(@deQ)9&A$jfp>o1J;3yu{)g5&@-lj{qb$o8@k zfaF^BMJ3CBFnq;JV?Zii#-U1WlmTRv0CE%_c@h1xqu)*c@ssyr+YcoFk@6s{K$|*s zHiogF#B=-PF61yQHUa7|2MA9s#=~a;peu74$v+M@jDW*c-()0@zYE~35%M1d=p2ME z=z%5k1eyY5Fb4?SCr~kbS;NC*V!f}Y|BbtGXn5O?cQ*f#hq1BT!hGjH_t`6YZ0uZ9 z@1WqZ07x&00@OlJGR6~*U;MOs1RkyXH@50%1Ir9L*mlVc4!!QG%J6U&KbWmz-BLGD7xt+a(1xQb&1dx%Q zVtiF*rAwFIT&lv-lBFM?B>K2g$$bzYOrT{|h^jQX`*3*Z0Aia1&Lix~+DUv~+R;2Q zaKSY+e9h5M9ccJ63u9BfV{mVnfWX)GuEWL-%IoYI2snB{W&m|40)(d;|MBfpX2JW@62;`d8U=jse3{mYYNVcY>_c;xP55x&geu>{D@5@x@}`@fsdBIh!T7LNB{#;1kpG1J>^ei@KP@3YPv1{MR~{xB z=y{pLBOm)|pzdRx`?OhvFWc}4?h}wyN9I2EE*8(Ld0S5$Z1^%urak<^Fq!t7d)Ja* z1*JA#z+4DjNbd+R4!Dp!j0I&HLCyT^^d=INT1WKpr%33EA`-oP7l~QEgTyS`PGVxW z!F4NKnXsBLdMUqJJ{Pr3(lX(?o$jm}y^L%5PMLN|TCp3hTr12KBRq%yi&-vvAJs1L zc@!v8)E=f4d#R#U?4t#5y5)!Iw1tL_`3Uf^yoXgE*2va>HA!{P6reTP<9)^?;DiK zA<8gth#CQ+1`?E11<7Oyuff3?^rK?k4&8*?LS_YFtB%MdE7OqG_Ry7|tB>=IEK#@$ z6pOe{Sg3?c{=9^(n81eT68?>4sI(MSP~1s2DT*`e=rAY@Q_#y&L!ykyG6UzVne!k# zDn9Qegf2E|DvdlVCeOCu5!@%ChRl8B?Juxxc^eDGV=e(mNT$bmO!Gq*nm_Z#Ki{EE zss2{adSrcr0VpUN)h<&T2S^E`dJ>cj5XF}gJv3|(ZR}%aB^Nrg8Xk+13|Tpb92TY% zYzKG>gV5Ll9HolFO%5cLu?2s)>{u==fRDogz%o{f%7r7!f+#R?XW0ldN&tuUwph-i z65tV+E;m}$JlpJf_2WK1uk8NMlxu!_51o0R>N}gZ^&pdHTP`$t;_M(_BsJjquh(Ok zan^-`as&zRSVCmsLS_&_I7?$rL=RkxV+~FlpZ=wv;2_9#oJ)F*I!9ay(;CSk=&l!W zLZhFwP?@=KgC{`%ftG@R*E4kE1B8UWj?YD%VfjovA59iSVd21t;p&_ivV`dhb9f9~ z&Ekx^Q}75queb{0`GUHb$l?q4OuHqpyaWR8L(br=!<#aAZ;h z$Ua2$%ye)g9VFLulO_D?kF!*%weXloQDqi7#diFnIxU0aw4}9iossFRvT)TX*6fI? z;9v-FFlo$G$)S-PM;hyq)_f_gwh-ZQBykodP2qj>{{D5-7@x4~nfv(6aYfhNewQ9y zh>@z9_ooeubt#bG=5_Tt1k3;-(oq>f;CLAVL`@7LXhZ=3CUYpL@Q_+Z0HBSo^m@64 zDrAxYkSK|+7?p{3y+u_sB~-J5umt{k5_1~{4J#6p@|{MSFiY?>o52(46g+Iy*>Bl# zGW+h8tFSHI?LOwY5Ki$=oahhNU`VKU>N23ml-+s3VQ6duWDSuHlXWwQ1dupP0I&`Z z8$pl+B`7FS&{=*++gbKJkwcLv0|cKZR!B-Z$Jd|>s+6gUZ}4O;4el7mB?6Pgdr(Oh zqOSokSl28bX4s!wK3TO359tPG<1*vh6qhL2c_IX6;uom4oAW{ z>A9#%evDEj-3eYN00J=0T}+%b~5Y&nS8a|I<=i(-2*+fWK7x?IUJI8wNyASB5ReEn8~%wc4}$afZ# z?XV%=&(N&5e&f7Lb5A}t`u$LOK$kG8@_&BC6n65R=nyAVSup3dXm(Uc`k+dF7HR*+J$Y#+in(b z%OPaul5fAj)c_XSQp&%z%-Bp@A?YNC_Bm`xVh?%-v>C@W{`+cy({@%pX7bR~ove z2dLo6IAh#xaOMr0ERxD3n9{qvV=zAHFQGi92|~h z9){>HrnOvkqO2SxtwDBVl1yoGAt+7ey(BptX>u84-EaAxJu-OGr8;Iyc+A0Z1|B-o z-siXU2=Tl(Ap_fpx7BRfgy|@cVR}fR3=5FPPs0xu?)&ry@6kar2xS8Xh)Zh*PJgn1 z2+vT*aKrN#Q5Lz293D+-gG_RGnq&|)iSRJl2uU)4R94%qDD2nF3*ZB}R8}P!4oy#3 zg)aY?7z3+xQ8~^X40}6ewD-UKCd)Z^=C3(RydHUTH?&C< zZJUV`eQ8?_W9U+Hq0xK@e1^w_837n$LDBv%e0>=I;&nNu3p$n;xfdKWcx1|IV~|+E z;~Y5VM<(?LPK(9nmdn+THeqcuLpEJ8%Htw=$n&9D9@D+l zI7&TnuJ&60m$se3uB|PI+y;%MGFv%B5lPBi4;$VAUkr?9vl9@Q{A z4;v_~BtB1kP|o2IdR(5oO~zi#@K{cD(B(j!{?LhYHP`z-`{`j7uIXkF^$i&`mO_Zq z4c{Ahu&YktS$!IJ6gxJ-Q}sg*kB;}arVQm&g)1S#Y~O4ARNo-DhK(IN_DY|p-rpLC zm3z4+0Lau!drEEsM-d)DS#AA-<1TpAt_oXpHw`*S*yq2Zgm^#l#!k4$SK+4G0knPNkEFsEvBRFPG)XqnU2iDtC z4X5+)kcB&m`MrLK%>BRI58>X%&^a!4ue~k0>z52XwjlE2gIFQ(i$=|TAU$dRYehYD zsGmYKM9?UOGX;qHbDqJ&(=ljx0^xJ}zO=Jv_T8(~@t)G!9(IqtE_Ha6Aeusxxd{_g z9#dw8!Sl#jKY8L2zrTN3qgs0ooTm%I8HBW~j-i7mo1dL-;Y9Y}Q4J?NQpoDXTIP9A ze_S{H#z!8f@Zde2FhR`|<|!A`K%pyhqRG5FIe**~Z-giU$0@x3^3IlkWyM4THyt3l z;BII{aO6UW(wiMTV{{n87Vo0t)$jGg#OqHRwojN7cq87!aWnnHX-zY`x05f$oX1fo z8q3Eba3aqiAPU9#8O)33-kZ4A|K*+Cs)QR1A}MK2{U~U zOO$crC*SA4?w<4O70Gzd@ZRx1M1OuyCw(8`Q5tN-(a@Q64fgn{K^~K5MxYJPh`#HW z^B(`l?ts{%)D1K_m>aRMrg1ksW)K-=Re-}3ws^RrxlVd3b)C77Y}`8~>Zf|Rdf_ja_$_xvHRXq?6qzQA!)ywHXbq?ozCTDH{p`7dh&R+mAeLW2TG070K- z03bOGj!d+XMOcP7Y_Zq-gdUdv>Qlt$nSa;Mx^wYz-ph*M_bQOzyJ^EwQFyUHBqZ0f z>6+~EQ}rI>CQ~<>;OYNEuLpDA@_TuQDKNgA17W(L&hG5(52S%WBf=v#WV<;m?sgs_ zLB>2MyNk?^KSz9C+-90{f7+%AbNp_kt^@bRW8BnWdau|$6O!f23Ld4rXd<5__O@`N z=&2ER{L1U0!cY8P+4JAP_zDIHI#Lz~$pWT9gJbCi?sOjUH5RHUIBTnj-z&TS>-oq0 ze@_kn$*&b$$D7})iQo5p$5}TT&&Mw2FgF?>G;Z?TNbK(8O`N%K(f!_kTK~EKD?7gp z09#i>!)YMdMwkGAJ~cFi%fPYcM6Q5G9;Tp6jw?jxuQ@|}U*7TU+&>j=o_6&;4{&fI z={MZLafQcANy_ z2{n)_fO?r6gGuF#1c(OH+sbHX<)xW4Owk(Uz*GalDF`3fGx+f4OWW^x6)9<$pULT#2ryf`(Dk z2Ers18>_<%DAhnkA#n1@q|Ej{Jh%jpP7GcvbXyyshQ`0TUqdTrIjsh&3ojzfP( z{9PG1-uxa+zMONNfx6KcZq-wGA=EsY1HfOUEVM;~7EHV9p5M*AFFDWWiT95|!$3tg+xh}C+Izui@cZ|0r@{P&It_*9)qUr^ z;WN&;H!*M8g1hg>&(6nlSg2x-6UcwpS^Re&FYBI|_jWG`!(V z^t5Xh{h#M=6SC$#_Rb!k7q%GuVviE63l0FFFxNmA;9_GeTx_?Bj$ZB<(sQfV5R$gu zfULG21ckzq#bH6n5T=wSGC!`I;0n-r&u=k!J@)Qy{7h39{`L>>8L#G_H3~mF{T*12 zBRGx#&V&(gTo2L&esgE?Iu}eV)nNId>@Rqn;7Zs)S5Ed1zHP>BPdp9ol<)cHx3~HH zZF9NL;ys;y%Z}0U73}d)upq1i3Ojj8fGG<=p{pj+nn^%XJ;7tKF?{;N_r&k*{mkd( zUhuQ(@0rZwb3qyr zCdrvZpg=#E8g$dIX59MZQ?q{+8}Io*_M2W0t^dsH@%Q%4d*-v!dCz@O>GS;7I-i$! zH~TH#)9SmVsNHwTfp))F_qO`Hvb)*mrR{a|p8xXPyk|Zy#jo*tc>QOd4`jVL`bpE@H8v$o%LArwXNCa1!E`tf@hExz5 z^d3`YhSSEIJX6SZF!TA(_TryK4vnSTjDT~I!Ze8wyv^Xr zsV7fVeYqn9@Wxit(1MMRj)5RBg>r>(IP@G44gVSy{~rGQdwTPqF^m7qsr)mHKy!)0 zbOmp;u{=4Q$j4Ns@cc;tYc>xpo;;!T;xNeN#sANfzjw9_lxh5XPUb&jJpY+vEW*MTiYr%XDvb(kQR( z-8lbHT3&X#==#}XFJ5Il`Untaom{f`=k-aO-UUoW@Pw)n!}fDm4OIaj-Va7K-e0ix z7;p03>0ifRdOoOcyjZ_~^4Y5^qr>#|$p>$i;7?C9PBr}SHf*HzbnV;Bja$Fze|W-e z*R>kY+P9-Or-mlqT<7;ztPrJB!_J`54YgGIuC^LJ@sgNQFEL&zGFda5wUYQfU)?HW zVu^=3FJPxt&v$mzVhZ9VGQ1^!wlL9S>E;j+tsS#Awo3CgsdF5)b)GFRUFK1!XiIAP7I^`!Xofi?wf*Ws-rag*&xVcw zu0>uQyQjlpQ{^2BRb}9wf2i!}aL^{dS+6+#>UZ9-SnW}!2+XKYzBTm4j-9}huT$47 z^`((A}zq7GS5_Yqho62vu@lKuOGE_Ot^#1k3!+NZ{>G< z%dd9ayA@%O#Al$>oE5s4LRlU7OzVCwTL-7aQ_X=9m?GY07)IFFEF(C)9L$#bpTI8r zVW>KMv+MV=$$fnV8``bm%%|(pPrrPZZ9hG2vW^E!f8OdbG2sFx*=M%J3wTesavMzo zw#c7PgYv5ZEa*sd*~Foa)N;-3 z@x7}4hEa&nNmn;#V~Vi$htf!nWso4r%K;HlsA?`KC{YW91G8~fl7-g8xMTD$>O7_K z%SCNf{dEv592A(xcj?gzgU!jqoqQBnSOmMui7SB8X@_PloBEOBc8#%#`} zji#NF^Evf6Bk3L>K}3yB^NX;yduc9yRN`7ZB;EjhgJbQTzb;3W84~yXVsLnO-HcnVVZWd zE!;#zt%00Jmo;DQF0NXosY7L=$L6l=-oHvv6@pbjQgGAn^Je9_{|p!j+*X+cQ z`QobIS37&GjXx?wr(a9$P?ogr`%xS>JVd}Hbwgg!=P26 z9@c1(*U^f*ZhHtE{*L8a@HwReVY8Y`!G#;u47-tekES$mCUQci0NO&V!e_FrJ&9mQ=PB^RqxkH3q6pF3v@kXc4mge-`>(Kx4Y2` zpqd$y?=Z_TDbRNaTvQ?`sl~2o>k=rgVTh z1wkXEpPt0Ohg*81c5LK^tlC~*(P>wCJLpVv)yO9z8=hc~_ZAm*W;qb#IGB8D3 zoYV(fibL-P^y=xY2Rj*Y$R*ni#m`oD>c;wc*4J~P;q)#plfOJS~hXRUDu}=JaGaS>q+;5;&o|6t##HM{oOKi zJhbUBtgG4fdOvn*vD1YmfiUGUoypYw)FauJPg``9Ckr%b?ie^SDMH^8id zRAzJx$Ldqr?S<}^Ve*P#z&*-u`p0yUzJxAok)9m6E(Tnavw8U{F?*q5Wrk_S6O?*} zo`hG#K$uh0rRn298}7=y<@nnv6Y)nkfc}tl;#$!$`=;Mk72jIfM&v0j-G7BOL+U?GUDhvjt*UDaP(lS&sUIGIJ99ApuZjIkX2+$;Qr6$!SYz zC`7V*Qvfipte5uxtH>M>rYjZ0gzK~-+qSQkB4RuVC|VGpe+{F+2{gIFF4I$vSSKtS z@tO#hiMGL(&|p$Z={RUwPXL}+19^j z%P!wfq-%q{bJE2A3!UJ3;KxsO#!6%JNVJ5ib7a>+&5EFAlzxqvWAF;+$e!dOUg&FS zhMyyFa*Beip}zj;zN%Kj5zI8(n1e(}0u@U?N8B16Dfh&;*tLNpXdSlA+RaBxB zJxsA{rKTCORmGa}F^&+DO~m9}2OX4FgWYHc-}0eo+O9-jLPpNiL0qSqjeD>Iu+b4O zj#M42hZ08=UBQ|T!KsA^^Jq!V&~w}3(d1p$%(~s{HgH1X^kgC*6xvZ>1%(czqS5dY zO;te#ux1@LKS&td;JW+4R>Y1hBg-vn3aN~>uUBQ5PRL9 zyrBsCgU@*|${g0EWMYc}qS}}pt0RuEwymIE2w1RMy}fP*5Mwf1>D5S61_iKwE7 zIKFY5;qGRuD6rx^Zh82NHDzl=;A`nhq=e(kO#nwUzC$sTBZT1R%m7xAG5e(>o}c{l zgGSvJg@?sZk)qx?+=Rbrd}F91bBGl)fRC;5Z>S;$DfzGP)W-+^&y4@E@IPUz-y2s6 XPFRliFPRDd4sv3a#w#w!Qg#0ZVeOPP diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 9c1f65e30b05b104df95aca6aadc19bbd2ca62f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12862 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 77816ce80de495972866e29c5eda6fbed6148bf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19126 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 2fb44431a4a75ee4542f29b9163e6f073521af6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19078 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 Date: Fri, 29 Mar 2024 10:49:05 +0530 Subject: [PATCH 42/58] CameraController: Append FP's custom scaler configuration --- .../cameracontroller/CameraController2.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java index 6b47e10f0..d4fe40e5d 100644 --- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java +++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java @@ -2911,6 +2911,28 @@ public class CameraController2 extends CameraController { camera_features.picture_sizes.add(new CameraController.Size(camera_size.getWidth(), camera_size.getHeight())); } } + + CameraCharacteristics.Key fairphoneAvailableStreamConfigurations = null; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + fairphoneAvailableStreamConfigurations = new CameraCharacteristics.Key<>("fp.scaler.availableStreamConfigurations", int[].class); + } + + int[] FP_StreamConfigs = characteristics.get(fairphoneAvailableStreamConfigurations); + + for (int i = 0; i < FP_StreamConfigs.length / 4; i++) { + int format = FP_StreamConfigs[i * 4]; + int width = FP_StreamConfigs[i * 4 + 1]; + int height = FP_StreamConfigs[i * 4 + 2]; + int output = FP_StreamConfigs[i * 4 + 3]; + + if (output != 0) { + if( MyDebug.LOG ) + Log.d(TAG, "custom scaler size: " + height + " x " + width); + camera_features.picture_sizes.add(new Size(width, height)); + } + } + // sizes are usually already sorted from high to low, but sort just in case // note some devices do have sizes in a not fully sorted order (e.g., Nokia 8) Collections.sort(camera_features.picture_sizes, new CameraController.SizeSorter()); -- GitLab From cf90b589035eebd57e2bac7af8d32b2025b946e1 Mon Sep 17 00:00:00 2001 From: Daniel Jacob Chittoor Date: Fri, 29 Mar 2024 10:55:02 +0530 Subject: [PATCH 43/58] CameraController: Conditionalize FP scaler for FP4 --- .../cameracontroller/CameraController2.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java index d4fe40e5d..f1302b820 100644 --- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java +++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java @@ -80,6 +80,7 @@ public class CameraController2 extends CameraController { private CameraDevice camera; private final String cameraIdS; + private final boolean is_fairphone_4; private final boolean is_samsung; private final boolean is_samsung_s7; // Galaxy S7 or Galaxy S7 Edge private final boolean is_samsung_galaxy_s; @@ -2060,10 +2061,12 @@ public class CameraController2 extends CameraController { this.camera_error_cb = camera_error_cb; //this.is_oneplus = Build.MANUFACTURER.toLowerCase(Locale.US).contains("oneplus"); + this.is_fairphone_4 = Build.MODEL.toLowerCase(Locale.US).contains("fp4"); this.is_samsung = Build.MANUFACTURER.toLowerCase(Locale.US).contains("samsung"); this.is_samsung_s7 = Build.MODEL.toLowerCase(Locale.US).contains("sm-g93"); this.is_samsung_galaxy_s = is_samsung && Build.MODEL.toLowerCase(Locale.US).contains("sm-g"); if( MyDebug.LOG ) { + Log.d(TAG, "is_fairphone_4: " + is_fairphone_4); Log.d(TAG, "is_samsung: " + is_samsung); Log.d(TAG, "is_samsung_s7: " + is_samsung_s7); Log.d(TAG, "is_samsung_galaxy_s: " + is_samsung_galaxy_s); @@ -2912,24 +2915,26 @@ public class CameraController2 extends CameraController { } } - CameraCharacteristics.Key fairphoneAvailableStreamConfigurations = null; + if (is_fairphone_4) { + CameraCharacteristics.Key fairphoneAvailableStreamConfigurations = null; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - fairphoneAvailableStreamConfigurations = new CameraCharacteristics.Key<>("fp.scaler.availableStreamConfigurations", int[].class); - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + fairphoneAvailableStreamConfigurations = new CameraCharacteristics.Key<>("fp.scaler.availableStreamConfigurations", int[].class); + } - int[] FP_StreamConfigs = characteristics.get(fairphoneAvailableStreamConfigurations); + int[] FP_StreamConfigs = characteristics.get(fairphoneAvailableStreamConfigurations); - for (int i = 0; i < FP_StreamConfigs.length / 4; i++) { - int format = FP_StreamConfigs[i * 4]; - int width = FP_StreamConfigs[i * 4 + 1]; - int height = FP_StreamConfigs[i * 4 + 2]; - int output = FP_StreamConfigs[i * 4 + 3]; + for (int i = 0; i < FP_StreamConfigs.length / 4; i++) { + int format = FP_StreamConfigs[i * 4]; + int width = FP_StreamConfigs[i * 4 + 1]; + int height = FP_StreamConfigs[i * 4 + 2]; + int output = FP_StreamConfigs[i * 4 + 3]; - if (output != 0) { - if( MyDebug.LOG ) - Log.d(TAG, "custom scaler size: " + height + " x " + width); - camera_features.picture_sizes.add(new Size(width, height)); + if (output != 0) { + if (MyDebug.LOG) + Log.d(TAG, "custom scaler size: " + height + " x " + width); + camera_features.picture_sizes.add(new Size(width, height)); + } } } -- GitLab From 33c3e94eb63e7423dc4767a9dfd4026e99363d8c Mon Sep 17 00:00:00 2001 From: Rohit Sekhar Date: Fri, 19 Apr 2024 00:10:25 +0530 Subject: [PATCH 44/58] ImageSaver: Update GPS EXIF data if longitude is not set or zero - Except in dark conditions (cover the camera with hands), FP5 stores the longitude in exif metadata as zero, leading to incorrect GPS location. - This is despite, passing the proper location via https://gitlab.e.foundation/e/os/camera/-/blob/5992f11fa7029d9d15349a762f21206531384fe4/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java#L479 - Since the bug happens in deeper proprietary layer, extend the existing mechanism used for devices with cameraextensions, to update the exif data when longitude is zero. --- app/src/main/java/net/sourceforge/opencamera/ImageSaver.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/ImageSaver.java b/app/src/main/java/net/sourceforge/opencamera/ImageSaver.java index 878c39e25..9bf105cb4 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ImageSaver.java +++ b/app/src/main/java/net/sourceforge/opencamera/ImageSaver.java @@ -3952,9 +3952,10 @@ public class ImageSaver extends Thread { } setCustomExif(exif, custom_tag_artist, custom_tag_copyright); - if( store_location && ( !exif.hasAttribute(ExifInterface.TAG_GPS_LATITUDE) || !exif.hasAttribute(ExifInterface.TAG_GPS_LATITUDE) ) ) { + if( store_location && ( !exif.hasAttribute(ExifInterface.TAG_GPS_LATITUDE) || !exif.hasAttribute(ExifInterface.TAG_GPS_LONGITUDE) || exif.getLatLong()[1] == 0.0d) ) { // We need this when using camera extensions (since Camera API doesn't support location for camera extensions). // But some devices (e.g., Pixel 6 Pro with Camera2 API) seem to not store location data, so we always check if we need to add it. + // Also for FP5, wherein longitude randomly is 0.0d, even when properly passed via JPEG_GPS_LOCATION // fine to ignore request.remove_device_exif, as this is a separate user option if( MyDebug.LOG ) Log.d(TAG, "store location"); // don't log location for privacy reasons! -- GitLab From cba3755c57c16a6a303ab0ef40d4fa7fe74c1ba4 Mon Sep 17 00:00:00 2001 From: Daniel Jacob Chittoor Date: Wed, 1 May 2024 10:23:09 +0530 Subject: [PATCH 45/58] CameraController: Only add unique entries from FP's custom scaler --- .../cameracontroller/CameraController2.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java index f1302b820..ef52a5472 100644 --- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java +++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java @@ -2915,25 +2915,23 @@ public class CameraController2 extends CameraController { } } - if (is_fairphone_4) { - CameraCharacteristics.Key fairphoneAvailableStreamConfigurations = null; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - fairphoneAvailableStreamConfigurations = new CameraCharacteristics.Key<>("fp.scaler.availableStreamConfigurations", int[].class); - } - + if (is_fairphone_4 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + CameraCharacteristics.Key fairphoneAvailableStreamConfigurations = + new CameraCharacteristics.Key<>("fp.scaler.availableStreamConfigurations", int[].class); int[] FP_StreamConfigs = characteristics.get(fairphoneAvailableStreamConfigurations); for (int i = 0; i < FP_StreamConfigs.length / 4; i++) { - int format = FP_StreamConfigs[i * 4]; int width = FP_StreamConfigs[i * 4 + 1]; int height = FP_StreamConfigs[i * 4 + 2]; int output = FP_StreamConfigs[i * 4 + 3]; if (output != 0) { - if (MyDebug.LOG) - Log.d(TAG, "custom scaler size: " + height + " x " + width); - camera_features.picture_sizes.add(new Size(width, height)); + Size size = new Size(width, height); + if (!camera_features.picture_sizes.contains(size)) { + if (MyDebug.LOG) + Log.d(TAG, "custom scaler size: " + height + " x " + width); + camera_features.picture_sizes.add(size); + } } } } -- GitLab From 7b94bc23556e24ab18bf48a33c3779350e4b4026 Mon Sep 17 00:00:00 2001 From: Daniel Jacob Chittoor Date: Fri, 3 May 2024 14:56:14 +0530 Subject: [PATCH 46/58] CameraController: Adhere to conventional Java naming practices --- .../opencamera/cameracontroller/CameraController2.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java index ef52a5472..fe3491d3b 100644 --- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java +++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java @@ -2918,12 +2918,12 @@ public class CameraController2 extends CameraController { if (is_fairphone_4 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { CameraCharacteristics.Key fairphoneAvailableStreamConfigurations = new CameraCharacteristics.Key<>("fp.scaler.availableStreamConfigurations", int[].class); - int[] FP_StreamConfigs = characteristics.get(fairphoneAvailableStreamConfigurations); + int[] fpStreamConfigs = characteristics.get(fairphoneAvailableStreamConfigurations); - for (int i = 0; i < FP_StreamConfigs.length / 4; i++) { - int width = FP_StreamConfigs[i * 4 + 1]; - int height = FP_StreamConfigs[i * 4 + 2]; - int output = FP_StreamConfigs[i * 4 + 3]; + for (int i = 0; i < fpStreamConfigs.length / 4; i++) { + int width = fpStreamConfigs[i * 4 + 1]; + int height = fpStreamConfigs[i * 4 + 2]; + int output = fpStreamConfigs[i * 4 + 3]; if (output != 0) { Size size = new Size(width, height); -- GitLab From 4afabff73c1b4cd9555193c8353b32df07854321 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 19 Apr 2024 09:16:17 +0000 Subject: [PATCH 47/58] camera: Barcode scanner --- app/build.gradle | 5 +- .../sourceforge/opencamera/MainActivity.java | 76 ++++- .../opencamera/ext/AddressBookParsedResult.kt | 130 +++++++++ .../opencamera/ext/CalendarParsedResult.kt | 63 ++++ .../net/sourceforge/opencamera/ext/Context.kt | 17 ++ .../ext/EmailAddressParsedResult.kt | 52 ++++ .../opencamera/ext/GeoParsedResult.kt | 36 +++ .../opencamera/ext/ISBNParsedResult.kt | 38 +++ .../sourceforge/opencamera/ext/ImageProxy.kt | 42 +++ .../net/sourceforge/opencamera/ext/Int.kt | 20 ++ .../opencamera/ext/ParsedResult.kt | 50 ++++ .../opencamera/ext/ProductParsedResult.kt | 38 +++ .../opencamera/ext/RemoteAction.kt | 44 +++ .../opencamera/ext/SMSParsedResult.kt | 36 +++ .../opencamera/ext/TelParsedResult.kt | 36 +++ .../opencamera/ext/VINParsedResult.kt | 39 +++ .../opencamera/ext/WifiParsedResult.kt | 66 +++++ .../opencamera/preview/Preview.java | 274 +++++++++++------- .../opencamera/qr/QrImageAnalyzer.kt | 215 ++++++++++++++ .../opencamera/qr/QrTextClassifier.kt | 101 +++++++ .../net/sourceforge/opencamera/ui/MainUI.java | 35 ++- app/src/main/res/drawable/empty.xml | 8 + app/src/main/res/drawable/ic_book.xml | 15 + .../main/res/drawable/ic_calendar_add_on.xml | 15 + .../main/res/drawable/ic_contact_phone.xml | 15 + app/src/main/res/drawable/ic_content_copy.xml | 16 + .../main/res/drawable/ic_directions_car.xml | 21 ++ app/src/main/res/drawable/ic_drag_handle.xml | 10 + app/src/main/res/drawable/ic_email.xml | 15 + app/src/main/res/drawable/ic_location_on.xml | 18 ++ app/src/main/res/drawable/ic_network_wifi.xml | 14 + app/src/main/res/drawable/ic_passkey.xml | 15 + app/src/main/res/drawable/ic_phone.xml | 15 + .../main/res/drawable/ic_shopping_cart.xml | 15 + app/src/main/res/drawable/ic_sms.xml | 15 + .../main/res/drawable/ic_switch_qrcode.xml | 17 ++ app/src/main/res/drawable/ic_text_snippet.xml | 16 + .../qr_bottom_sheet_action_button_divider.xml | 10 + .../layout/qr_bottom_sheet_action_button.xml | 20 ++ .../res/layout/qr_bottom_sheet_dialog.xml | 154 ++++++++++ app/src/main/res/values-fr/strings.xml | 32 ++ app/src/main/res/values/colors.xml | 7 + app/src/main/res/values/strings.xml | 31 ++ 43 files changed, 1791 insertions(+), 116 deletions(-) create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/AddressBookParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/CalendarParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/Context.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/EmailAddressParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/GeoParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/ISBNParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/ImageProxy.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/Int.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/ParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/ProductParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/RemoteAction.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/SMSParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/TelParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/VINParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/ext/WifiParsedResult.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/qr/QrImageAnalyzer.kt create mode 100644 app/src/main/java/net/sourceforge/opencamera/qr/QrTextClassifier.kt create mode 100644 app/src/main/res/drawable/empty.xml create mode 100644 app/src/main/res/drawable/ic_book.xml create mode 100644 app/src/main/res/drawable/ic_calendar_add_on.xml create mode 100644 app/src/main/res/drawable/ic_contact_phone.xml create mode 100644 app/src/main/res/drawable/ic_content_copy.xml create mode 100644 app/src/main/res/drawable/ic_directions_car.xml create mode 100644 app/src/main/res/drawable/ic_drag_handle.xml create mode 100644 app/src/main/res/drawable/ic_email.xml create mode 100644 app/src/main/res/drawable/ic_location_on.xml create mode 100644 app/src/main/res/drawable/ic_network_wifi.xml create mode 100644 app/src/main/res/drawable/ic_passkey.xml create mode 100644 app/src/main/res/drawable/ic_phone.xml create mode 100644 app/src/main/res/drawable/ic_shopping_cart.xml create mode 100644 app/src/main/res/drawable/ic_sms.xml create mode 100644 app/src/main/res/drawable/ic_switch_qrcode.xml create mode 100644 app/src/main/res/drawable/ic_text_snippet.xml create mode 100644 app/src/main/res/drawable/qr_bottom_sheet_action_button_divider.xml create mode 100644 app/src/main/res/layout/qr_bottom_sheet_action_button.xml create mode 100644 app/src/main/res/layout/qr_bottom_sheet_dialog.xml diff --git a/app/build.gradle b/app/build.gradle index 6a5977a68..775d38616 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,7 +17,7 @@ android { defaultConfig { applicationId "foundation.e.camera" - minSdkVersion 25 + minSdkVersion 26 targetSdkVersion 34 //compileSdkVersion 31 // needed to support appcompat:1.4.0 (which we need for emoji policy support, and not yet ready to target SDK 30) @@ -73,6 +73,9 @@ dependencies { implementation 'androidx.exifinterface:exifinterface:1.3.7' + implementation 'androidx.camera:camera-core:1.2.3' + implementation 'com.google.zxing:core:3.5.2' + testImplementation 'junit:junit:4.13.2' // newer AndroidJUnit4 InstrumentedTest diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 410dbedb7..a285960f2 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -9,6 +9,7 @@ import net.sourceforge.opencamera.camera2.model.CameraModel; import net.sourceforge.opencamera.camera2.model.CameraType; import net.sourceforge.opencamera.preview.Preview; import net.sourceforge.opencamera.preview.VideoProfile; +import net.sourceforge.opencamera.qr.QrImageAnalyzer; import net.sourceforge.opencamera.remotecontrol.BluetoothRemoteControl; import net.sourceforge.opencamera.ui.DrawPreview; import net.sourceforge.opencamera.ui.FolderChooserDialog; @@ -116,6 +117,12 @@ import android.widget.ZoomControls; import androidx.appcompat.app.AppCompatActivity; +import kotlin.coroutines.CoroutineContext; +import kotlinx.coroutines.CoroutineScope; +import kotlinx.coroutines.Dispatchers; +import kotlinx.coroutines.Job; +import kotlinx.coroutines.JobKt; + /** The main Activity for Open Camera. */ public class MainActivity extends AppCompatActivity implements PreferenceFragment.OnPreferenceStartFragmentCallback { @@ -243,6 +250,11 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen //public static final boolean lock_to_landscape = true; public static final boolean lock_to_landscape = false; + // QRCode + public QrImageAnalyzer qrImageAnalyzer; + private Job job; + private CoroutineScope coroutineScope; + // handling for lock_to_landscape==false: public enum SystemOrientation { @@ -275,6 +287,16 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "activity_count: " + activity_count); super.onCreate(savedInstanceState); + //QRCode + job = JobKt.Job(null); + coroutineScope = new CoroutineScope() { + @Override + public CoroutineContext getCoroutineContext() { + return Dispatchers.getMain().plus(job); + } + }; + qrImageAnalyzer = new QrImageAnalyzer(this, coroutineScope); + setContentView(R.layout.activity_main); PreferenceManager.setDefaultValues(this, R.xml.preferences, false); // initialise any unset preferences to their default values if( MyDebug.LOG ) @@ -2762,6 +2784,44 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen showAlert(alertDialog.create()); } + /* getBetterQRCodeCameraID() + Returns the best camera ID, based on the fact that it's probably the first rear camera available. + The user always has the option of selecting with the lens switcher in case the choice is wrong. + Returns -1 if no camera available. In that case we do *NOT* trig any switch. + */ + public int getBetterQRCodeCameraID() { + int best_qrcode_camera = -1; + if( MyDebug.LOG ) + Log.d(TAG, "getBetterQRCodeCameraID"); + if( !isMultiCamEnabled() ) { + Log.e(TAG, "getBetterQRCodeCameraID switch multi camera icon shouldn't have been visible"); + return best_qrcode_camera; + } + if( preview.isOpeningCamera() ) { + if( MyDebug.LOG ) + Log.d(TAG, "getBetterQRCodeCameraID already opening camera in background thread"); + return best_qrcode_camera; + } + if( this.preview.canSwitchCamera() ) { + try { + CameraManager _cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); + for (String _cameraId : _cameraManager.getCameraIdList()) { + CameraCharacteristics characteristics = _cameraManager.getCameraCharacteristics(_cameraId); + Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); + if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK) { + best_qrcode_camera = Integer.parseInt(_cameraId); + if( MyDebug.LOG ) + Log.d(TAG, "best_qrcode_camera ="+best_qrcode_camera); + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return best_qrcode_camera; + } + private void updateMultiCameraIcon() { Button multiCameraButton = findViewById(R.id.switch_multi_camera); @@ -2971,7 +3031,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen //case "preference_show_take_photo": // need to update the UI case "preference_show_toasts": case "preference_show_whats_new": - //case "preference_multi_cam_button": // need to update the UI + //case "preference_multi_cam_button": // need to update the UI case "preference_keep_display_on": case "preference_max_brightness": //case "preference_resolution": // need to set up camera controller and preview @@ -3938,8 +3998,8 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } /** Set up listener to handle listening for system ui changes (for immersive mode), and setting - * a WindowsInsetsListener to find the navigation_gap. - */ + * a WindowsInsetsListener to find the navigation_gap. + */ private void setupSystemUiVisibilityListener() { View decorView = getWindow().getDecorView(); @@ -4767,7 +4827,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen update_gallery_future = null; } - //}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + //}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }; ExecutorService executor = Executors.newSingleThreadExecutor(); @@ -4829,7 +4889,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } /** Creates a notification to indicate still saving images (or updates an existing one). - * Update: notifications now removed due to needing permissions on Android 13+. + * Update: notifications now removed due to needing permissions on Android 13+. */ private void createImageSavingNotification() { if( MyDebug.LOG ) @@ -6527,7 +6587,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen simple = false; } } - else { + else { //Camera if( photo_mode == MyApplicationInterface.PhotoMode.Panorama ) { // don't show resolution in panorama mode toast_string = ""; @@ -6561,7 +6621,9 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen simple = false; } } - if( applicationInterface.getFaceDetectionPref() ) { + if (preview.isQRCode()) { + toast_string = "QRCode"; + } else if( applicationInterface.getFaceDetectionPref() ) { //Camera || Video // important so that the user realises why touching for focus/metering areas won't work - easy to forget that face detection has been turned on! toast_string += "\n" + getResources().getString(R.string.preference_face_detection); simple = false; diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/AddressBookParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/AddressBookParsedResult.kt new file mode 100644 index 000000000..ba23aedf8 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/AddressBookParsedResult.kt @@ -0,0 +1,130 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.os.Build +import android.provider.ContactsContract +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import com.google.zxing.client.result.AddressBookParsedResult +import net.sourceforge.opencamera.R + +fun AddressBookParsedResult.createIntent() = Intent( + Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI +).apply { + names.firstOrNull()?.let { + putExtra(ContactsContract.Intents.Insert.NAME, it) + } + + pronunciation?.let { + putExtra(ContactsContract.Intents.Insert.PHONETIC_NAME, it) + } + + phoneNumbers?.let { phoneNumbers -> + val phoneTypes = phoneTypes ?: arrayOf() + + for ((key, keys) in listOf( + listOf( + ContactsContract.Intents.Insert.PHONE, + ContactsContract.Intents.Insert.PHONE_TYPE, + ), + listOf( + ContactsContract.Intents.Insert.SECONDARY_PHONE, + ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE, + ), + listOf( + ContactsContract.Intents.Insert.TERTIARY_PHONE, + ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE, + ), + ).withIndex()) { + phoneNumbers.getOrNull(key)?.let { phone -> + putExtra(keys.first(), phone) + phoneTypes.getOrNull(key)?.let { + putExtra(keys.last(), it) + } + } + } + } + + emails?.let { emails -> + val emailTypes = emailTypes ?: arrayOf() + + for ((key, keys) in listOf( + listOf( + ContactsContract.Intents.Insert.EMAIL, + ContactsContract.Intents.Insert.EMAIL_TYPE, + ), + listOf( + ContactsContract.Intents.Insert.SECONDARY_EMAIL, + ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE, + ), + listOf( + ContactsContract.Intents.Insert.TERTIARY_EMAIL, + ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE, + ), + ).withIndex()) { + emails.getOrNull(key)?.let { phone -> + putExtra(keys.first(), phone) + emailTypes.getOrNull(key)?.let { + putExtra(keys.last(), it) + } + } + } + } + + instantMessenger?.let { + putExtra(ContactsContract.Intents.Insert.IM_HANDLE, it) + } + + note?.let { + putExtra(ContactsContract.Intents.Insert.NOTES, it) + } + + addresses?.let { emails -> + val addressTypes = addressTypes ?: arrayOf() + + for ((key, keys) in listOf( + listOf( + ContactsContract.Intents.Insert.POSTAL, + ContactsContract.Intents.Insert.POSTAL_TYPE, + ), + ).withIndex()) { + emails.getOrNull(key)?.let { phone -> + putExtra(keys.first(), phone) + addressTypes.getOrNull(key)?.let { + putExtra(keys.last(), it) + } + } + } + } + + org?.let { + putExtra(ContactsContract.Intents.Insert.COMPANY, it) + } +} + +fun AddressBookParsedResult.createTextClassification( + context: Context +) = TextClassification.Builder() + .setText(title ?: names.firstOrNull() ?: "") + .setEntityType(TextClassifier.TYPE_OTHER, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_contact_phone, + R.string.qr_address_title, + R.string.qr_address_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/CalendarParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/CalendarParsedResult.kt new file mode 100644 index 000000000..a76232ea0 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/CalendarParsedResult.kt @@ -0,0 +1,63 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.os.Build +import android.provider.CalendarContract +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import androidx.core.os.bundleOf +import com.google.zxing.client.result.CalendarParsedResult +import net.sourceforge.opencamera.R + +fun CalendarParsedResult.createIntent() = Intent( + Intent.ACTION_INSERT, CalendarContract.Events.CONTENT_URI +).apply { + summary?.let { + putExtra(CalendarContract.Events.TITLE, it) + } + description?.let { + putExtra(CalendarContract.Events.DESCRIPTION, it) + } + location?.let { + putExtra(CalendarContract.Events.EVENT_LOCATION, it) + } + organizer?.let { + putExtra(CalendarContract.Events.ORGANIZER, it) + } + attendees?.let { + putExtra(Intent.EXTRA_EMAIL, it.joinToString(",")) + } + + putExtras( + bundleOf( + CalendarContract.EXTRA_EVENT_BEGIN_TIME to startTimestamp, + CalendarContract.EXTRA_EVENT_END_TIME to endTimestamp, + CalendarContract.EXTRA_EVENT_ALL_DAY to (isStartAllDay && isEndAllDay), + ) + ) +} + +fun CalendarParsedResult.createTextClassification(context: Context) = TextClassification.Builder() + .setText(summary) + .setEntityType(TextClassifier.TYPE_OTHER, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_calendar_add_on, + R.string.qr_calendar_title, + R.string.qr_calendar_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/Context.kt b/app/src/main/java/net/sourceforge/opencamera/ext/Context.kt new file mode 100644 index 000000000..4026fb52e --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/Context.kt @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.content.Context +import android.util.TypedValue +import androidx.annotation.AttrRes +import androidx.annotation.ColorInt + +@ColorInt +fun Context.getThemeColor(@AttrRes attribute: Int) = TypedValue().let { + theme.resolveAttribute(attribute, it, true) + it.data +} diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/EmailAddressParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/EmailAddressParsedResult.kt new file mode 100644 index 000000000..764e70016 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/EmailAddressParsedResult.kt @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import androidx.core.os.bundleOf +import com.google.zxing.client.result.EmailAddressParsedResult +import net.sourceforge.opencamera.R + +fun EmailAddressParsedResult.createIntent() = Intent( + Intent.ACTION_SENDTO, + Uri.parse("mailto:${tos?.firstOrNull() ?: ""}") +).apply { + putExtras( + bundleOf( + Intent.EXTRA_EMAIL to tos, + Intent.EXTRA_CC to cCs, + Intent.EXTRA_BCC to bcCs, + Intent.EXTRA_SUBJECT to subject, + Intent.EXTRA_TEXT to body, + ) + ) +} + +fun EmailAddressParsedResult.createTextClassification( + context: Context +) = TextClassification.Builder() + .setText(tos.joinToString()) + .setEntityType(TextClassifier.TYPE_EMAIL, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_email, + R.string.qr_email_title, + R.string.qr_email_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/GeoParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/GeoParsedResult.kt new file mode 100644 index 000000000..ecac26eeb --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/GeoParsedResult.kt @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import com.google.zxing.client.result.GeoParsedResult +import net.sourceforge.opencamera.R + +fun GeoParsedResult.createIntent() = Intent(Intent.ACTION_VIEW, Uri.parse(geoURI)) + +fun GeoParsedResult.createTextClassification(context: Context) = TextClassification.Builder() + .setText(displayResult) + .setEntityType(TextClassifier.TYPE_ADDRESS, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_location_on, + R.string.qr_geo_title, + R.string.qr_geo_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/ISBNParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/ISBNParsedResult.kt new file mode 100644 index 000000000..44f6bd8c7 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/ISBNParsedResult.kt @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import com.google.zxing.client.result.ISBNParsedResult +import net.sourceforge.opencamera.R + +fun ISBNParsedResult.createIntent() = Intent( + Intent.ACTION_VIEW, Uri.parse("https://isbnsearch.org/isbn/${isbn}") +) + +fun ISBNParsedResult.createTextClassification(context: Context) = TextClassification.Builder() + .setText(isbn) + .setEntityType(TextClassifier.TYPE_OTHER, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_book, + R.string.qr_isbn_title, + R.string.qr_isbn_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/ImageProxy.kt b/app/src/main/java/net/sourceforge/opencamera/ext/ImageProxy.kt new file mode 100644 index 000000000..3b0d19456 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/ImageProxy.kt @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2022 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import androidx.camera.core.ImageProxy +import com.google.zxing.PlanarYUVLuminanceSource + +private fun rotateYUVLuminancePlane(data: ByteArray, width: Int, height: Int): ByteArray { + val yuv = ByteArray(width * height) + // Rotate the Y luma + var i = 0 + for (x in 0 until width) { + for (y in height - 1 downTo 0) { + yuv[i] = data[y * width + x] + i++ + } + } + return yuv +} + +internal val ImageProxy.planarYUVLuminanceSource: PlanarYUVLuminanceSource + get() { + val plane = planes[0] + val buffer = plane.buffer + var bytes = ByteArray(buffer.remaining()) + buffer.get(bytes) + + var width = width + var height = height + + if (imageInfo.rotationDegrees == 90 || imageInfo.rotationDegrees == 270) { + bytes = rotateYUVLuminancePlane(bytes, width, height) + width = height.also { height = width } + } + + return PlanarYUVLuminanceSource( + bytes, width, height, 0, 0, width, height, true + ) + } diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/Int.kt b/app/src/main/java/net/sourceforge/opencamera/ext/Int.kt new file mode 100644 index 000000000..e3e8d83ff --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/Int.kt @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2022 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.content.res.Resources.getSystem +import android.util.Range +import kotlin.math.roundToInt + +val Int.px + get() = (this * getSystem().displayMetrics.density).roundToInt() + +val Int.dp + get() = (this / getSystem().displayMetrics.density).roundToInt() + +internal fun Int.Companion.mapToRange(range: Range, percentage: Float): Int { + return (((range.upper - range.lower) * percentage) + range.lower).roundToInt() +} diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/ParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/ParsedResult.kt new file mode 100644 index 000000000..a35f89e48 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/ParsedResult.kt @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.content.Context +import com.google.zxing.client.result.AddressBookParsedResult +import com.google.zxing.client.result.CalendarParsedResult +import com.google.zxing.client.result.EmailAddressParsedResult +import com.google.zxing.client.result.GeoParsedResult +import com.google.zxing.client.result.ISBNParsedResult +import com.google.zxing.client.result.ParsedResult +import com.google.zxing.client.result.ProductParsedResult +import com.google.zxing.client.result.SMSParsedResult +import com.google.zxing.client.result.TelParsedResult +import com.google.zxing.client.result.TextParsedResult +import com.google.zxing.client.result.URIParsedResult +import com.google.zxing.client.result.VINParsedResult +import com.google.zxing.client.result.WifiParsedResult + +fun ParsedResult.createTextClassification(context: Context) = when (this) { + is AddressBookParsedResult -> createTextClassification(context) + + is CalendarParsedResult -> createTextClassification(context) + + is EmailAddressParsedResult -> createTextClassification(context) + + is GeoParsedResult -> createTextClassification(context) + + is ISBNParsedResult -> createTextClassification(context) + + is ProductParsedResult -> createTextClassification(context) + + is SMSParsedResult -> createTextClassification(context) + + is TelParsedResult -> createTextClassification(context) + + is TextParsedResult -> null // Try with the next methods + + is URIParsedResult -> null // We handle this manually + + is VINParsedResult -> createTextClassification(context) + + is WifiParsedResult -> createTextClassification(context) + + else -> null +} + diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/ProductParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/ProductParsedResult.kt new file mode 100644 index 000000000..4c43b9c40 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/ProductParsedResult.kt @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import com.google.zxing.client.result.ProductParsedResult +import net.sourceforge.opencamera.R + +fun ProductParsedResult.createIntent() = Intent( + Intent.ACTION_VIEW, Uri.parse("https://www.barcodelookup.com/${productID}") +) + +fun ProductParsedResult.createTextClassification(context: Context) = TextClassification.Builder() + .setText(productID) + .setEntityType(TextClassifier.TYPE_OTHER, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_shopping_cart, + R.string.qr_product_title, + R.string.qr_product_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/RemoteAction.kt b/app/src/main/java/net/sourceforge/opencamera/ext/RemoteAction.kt new file mode 100644 index 000000000..bc5101101 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/RemoteAction.kt @@ -0,0 +1,44 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.app.PendingIntent +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.graphics.drawable.Icon +import androidx.annotation.AttrRes +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.appcompat.content.res.AppCompatResources +import androidx.core.graphics.drawable.DrawableCompat +import androidx.core.graphics.drawable.toBitmap +import kotlin.reflect.KClass + +fun KClass.build( + context: Context, + @DrawableRes iconRes: Int, + @StringRes titleRes: Int, + @StringRes contentDescriptionRes: Int, + intent: Intent, + requestCode: Int = 0, + flags: Int = PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT, + @AttrRes iconTint: Int = com.google.android.material.R.attr.colorOnBackground, +) = RemoteAction( + Icon.createWithBitmap( + AppCompatResources.getDrawable(context, iconRes)?.let { + DrawableCompat.wrap(it.mutate()).apply { + DrawableCompat.setTint( + this, + context.getThemeColor(iconTint) + ) + } + }?.toBitmap() + ), + context.getString(titleRes), + context.getString(contentDescriptionRes), + PendingIntent.getActivity(context, requestCode, intent, flags) +) diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/SMSParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/SMSParsedResult.kt new file mode 100644 index 000000000..cdb2cfd5d --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/SMSParsedResult.kt @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import com.google.zxing.client.result.SMSParsedResult +import net.sourceforge.opencamera.R + +fun SMSParsedResult.createIntent() = Intent(Intent.ACTION_SENDTO, Uri.parse(smsuri)) + +fun SMSParsedResult.createTextClassification(context: Context) = TextClassification.Builder() + .setText(numbers.first()) + .setEntityType(TextClassifier.TYPE_OTHER, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_sms, + R.string.qr_sms_title, + R.string.qr_sms_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/TelParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/TelParsedResult.kt new file mode 100644 index 000000000..a2af666fe --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/TelParsedResult.kt @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import com.google.zxing.client.result.TelParsedResult +import net.sourceforge.opencamera.R + +fun TelParsedResult.createIntent() = Intent(Intent.ACTION_SENDTO, Uri.parse(telURI)) + +fun TelParsedResult.createTextClassification(context: Context) = TextClassification.Builder() + .setText(number) + .setEntityType(TextClassifier.TYPE_PHONE, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_phone, + R.string.qr_tel_title, + R.string.qr_tel_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/VINParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/VINParsedResult.kt new file mode 100644 index 000000000..a27c3aebd --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/VINParsedResult.kt @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import com.google.zxing.client.result.VINParsedResult +import net.sourceforge.opencamera.R + +fun VINParsedResult.createIntent() = Intent( + Intent.ACTION_VIEW, Uri.parse("https://www.vindecoderz.com/EN/check-lookup/${vin}") +) + +fun VINParsedResult.createTextClassification(context: Context) = TextClassification.Builder() + .setText(vin) + .setEntityType(TextClassifier.TYPE_OTHER, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_directions_car, + R.string.qr_vin_title, + R.string.qr_vin_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/ext/WifiParsedResult.kt b/app/src/main/java/net/sourceforge/opencamera/ext/WifiParsedResult.kt new file mode 100644 index 000000000..c523f3e88 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ext/WifiParsedResult.kt @@ -0,0 +1,66 @@ +/* + * SPDX-FileCopyrightText: 2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.ext + + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiNetworkSuggestion +import android.os.Build +import android.provider.Settings +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import androidx.annotation.RequiresApi +import com.google.zxing.client.result.WifiParsedResult +import net.sourceforge.opencamera.R + +@RequiresApi(Build.VERSION_CODES.R) +fun WifiParsedResult.createIntent() = Intent(Settings.ACTION_WIFI_ADD_NETWORKS).apply { + putExtra( + Settings.EXTRA_WIFI_NETWORK_LIST, + arrayListOf( + WifiNetworkSuggestion.Builder() + .setSsid(ssid) + .setIsHiddenSsid(isHidden) + .apply { + password?.let { + when (networkEncryption) { + "WPA" -> { + // Per specs, Wi-Fi QR codes are only used for + // WPA2 and WPA-Mixed networks, we can safely assume + // this networks supports WPA2 + setWpa2Passphrase(it) + } + + "SAE" -> { + setWpa3Passphrase(it) + } + } + } + } + .build() + ) + ) +} + +fun WifiParsedResult.createTextClassification(context: Context) = TextClassification.Builder() + .setText(ssid) + .setEntityType(TextClassifier.TYPE_OTHER, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_network_wifi, + R.string.qr_wifi_title, + R.string.qr_wifi_content_description, + createIntent() + ) + ) + } + } + .build() diff --git a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java index 96f9ba5dc..174e4cb79 100644 --- a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java +++ b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java @@ -101,6 +101,14 @@ import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; +import com.google.zxing.BinaryBitmap; +import com.google.zxing.LuminanceSource; +import com.google.zxing.MultiFormatReader; +import com.google.zxing.Reader; +import com.google.zxing.Result; +import com.google.zxing.common.HybridBinarizer; +import com.google.zxing.RGBLuminanceSource; + /** This class was originally named due to encapsulating the camera preview, * but in practice it's grown to more than this, and includes most of the * operation of the camera. It exists at a higher level than CameraController @@ -198,7 +206,15 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu private AsyncTask open_camera_task; // background task used for opening camera private CloseCameraTask close_camera_task; // background task used for closing camera private boolean has_permissions = true; // whether we have permissions necessary to operate the camera (camera, storage); assume true until we've been denied one of them - private boolean is_video; + public static enum FunctionalMode { + PHOTO, + VIDEO, + QRCODE + }; + private FunctionalMode functionalMode = FunctionalMode.PHOTO; + private boolean is_video() {return functionalMode == FunctionalMode.VIDEO;}; + private boolean is_qrcode() {return functionalMode == FunctionalMode.QRCODE;}; + private boolean is_photo() {return functionalMode == FunctionalMode.PHOTO;}; private volatile MediaRecorder video_recorder; // must be volatile for test project reading the state private volatile boolean video_start_time_set; // must be volatile for test project reading the state private long video_start_time; // system time when the video recording was started, or last resumed if it was paused @@ -690,14 +706,14 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( MyDebug.LOG ) Log.d(TAG, "handleSingleTouch"); - if( !this.is_video && this.isTakingPhotoOrOnTimer() ) { + if( !this.is_video() && this.isTakingPhotoOrOnTimer() ) { // if video, okay to refocus when recording return true; } // note, we always try to force start the preview (in case is_preview_paused has become false) // except if recording video (firstly, the preview should be running; secondly, we don't want to reset the phase!) - if( !this.is_video ) { + if( !this.is_video() ) { startCameraPreview(); } cancelAutoFocus(); @@ -795,7 +811,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu has_smooth_zoom = true; smooth_zoom = zoom_ratios.get(multitouch_start_zoom_factor)/100.0f; } - else { + else { has_multitouch_start_zoom_factor = false; multitouch_start_zoom_factor = 0; has_smooth_zoom = false; @@ -1106,6 +1122,38 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu @Override public void onSurfaceTextureUpdated(@NonNull SurfaceTexture arg0) { refreshPreviewBitmap(); + + if (isQRCode()) { + enablePreviewBitmap(); + TextureView textureView = (TextureView) this.cameraSurface; + Bitmap bitmap = textureView.getBitmap(preview_bitmap); + + if (bitmap!=null) { + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + int[] pixels = new int[width * height]; + bitmap.getPixels(pixels, 0, width, 0, 0, width, height); + + LuminanceSource source = new RGBLuminanceSource(width, height, pixels); + BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source)); + Reader reader = new MultiFormatReader(); + + try { + Result result = reader.decode(binaryBitmap); + String qrcodeContent = result.getText(); + MainActivity mActivity = (MainActivity) this.getContext(); + if (MyDebug.LOG) + Log.d(TAG, "Find QRCode qrcodeContent="+qrcodeContent ); + mActivity.qrImageAnalyzer.showQrDialog(result); + } catch (Exception e) { + // K1ZFP TODO Error 2 + } + } else { + // K1ZFP TODO Error 1 + } + } else { + disablePreviewBitmap(); + } } private void configureTransform() { @@ -1276,7 +1324,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } } if( due_to_max_filesize || remaining_restart_video > 0 ) { - if( is_video ) { + if( is_video() ) { String toast = null; if( !due_to_max_filesize ) toast = remaining_restart_video + " " + getContext().getResources().getString(R.string.repeats_to_go); @@ -1657,7 +1705,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu current_focus_index = -1; max_num_focus_areas = 0; applicationInterface.cameraInOperation(false, false); - if( is_video ) + if( is_video() ) applicationInterface.cameraInOperation(false, true); if( !this.has_surface ) { if( MyDebug.LOG ) { @@ -2037,7 +2085,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu saved_is_video = false; } // must switch video before setupCameraParameters(), and starting preview - if( saved_is_video != this.is_video ) { + if( saved_is_video != this.is_video() ) { if( MyDebug.LOG ) Log.d(TAG, "switch video mode as not in correct mode"); this.switchVideo(true, false); @@ -2088,7 +2136,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu updateFlashForVideo(); if( take_photo ) { - if( this.is_video ) { + if( this.is_video() ) { if( MyDebug.LOG ) Log.d(TAG, "switch to video for take_photo widget"); this.switchVideo(true, true); @@ -2097,8 +2145,8 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu // must be done after switching to video mode (so is_video is set correctly) if( MyDebug.LOG ) - Log.d(TAG, "is_video?: " + is_video); - if( this.is_video ) { + Log.d(TAG, "is_video?: " + is_video()); + if( this.is_video() ) { CameraController.TonemapProfile tonemap_profile = CameraController.TonemapProfile.TONEMAPPROFILE_OFF; if( supports_tonemap_curve ) { tonemap_profile = applicationInterface.getVideoTonemapProfile(); @@ -2117,7 +2165,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu // Setup for high speed - must be done after setupCameraParameters() and switching to video mode, but before setPreviewSize() and startCameraPreview(). // In theory it shouldn't matter if we call setVideoHighSpeed(true) if is_video==false, as it should only have an effect // when recording video; but don't set high speed mode in photo mode just to be safe. - camera_controller.setVideoHighSpeed(is_video && video_high_speed); + camera_controller.setVideoHighSpeed(is_video() && video_high_speed); if( do_startup_focus && using_android_l && camera_controller.supportsAutoFocus() ) { // need to switch flash off for autofocus - and for Android L, need to do this before starting preview (otherwise it won't work in time); for old camera API, need to do this after starting preview! @@ -2502,7 +2550,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu private void reportFaces(CameraController.Face[] local_faces) { // View.announceForAccessibility requires JELLY_BEAN if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN - ) { + ) { int n_faces = local_faces.length; FaceLocation face_location = FaceLocation.FACELOCATION_UNKNOWN; if( n_faces > 0 ) { @@ -2638,10 +2686,10 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu { if( MyDebug.LOG ) { Log.d(TAG, "set up video stabilization"); - Log.d(TAG, "is_video?: " + is_video); + Log.d(TAG, "is_video?: " + is_video()); } if( this.supports_video_stabilization ) { - boolean using_video_stabilization = is_video && applicationInterface.getVideoStabilizationPref(); + boolean using_video_stabilization = is_video() && applicationInterface.getVideoStabilizationPref(); if( MyDebug.LOG ) Log.d(TAG, "using_video_stabilization?: " + using_video_stabilization); camera_controller.setVideoStabilization(using_video_stabilization); @@ -3087,7 +3135,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( MyDebug.LOG ) Log.d(TAG, "check if we need high speed video for " + profile.videoFrameWidth + " x " + profile.videoFrameHeight + " at fps " + profile.videoCaptureRate); CameraController.Size best_video_size = video_quality_handler.findVideoSizeForFrameRate(profile.videoFrameWidth, profile.videoFrameHeight, profile.videoCaptureRate, false); - // n.b., we should pass videoCaptureRate and not videoFrameRate (as for slow motion, it's videoCaptureRate that will be high, not videoFrameRate) + // n.b., we should pass videoCaptureRate and not videoFrameRate (as for slow motion, it's videoCaptureRate that will be high, not videoFrameRate) if( best_video_size == null && fpsIsHighSpeed("" + profile.videoFrameRate) && video_quality_handler.getSupportedVideoSizesHighSpeed() != null ) { Log.e(TAG, "can't find match for capture rate: " + profile.videoCaptureRate + " and video size: " + profile.videoFrameWidth + " x " + profile.videoFrameHeight + " at fps " + profile.videoCaptureRate); @@ -3141,7 +3189,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu Log.d(TAG, "video_high_speed?: " + video_high_speed); } - if( is_video && video_high_speed && supports_iso_range && is_manual_iso ) { + if( is_video() && video_high_speed && supports_iso_range && is_manual_iso ) { if( MyDebug.LOG ) Log.d(TAG, "manual mode not supported for video_high_speed"); camera_controller.setManualISO(false, 0); @@ -3294,7 +3342,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } // first set picture size (for photo mode, must be done now so we can set the picture size from this; for video, doesn't really matter when we set it) CameraController.Size new_size; - if( this.is_video ) { + if( this.is_video() ) { // see comments for getOptimalVideoPictureSize() VideoProfile profile = getVideoProfile(); if( MyDebug.LOG ) @@ -3824,8 +3872,8 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu String preview_size = applicationInterface.getPreviewSizePref(); // should always use wysiwig for video mode, otherwise we get incorrect aspect ratio shown when recording video (at least on Galaxy Nexus, e.g., at 640x480) // also not using wysiwyg mode with video caused corruption on Samsung cameras (tested with Samsung S3, Android 4.3, front camera, infinity focus) - if( preview_size.equals("preference_preview_size_wysiwyg") || this.is_video ) { - if( this.is_video ) { + if( preview_size.equals("preference_preview_size_wysiwyg") || this.is_video() ) { + if( this.is_video() ) { if( MyDebug.LOG ) Log.d(TAG, "set preview aspect ratio from video size (wysiwyg)"); VideoProfile profile = getVideoProfile(); @@ -3883,7 +3931,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu final double ASPECT_TOLERANCE = 0.05; if( sizes == null ) return null; - if( is_video && video_high_speed ) { + if( is_video() && video_high_speed ) { VideoProfile profile = getVideoProfile(); if( MyDebug.LOG ) Log.d(TAG, "video size: " + profile.videoFrameWidth + " x " + profile.videoFrameHeight); @@ -4720,7 +4768,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu // (important not to return here however - still want to call // camera_controller.clearPreviewFpsRange() to clear a previously set fps) } - else if( this.is_video ) { + else if( this.is_video() ) { // For Nexus 5 and Nexus 6, we need to set the preview fps using matchPreviewFpsToVideo to avoid problem of dark preview in low light, as described above. // When the video recording starts, the preview automatically adjusts, but still good to avoid too-dark preview before the user starts recording. // However I'm wary of changing the behaviour for all devices at the moment, since some devices can be @@ -4791,23 +4839,31 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu Log.d(TAG, "camera not opened!"); return; } - if( !is_video && !supports_video ) { + if( !is_video() && !supports_video ) { if( MyDebug.LOG ) Log.d(TAG, "video not supported"); return; } - boolean old_is_video = is_video; - if( this.is_video ) { + + boolean old_is_video = is_video(); + boolean old_is_qrcode = is_qrcode(); + if( this.is_video() ) { if( video_recorder != null ) { stopVideo(false); } - this.is_video = false; - } - else { + this.functionalMode = FunctionalMode.QRCODE; + int qrcodeCamId = ((MainActivity)getContext()).getBetterQRCodeCameraID(); + if (qrcodeCamId >= 0) { + applicationInterface.setCameraIdPref(qrcodeCamId); + //userSwitchToCamera(qrcodeCamId, true); + } + } else if (this.is_qrcode()) { + this.functionalMode = FunctionalMode.PHOTO; + } else if (this.is_photo()) { if( this.isOnTimer() ) { cancelTimer(); ((MainActivity)getContext()).setDecorFitsSystemWindows(true); - this.is_video = true; + this.functionalMode = FunctionalMode.VIDEO; } else if( this.phase == PHASE_TAKING_PHOTO ) { // wait until photo taken @@ -4816,11 +4872,15 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } else { ((MainActivity)getContext()).setDecorFitsSystemWindows(true); - this.is_video = true; + this.functionalMode = FunctionalMode.VIDEO; } } - if( is_video != old_is_video ) { + if (is_qrcode() != old_is_qrcode) { + applicationInterface.setVideoPref(false); + this.reopenCamera(); + } + else if (is_video() != old_is_video) { setFocusPref(false); // first restore the saved focus for the new photo/video mode; don't do autofocus, as it'll be cancelled when restarting preview /*if( !is_video ) { // changing from video to photo mode @@ -4829,7 +4889,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( change_user_pref ) { // now save - applicationInterface.setVideoPref(is_video); + applicationInterface.setVideoPref(true); } if( !during_startup ) { // if during startup, updateFlashForVideo() needs to always be explicitly called anyway @@ -4856,7 +4916,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu // changing from photo to video mode setFocusPref(false); }*/ - if( is_video ) { + if( is_video() ) { if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && applicationInterface.getRecordAudioPref() ) { // check for audio permission now, rather than when user starts video recording // we restrict the checks to Android 6 or later just in case, see note in LocationSupplier.setupLocationListener() @@ -4884,7 +4944,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu private void setFocusPref(boolean auto_focus) { if( MyDebug.LOG ) Log.d(TAG, "setFocusPref()"); - String focus_value = applicationInterface.getFocusPref(is_video); + String focus_value = applicationInterface.getFocusPref(is_video()); if( focus_value.length() > 0 ) { if( MyDebug.LOG ) Log.d(TAG, "found existing focus_value: " + focus_value); @@ -4899,7 +4959,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu Log.d(TAG, "found no existing focus_value"); // here we set the default values for focus mode // note if updating default focus value for photo mode, also update MainActivityTest.setToDefault() - if( !updateFocus(is_video ? "focus_mode_continuous_video" : "focus_mode_continuous_picture", true, true, auto_focus) ) { + if( !updateFocus(is_video() ? "focus_mode_continuous_video" : "focus_mode_continuous_picture", true, true, auto_focus) ) { if( MyDebug.LOG ) Log.d(TAG, "continuous focus not supported, so fall back to first"); updateFocus(0, true, true, auto_focus); @@ -4918,12 +4978,12 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( MyDebug.LOG ) Log.d(TAG, "updateFocusForVideo()"); String old_focus_mode = null; - if( this.supported_focus_values != null && camera_controller != null && is_video ) { + if( this.supported_focus_values != null && camera_controller != null && is_video() ) { boolean focus_is_video = focusIsVideo(); if( MyDebug.LOG ) { - Log.d(TAG, "focus_is_video: " + focus_is_video + " , is_video: " + is_video); + Log.d(TAG, "focus_is_video: " + focus_is_video + " , is_video: " + is_video()); } - if( focus_is_video != is_video ) { + if( focus_is_video != is_video() ) { if( MyDebug.LOG ) Log.d(TAG, "need to change focus mode"); old_focus_mode = this.getCurrentFocusValue(); @@ -4940,7 +5000,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu private void updateFlashForVideo() { if( MyDebug.LOG ) Log.d(TAG, "updateFlashForVideo()"); - if( is_video ) { + if( is_video() ) { // check flash is not auto or on String current_flash = getCurrentFlashValue(); if( current_flash != null && !isFlashSupportedForVideo(current_flash) ) { @@ -5004,7 +5064,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu public void updateFlash(String flash_value) { if( MyDebug.LOG ) Log.d(TAG, "updateFlash(): " + flash_value); - if( this.phase == PHASE_TAKING_PHOTO && !is_video ) { + if( this.phase == PHASE_TAKING_PHOTO && !is_video() ) { // just to be safe - risk of cancelling the autofocus before taking a photo, or otherwise messing things up if( MyDebug.LOG ) Log.d(TAG, "currently taking a photo"); @@ -5045,7 +5105,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu // don't bother setting done to false as we shouldn't have two torches in a row... } - if( is_video ) { + if( is_video() ) { // check supported for video String new_flash_value = supported_flash_values.get(new_flash_index); if( !isFlashSupportedForVideo(new_flash_value) ) { @@ -5215,7 +5275,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( save ) { // now save - applicationInterface.setFocusPref(focus_value, is_video); + applicationInterface.setFocusPref(focus_value, is_video()); } } } @@ -5264,7 +5324,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu String focus_value = current_focus_index != -1 ? supported_focus_values.get(current_focus_index) : null; if( MyDebug.LOG ) Log.d(TAG, "focus_value is " + focus_value); - if( camera_controller != null && focus_value != null && focus_value.equals("focus_mode_continuous_picture") && !this.is_video ) { + if( camera_controller != null && focus_value != null && focus_value.equals("focus_mode_continuous_picture") && !this.is_video()) { if( MyDebug.LOG ) Log.d(TAG, "set continuous picture focus move callback"); camera_controller.setContinuousFocusMoveCallback(new CameraController.ContinuousFocusMoveCallback() { @@ -5348,7 +5408,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu this.phase = PHASE_NORMAL; return; } - if( is_video && continuous_fast_burst ) { + if( is_video() && continuous_fast_burst ) { Log.e(TAG, "continuous_fast_burst not supported for video mode"); this.phase = PHASE_NORMAL; return; @@ -5360,7 +5420,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } //if( !photo_snapshot && this.phase == PHASE_TAKING_PHOTO ) { //if( (is_video && is_video_recording && !photo_snapshot) || this.phase == PHASE_TAKING_PHOTO ) { - if( is_video && isVideoRecording() && !photo_snapshot ) { + if( is_video() && isVideoRecording() && !photo_snapshot ) { // user requested stop video if( !video_start_time_set || System.currentTimeMillis() - video_start_time < 500 ) { // if user presses to stop too quickly, we ignore @@ -5374,7 +5434,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } return; } - else if( ( !is_video || photo_snapshot ) && this.phase == PHASE_TAKING_PHOTO ) { + else if( ( !is_video() || photo_snapshot ) && this.phase == PHASE_TAKING_PHOTO ) { // user requested take photo while already taking photo if( MyDebug.LOG ) Log.d(TAG, "already taking a photo"); @@ -5382,14 +5442,14 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu cancelRepeat(); showToast(take_photo_toast, R.string.cancelled_repeat_mode, true); } - else if( !is_video && camera_controller.getBurstType() == CameraController.BurstType.BURSTTYPE_FOCUS && camera_controller.isCapturingBurst() ) { + else if( !is_video() && camera_controller.getBurstType() == CameraController.BurstType.BURSTTYPE_FOCUS && camera_controller.isCapturingBurst() ) { camera_controller.stopFocusBracketingBurst(); showToast(take_photo_toast, R.string.cancelled_focus_bracketing, true); } return; } - if( !is_video || photo_snapshot ) { + if( !is_video() || photo_snapshot ) { // check it's okay to take a photo if( !applicationInterface.canTakeNewPhoto() ) { if( MyDebug.LOG ) @@ -5673,7 +5733,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( MyDebug.LOG ) Log.d(TAG, "takePicture"); //this.thumbnail_anim = false; - if( !is_video || photo_snapshot ) + if( !is_video() || photo_snapshot ) this.phase = PHASE_TAKING_PHOTO; else { if( phase == PHASE_TIMER ) @@ -5688,7 +5748,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu Log.d(TAG, "camera not opened!"); this.phase = PHASE_NORMAL; applicationInterface.cameraInOperation(false, false); - if( is_video ) + if( is_video() ) applicationInterface.cameraInOperation(false, true); return; } @@ -5697,7 +5757,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu Log.d(TAG, "preview surface not yet available"); this.phase = PHASE_NORMAL; applicationInterface.cameraInOperation(false, false); - if( is_video ) + if( is_video() ) applicationInterface.cameraInOperation(false, true); return; } @@ -5713,17 +5773,17 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( MyDebug.LOG ) Log.d(TAG, "location data required, but not available"); showToast(null, R.string.location_not_available, true); - if( !is_video || photo_snapshot ) + if( !is_video() || photo_snapshot ) this.phase = PHASE_NORMAL; applicationInterface.cameraInOperation(false, false); - if( is_video ) + if( is_video() ) applicationInterface.cameraInOperation(false, true); return; } } } - if( is_video && !photo_snapshot ) { + if( is_video() && !photo_snapshot ) { if( MyDebug.LOG ) Log.d(TAG, "start video recording"); startVideoRecording(max_filesize_restart); @@ -6581,7 +6641,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu camera_controller.setRotation(getImageVideoRotation()); boolean enable_sound = applicationInterface.getShutterSoundPref(); - if( is_video && isVideoRecording() ) + if( is_video() && isVideoRecording() ) enable_sound = false; // always disable shutter sound if we're taking a photo while recording video if( MyDebug.LOG ) Log.d(TAG, "enable_sound? " + enable_sound); @@ -6685,7 +6745,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( MyDebug.LOG ) Log.d(TAG, "preview not yet started"); } - else if( !(manual && this.is_video) && (this.isVideoRecording() || this.isTakingPhotoOrOnTimer()) ) { + else if( !(manual && this.is_video()) && (this.isVideoRecording() || this.isTakingPhotoOrOnTimer()) ) { // if taking a video, we allow manual autofocuses // autofocus may cause problem if there is a video corruption problem, see testTakeVideoBitrate() on Nexus 7 at 30Mbs or 50Mbs, where the startup autofocus would cause a problem here if( MyDebug.LOG ) @@ -6696,7 +6756,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu // remove any previous request to switch back to continuous removePendingContinuousFocusReset(); } - if( manual && !is_video && camera_controller.focusIsContinuous() && supportedFocusValue("focus_mode_auto") ) { + if( manual && !is_video() && camera_controller.focusIsContinuous() && supportedFocusValue("focus_mode_auto") ) { if( MyDebug.LOG ) Log.d(TAG, "switch from continuous to autofocus mode for touch focus"); camera_controller.setFocusValue("focus_mode_auto"); // switch to autofocus @@ -6878,8 +6938,8 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu Log.d(TAG, "starting the camera preview"); { if( MyDebug.LOG ) - Log.d(TAG, "setRecordingHint: " + is_video); - camera_controller.setRecordingHint(this.is_video); + Log.d(TAG, "setRecordingHint: " + is_video()); + camera_controller.setRecordingHint(this.is_video()); } setPreviewFps(); try { @@ -7179,7 +7239,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu public boolean isVideoHighSpeed() { if( MyDebug.LOG ) Log.d(TAG, "isVideoHighSpeed"); - return is_video && video_high_speed; + return is_video() && video_high_speed; } public boolean canDisableShutterSound() { @@ -7437,8 +7497,8 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu /** Returns the horizontal angle of view in degrees (when unzoomed). */ public float getViewAngleX(boolean for_preview) { - if( MyDebug.LOG ) - Log.d(TAG, "getViewAngleX: " + for_preview); + if( MyDebug.LOG ) + Log.d(TAG, "getViewAngleX: " + for_preview); CameraController.Size size = for_preview ? this.getCurrentPreviewSize() : this.getCurrentPictureSize(); if( size == null ) { Log.e(TAG, "can't find view angle x size"); @@ -7471,8 +7531,8 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu /** Returns the vertical angle of view in degrees (when unzoomed). */ public float getViewAngleY(boolean for_preview) { - if( MyDebug.LOG ) - Log.d(TAG, "getViewAngleY: " + for_preview); + if( MyDebug.LOG ) + Log.d(TAG, "getViewAngleY: " + for_preview); CameraController.Size size = for_preview ? this.getCurrentPreviewSize() : this.getCurrentPictureSize(); if( size == null ) { Log.e(TAG, "can't find view angle y size"); @@ -8548,7 +8608,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } else { - result.new_histogram = computeHistogramRS(allocation_in, preview.rs, histogramScript, preview.histogram_type); + result.new_histogram = computeHistogramRS(allocation_in, preview.rs, histogramScript, preview.histogram_type); } if( MyDebug.LOG ) { @@ -8574,27 +8634,27 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } else { - Allocation output_allocation = Allocation.createFromBitmap(preview.rs, zebra_stripes_bitmap_buffer); - - histogramScript.set_zebra_stripes_threshold(preview.zebra_stripes_threshold); - histogramScript.set_zebra_stripes_foreground_r(Color.red(preview.zebra_stripes_color_foreground)); - histogramScript.set_zebra_stripes_foreground_g(Color.green(preview.zebra_stripes_color_foreground)); - histogramScript.set_zebra_stripes_foreground_b(Color.blue(preview.zebra_stripes_color_foreground)); - histogramScript.set_zebra_stripes_foreground_a(Color.alpha(preview.zebra_stripes_color_foreground)); - histogramScript.set_zebra_stripes_background_r(Color.red(preview.zebra_stripes_color_background)); - histogramScript.set_zebra_stripes_background_g(Color.green(preview.zebra_stripes_color_background)); - histogramScript.set_zebra_stripes_background_b(Color.blue(preview.zebra_stripes_color_background)); - histogramScript.set_zebra_stripes_background_a(Color.alpha(preview.zebra_stripes_color_background)); - histogramScript.set_zebra_stripes_width(zebra_stripes_width); + Allocation output_allocation = Allocation.createFromBitmap(preview.rs, zebra_stripes_bitmap_buffer); + + histogramScript.set_zebra_stripes_threshold(preview.zebra_stripes_threshold); + histogramScript.set_zebra_stripes_foreground_r(Color.red(preview.zebra_stripes_color_foreground)); + histogramScript.set_zebra_stripes_foreground_g(Color.green(preview.zebra_stripes_color_foreground)); + histogramScript.set_zebra_stripes_foreground_b(Color.blue(preview.zebra_stripes_color_foreground)); + histogramScript.set_zebra_stripes_foreground_a(Color.alpha(preview.zebra_stripes_color_foreground)); + histogramScript.set_zebra_stripes_background_r(Color.red(preview.zebra_stripes_color_background)); + histogramScript.set_zebra_stripes_background_g(Color.green(preview.zebra_stripes_color_background)); + histogramScript.set_zebra_stripes_background_b(Color.blue(preview.zebra_stripes_color_background)); + histogramScript.set_zebra_stripes_background_a(Color.alpha(preview.zebra_stripes_color_background)); + histogramScript.set_zebra_stripes_width(zebra_stripes_width); - if( MyDebug.LOG ) - Log.d(TAG, "time before histogramScript generate_zebra_stripes: " + (System.currentTimeMillis() - debug_time)); - histogramScript.forEach_generate_zebra_stripes(allocation_in, output_allocation); - if( MyDebug.LOG ) - Log.d(TAG, "time after histogramScript generate_zebra_stripes: " + (System.currentTimeMillis() - debug_time)); + if( MyDebug.LOG ) + Log.d(TAG, "time before histogramScript generate_zebra_stripes: " + (System.currentTimeMillis() - debug_time)); + histogramScript.forEach_generate_zebra_stripes(allocation_in, output_allocation); + if( MyDebug.LOG ) + Log.d(TAG, "time after histogramScript generate_zebra_stripes: " + (System.currentTimeMillis() - debug_time)); - output_allocation.copyTo(zebra_stripes_bitmap_buffer); - output_allocation.destroy(); + output_allocation.copyTo(zebra_stripes_bitmap_buffer); + output_allocation.destroy(); } // The original orientation of the bitmap we get from textureView.getBitmap() needs to be rotated to @@ -8653,29 +8713,29 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } else { - Allocation output_allocation = Allocation.createFromBitmap(preview.rs, focus_peaking_bitmap_buffer); + Allocation output_allocation = Allocation.createFromBitmap(preview.rs, focus_peaking_bitmap_buffer); - histogramScript.set_bitmap(allocation_in); + histogramScript.set_bitmap(allocation_in); - if( MyDebug.LOG ) - Log.d(TAG, "time before histogramScript generate_focus_peaking: " + (System.currentTimeMillis() - debug_time)); - histogramScript.forEach_generate_focus_peaking(allocation_in, output_allocation); - if( MyDebug.LOG ) - Log.d(TAG, "time after histogramScript generate_focus_peaking: " + (System.currentTimeMillis() - debug_time)); + if( MyDebug.LOG ) + Log.d(TAG, "time before histogramScript generate_focus_peaking: " + (System.currentTimeMillis() - debug_time)); + histogramScript.forEach_generate_focus_peaking(allocation_in, output_allocation); + if( MyDebug.LOG ) + Log.d(TAG, "time after histogramScript generate_focus_peaking: " + (System.currentTimeMillis() - debug_time)); - // median filter - Allocation filtered_allocation = Allocation.createTyped(preview.rs, Type.createXY(preview.rs, Element.RGBA_8888(preview.rs), focus_peaking_bitmap_buffer.getWidth(), focus_peaking_bitmap_buffer.getHeight())); - histogramScript.set_bitmap(output_allocation); - if( MyDebug.LOG ) - Log.d(TAG, "time before histogramScript generate_focus_peaking_filtered: " + (System.currentTimeMillis() - debug_time)); - histogramScript.forEach_generate_focus_peaking_filtered(output_allocation, filtered_allocation); - if( MyDebug.LOG ) - Log.d(TAG, "time after histogramScript generate_focus_peaking_filtered: " + (System.currentTimeMillis() - debug_time)); - output_allocation.destroy(); - output_allocation = filtered_allocation; + // median filter + Allocation filtered_allocation = Allocation.createTyped(preview.rs, Type.createXY(preview.rs, Element.RGBA_8888(preview.rs), focus_peaking_bitmap_buffer.getWidth(), focus_peaking_bitmap_buffer.getHeight())); + histogramScript.set_bitmap(output_allocation); + if( MyDebug.LOG ) + Log.d(TAG, "time before histogramScript generate_focus_peaking_filtered: " + (System.currentTimeMillis() - debug_time)); + histogramScript.forEach_generate_focus_peaking_filtered(output_allocation, filtered_allocation); + if( MyDebug.LOG ) + Log.d(TAG, "time after histogramScript generate_focus_peaking_filtered: " + (System.currentTimeMillis() - debug_time)); + output_allocation.destroy(); + output_allocation = filtered_allocation; - output_allocation.copyTo(focus_peaking_bitmap_buffer); - output_allocation.destroy(); + output_allocation.copyTo(focus_peaking_bitmap_buffer); + output_allocation.destroy(); } @@ -8809,10 +8869,18 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } } + public boolean isQRCode() { + return functionalMode == FunctionalMode.QRCODE; + } + /** Whether we are in video mode, or photo mode. */ public boolean isVideo() { - return is_video; + return functionalMode == FunctionalMode.VIDEO; + } + + public boolean isPhoto() { + return functionalMode == FunctionalMode.PHOTO; } public boolean isVideoRecording() { diff --git a/app/src/main/java/net/sourceforge/opencamera/qr/QrImageAnalyzer.kt b/app/src/main/java/net/sourceforge/opencamera/qr/QrImageAnalyzer.kt new file mode 100644 index 000000000..a9fde743a --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/qr/QrImageAnalyzer.kt @@ -0,0 +1,215 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.qr + +import android.app.Activity +import android.app.KeyguardManager +import android.app.PendingIntent +import android.content.ClipData +import android.content.ClipDescription +import android.content.ClipboardManager +import android.content.Intent +import android.content.pm.ActivityInfo +import android.os.Build +import android.text.method.LinkMovementMethod +import android.view.textclassifier.TextClassificationManager +import android.widget.ImageButton +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.content.res.AppCompatResources +import androidx.appcompat.widget.LinearLayoutCompat.LayoutParams +import androidx.cardview.widget.CardView +import androidx.core.graphics.drawable.DrawableCompat +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.button.MaterialButton +import com.google.zxing.MultiFormatReader +import com.google.zxing.Result +import net.sourceforge.opencamera.R +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import net.sourceforge.opencamera.ext.getThemeColor +import net.sourceforge.opencamera.ext.px +import kotlin.reflect.cast + +class QrImageAnalyzer(private val activity: Activity, private val scope: CoroutineScope) { + + // Views + private val bottomSheetDialog by lazy { + BottomSheetDialog(activity).apply { + setContentView(R.layout.qr_bottom_sheet_dialog) + } + } + + private val bottomSheetDialogCardView by lazy { + bottomSheetDialog.findViewById(R.id.cardView)!! + } + private val bottomSheetDialogTitle by lazy { + bottomSheetDialog.findViewById(R.id.title)!! + } + private val bottomSheetDialogData by lazy { + bottomSheetDialog.findViewById(R.id.data)!! + } + private val bottomSheetDialogIcon by lazy { + bottomSheetDialog.findViewById(R.id.icon)!! + } + private val bottomSheetDialogCopy by lazy { + bottomSheetDialog.findViewById(R.id.copy)!! + } + private val bottomSheetDialogShare by lazy { + bottomSheetDialog.findViewById(R.id.share)!! + } + private val bottomSheetDialogActionsLayout by lazy { + bottomSheetDialog.findViewById(R.id.actionsLayout)!! + } + + // System services + private val clipboardManager by lazy { activity.getSystemService(ClipboardManager::class.java) } + private val keyguardManager by lazy { activity.getSystemService(KeyguardManager::class.java) } + private val textClassificationManager by lazy { + activity.getSystemService(TextClassificationManager::class.java) + } + + // QR + private val reader by lazy { MultiFormatReader() } + + private val qrTextClassifier by lazy { + QrTextClassifier(activity, textClassificationManager.textClassifier) + } + + public fun showQrDialog(result: Result) { + scope.launch(Dispatchers.Main) { + if (bottomSheetDialog.isShowing) { + return@launch + } + + val text = result.text ?: return@launch + bottomSheetDialogData.text = text + + // Classify message + val textClassification = withContext(Dispatchers.IO) { + qrTextClassifier.classifyText(result) + } + + bottomSheetDialogData.text = textClassification.text + bottomSheetDialogActionsLayout.removeAllViews() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && + textClassification.actions.isNotEmpty() + ) { + with(textClassification.actions[0]) { + bottomSheetDialogCardView.setOnClickListener { + try { + actionIntent.send() + } catch (e: PendingIntent.CanceledException) { + Toast.makeText( + activity, + R.string.qr_no_app_available_for_action, + Toast.LENGTH_SHORT + ).show() + } + } + bottomSheetDialogCardView.contentDescription = contentDescription + bottomSheetDialogData.movementMethod = null + bottomSheetDialogTitle.text = title + bottomSheetDialogIcon.setImageIcon(icon) + } + for (action in textClassification.actions.drop(1)) { + bottomSheetDialogActionsLayout.addView(inflateButton().apply { + setOnClickListener { + try { + action.actionIntent.send() + } catch (e: PendingIntent.CanceledException) { + Toast.makeText( + activity, + R.string.qr_no_app_available_for_action, + Toast.LENGTH_SHORT + ).show() + } + } + contentDescription = action.contentDescription + this.text = action.title + withContext(Dispatchers.IO) { + val drawable = action.icon.loadDrawable(activity)!! + drawable.setBounds(0, 0, 15.px, 15.px) + withContext(Dispatchers.Main) { + setCompoundDrawables( + drawable, null, null, null + ) + } + } + }) + } + } else { + bottomSheetDialogCardView.setOnClickListener {} + bottomSheetDialogTitle.text = activity.resources.getText(R.string.qr_text) + bottomSheetDialogIcon.setImageDrawable(AppCompatResources.getDrawable( + activity, R.drawable.ic_text_snippet + )?.let { + DrawableCompat.wrap(it.mutate()).apply { + DrawableCompat.setTint( + this, activity.getThemeColor( + com.google.android.material.R.attr.colorOnBackground + ) + ) + } + }) + } + + // Make links clickable if not on locked keyguard + bottomSheetDialogData.movementMethod = + if (!keyguardManager.isKeyguardLocked) LinkMovementMethod.getInstance() + else null + + // Set buttons + bottomSheetDialogCopy.setOnClickListener { + clipboardManager.setPrimaryClip( + ClipData.newPlainText( + "", text + ) + ) + } + + bottomSheetDialogShare.setOnClickListener { + activity.startActivity( + Intent.createChooser( + Intent().apply { + action = Intent.ACTION_SEND + type = ClipDescription.MIMETYPE_TEXT_PLAIN + putExtra( + Intent.EXTRA_TEXT, result.text + ) + }, + activity.getString(R.string.abc_shareactionprovider_share_with) + ) + ) + } + + // Show dialog + activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + + bottomSheetDialog.show() + + bottomSheetDialog.setOnDismissListener { + activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + } + + } + } + + private fun inflateButton() = MaterialButton::class.cast( + activity.layoutInflater.inflate( + R.layout.qr_bottom_sheet_action_button, + bottomSheetDialogActionsLayout, + false + ) + ).apply { + layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) + } + +} diff --git a/app/src/main/java/net/sourceforge/opencamera/qr/QrTextClassifier.kt b/app/src/main/java/net/sourceforge/opencamera/qr/QrTextClassifier.kt new file mode 100644 index 000000000..7a4ffb63d --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/qr/QrTextClassifier.kt @@ -0,0 +1,101 @@ +/* + * SPDX-FileCopyrightText: 2023 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package net.sourceforge.opencamera.qr + +import android.app.RemoteAction +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.net.wifi.WifiManager +import android.os.Build +import android.os.LocaleList +import android.provider.Settings +import android.text.SpannableString +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import com.google.zxing.Result +import com.google.zxing.client.result.ResultParser +import com.google.zxing.client.result.URIParsedResult +import net.sourceforge.opencamera.R +import net.sourceforge.opencamera.ext.build +import net.sourceforge.opencamera.ext.createTextClassification +import kotlin.reflect.safeCast + +class QrTextClassifier( + private val context: Context, private val textClassifier: TextClassifier +) { + private val wifiManager by lazy { + runCatching { context.getSystemService(WifiManager::class.java) }.getOrNull() + } + + fun classifyText(result: Result): TextClassification { + // Try with ZXing parser + val parsedResult = ResultParser.parseResult(result) + parsedResult?.createTextClassification(context)?.let { + return it + } + + // We handle URIParsedResult here + val text = URIParsedResult::class.safeCast(parsedResult)?.uri ?: result.text + + // Try parsing it as a Uri + Uri.parse(text.toString()).let { uri -> + when (uri.scheme?.lowercase()) { + // Wi-Fi DPP + SCHEME_DPP -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && + wifiManager?.isEasyConnectSupported == true + ) { + return TextClassification.Builder() + .setText(context.getString(R.string.qr_dpp_description)) + .setEntityType(TextClassifier.TYPE_OTHER, 1.0f) + .addAction( + RemoteAction::class.build( + context, + R.drawable.ic_network_wifi, + R.string.qr_dpp_title, + R.string.qr_dpp_description, + Intent(Settings.ACTION_PROCESS_WIFI_EASY_CONNECT_URI).apply { + data = uri + } + ) + ) + .build() + } + + SCHEME_FIDO -> return TextClassification.Builder() + .setText(context.getString(R.string.qr_fido_content_description)) + .setEntityType(TextClassifier.TYPE_OTHER, 1.0f) + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAction( + RemoteAction::class.build( + context, + R.drawable.ic_passkey, + R.string.qr_fido_title, + R.string.qr_fido_content_description, + Intent(Intent.ACTION_VIEW).apply { + data = uri + } + ) + ) + } + } + .build() + } + } + + // Let Android classify it + val spannableString = SpannableString(text) + return textClassifier.classifyText( + spannableString, 0, spannableString.length, LocaleList.getDefault() + ) + } + + companion object { + private const val SCHEME_DPP = "dpp" + private const val SCHEME_FIDO = "fido" + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java index a68d80d18..18bd12661 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java @@ -1078,14 +1078,20 @@ public class MainUI { int resource; int content_description; int switch_video_content_description; + // The switch order is camera -> video -> qrcode -> camera... if( main_activity.getPreview().isVideo() ) { if( MyDebug.LOG ) Log.d(TAG, "set icon to video"); resource = main_activity.getPreview().isVideoRecording() ? R.drawable.take_video_recording : R.drawable.take_video_selector; content_description = main_activity.getPreview().isVideoRecording() ? R.string.stop_video : R.string.start_video; + switch_video_content_description = R.string.switch_to_qrcode; + } else if (main_activity.getPreview().isQRCode()) { + if (MyDebug.LOG) + Log.d(TAG, "set icon to qrcode"); + resource = R.drawable.empty; + content_description = 0; switch_video_content_description = R.string.switch_to_photo; - } - else if( main_activity.getApplicationInterface().getPhotoMode() == MyApplicationInterface.PhotoMode.Panorama && + } else if( main_activity.getApplicationInterface().getPhotoMode() == MyApplicationInterface.PhotoMode.Panorama && main_activity.getApplicationInterface().getGyroSensor().isRecording() ) { if( MyDebug.LOG ) Log.d(TAG, "set icon to recording panorama"); @@ -1093,7 +1099,7 @@ public class MainUI { content_description = R.string.finish_panorama; switch_video_content_description = R.string.switch_to_video; } - else { + else { // Camera case if( MyDebug.LOG ) Log.d(TAG, "set icon to photo"); resource = R.drawable.take_photo_selector; @@ -1101,14 +1107,33 @@ public class MainUI { switch_video_content_description = R.string.switch_to_video; } view.setImageResource(resource); - view.setContentDescription( main_activity.getResources().getString(content_description) ); + if (content_description==0) { + view.setContentDescription(""); + } else { + view.setContentDescription(main_activity.getResources().getString(content_description)); + } view.setTag(resource); // for testing view = main_activity.findViewById(R.id.switch_video); view.setContentDescription( main_activity.getResources().getString(switch_video_content_description) ); - resource = main_activity.getPreview().isVideo() ? R.drawable.take_photo : R.drawable.take_video; + if (main_activity.getPreview().isVideo()) { + resource = R.drawable.ic_switch_qrcode; + } else if (main_activity.getPreview().isQRCode()) { + resource = R.drawable.ic_photo_camera_white_48dp; + } else { // camera + resource = R.drawable.ic_videocam_white_48dp; + } view.setImageResource(resource); view.setTag(resource); // for testing + + // Hide/Show gallery & switch camera icons. + if (main_activity.getPreview().isQRCode()) { + main_activity.findViewById(R.id.gallery).setVisibility(View.INVISIBLE); + main_activity.findViewById(R.id.switch_camera).setVisibility(View.INVISIBLE); + } else { + main_activity.findViewById(R.id.gallery).setVisibility(View.VISIBLE); + main_activity.findViewById(R.id.switch_camera).setVisibility(View.VISIBLE); + } } } diff --git a/app/src/main/res/drawable/empty.xml b/app/src/main/res/drawable/empty.xml new file mode 100644 index 000000000..c886b6ada --- /dev/null +++ b/app/src/main/res/drawable/empty.xml @@ -0,0 +1,8 @@ + + + diff --git a/app/src/main/res/drawable/ic_book.xml b/app/src/main/res/drawable/ic_book.xml new file mode 100644 index 000000000..1c6d45296 --- /dev/null +++ b/app/src/main/res/drawable/ic_book.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_calendar_add_on.xml b/app/src/main/res/drawable/ic_calendar_add_on.xml new file mode 100644 index 000000000..d4cfef3e2 --- /dev/null +++ b/app/src/main/res/drawable/ic_calendar_add_on.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_contact_phone.xml b/app/src/main/res/drawable/ic_contact_phone.xml new file mode 100644 index 000000000..19d5ef77f --- /dev/null +++ b/app/src/main/res/drawable/ic_contact_phone.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_content_copy.xml b/app/src/main/res/drawable/ic_content_copy.xml new file mode 100644 index 000000000..66112fee7 --- /dev/null +++ b/app/src/main/res/drawable/ic_content_copy.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_directions_car.xml b/app/src/main/res/drawable/ic_directions_car.xml new file mode 100644 index 000000000..b39f53343 --- /dev/null +++ b/app/src/main/res/drawable/ic_directions_car.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_drag_handle.xml b/app/src/main/res/drawable/ic_drag_handle.xml new file mode 100644 index 000000000..602c9d3bc --- /dev/null +++ b/app/src/main/res/drawable/ic_drag_handle.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_email.xml b/app/src/main/res/drawable/ic_email.xml new file mode 100644 index 000000000..63a9bd89a --- /dev/null +++ b/app/src/main/res/drawable/ic_email.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_location_on.xml b/app/src/main/res/drawable/ic_location_on.xml new file mode 100644 index 000000000..f1db4bdbf --- /dev/null +++ b/app/src/main/res/drawable/ic_location_on.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_network_wifi.xml b/app/src/main/res/drawable/ic_network_wifi.xml new file mode 100644 index 000000000..6db18e1a0 --- /dev/null +++ b/app/src/main/res/drawable/ic_network_wifi.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_passkey.xml b/app/src/main/res/drawable/ic_passkey.xml new file mode 100644 index 000000000..b3c3dbb54 --- /dev/null +++ b/app/src/main/res/drawable/ic_passkey.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_phone.xml b/app/src/main/res/drawable/ic_phone.xml new file mode 100644 index 000000000..ae7ecad9c --- /dev/null +++ b/app/src/main/res/drawable/ic_phone.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_shopping_cart.xml b/app/src/main/res/drawable/ic_shopping_cart.xml new file mode 100644 index 000000000..3cd15b2b0 --- /dev/null +++ b/app/src/main/res/drawable/ic_shopping_cart.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_sms.xml b/app/src/main/res/drawable/ic_sms.xml new file mode 100644 index 000000000..b20d6f027 --- /dev/null +++ b/app/src/main/res/drawable/ic_sms.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_switch_qrcode.xml b/app/src/main/res/drawable/ic_switch_qrcode.xml new file mode 100644 index 000000000..8b31106f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_switch_qrcode.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_text_snippet.xml b/app/src/main/res/drawable/ic_text_snippet.xml new file mode 100644 index 000000000..137e2893e --- /dev/null +++ b/app/src/main/res/drawable/ic_text_snippet.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/drawable/qr_bottom_sheet_action_button_divider.xml b/app/src/main/res/drawable/qr_bottom_sheet_action_button_divider.xml new file mode 100644 index 000000000..06402726f --- /dev/null +++ b/app/src/main/res/drawable/qr_bottom_sheet_action_button_divider.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/layout/qr_bottom_sheet_action_button.xml b/app/src/main/res/layout/qr_bottom_sheet_action_button.xml new file mode 100644 index 000000000..6154163e1 --- /dev/null +++ b/app/src/main/res/layout/qr_bottom_sheet_action_button.xml @@ -0,0 +1,20 @@ + + + diff --git a/app/src/main/res/layout/qr_bottom_sheet_dialog.xml b/app/src/main/res/layout/qr_bottom_sheet_dialog.xml new file mode 100644 index 000000000..339cc0a32 --- /dev/null +++ b/app/src/main/res/layout/qr_bottom_sheet_dialog.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c1122937d..4b44a7232 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -461,4 +461,36 @@ Licence Informations sur la caméra Conditions d\'utilisation + + QR Code + Ajouter un contact + Ajouter un contact + Ajouter des évènements au calendrier + Ajouter cet évènement au calendrier + Ouvrir cette localisation + Ouvrir cette localisation + Envoyer un nouveau couriel + Composer un nouveau courriel pour les courriels spécifiés + Regarder cet ISBN + Recherchez cet ISBN sur isbnsearch.org + Rechercher un produit + Consulter le code-barres de l\'ID de ce produit + Envoyer un nouveau SMS + Envoyer un nouveau SMS aux destinataires spécifiés + Appeler le numéro de téléphone + Appeler le numéro de téléphone + Rechercher VIN + Recherche du numéro d\'identification du véhicule (VIN) + Se connecter à ce réseau Wi-Fi + Ajouter ce réseau Wi-Fi à la liste des réseaux connus et y connecter l\'appareil + Icône + Partager + Copier vers le presse papier + "Pas d'application disponible pour prendre en compte cette action " + Texte + Configurer cet appareil + Wi-Fi Easy Connect™ (DPP) + Manipuler ce code QR FIDO + Utiliser le mot de passe + Partager avec diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index af1ff9b20..d8ab2989c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,4 +6,11 @@ #2F9CF2 #40C4FF #F44336 + + + #FFFFFF + #E5000000 + #8BC34A + #3F51B5 + #CB000000 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 977672c4d..4c7d11362 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1106,4 +1106,35 @@ Terms of service LENS + QRCode + Add contact + Add contact + Add event to calendar + Add this event to the calendar + Open this location + Open this location + Send a new email + Compose a new email to the specified emails + Lookup this ISBN + Search this ISBN on isbnsearch.org + Lookup product + Lookup this product ID barcode + Send a new SMS + Send a new SMS to the specified recipients + Call phone number + Call the phone number + Lookup VIN + Lookup this Vehicle Identification Number (VIN) + Connect to this Wi-Fi network + Add this Wi-Fi network to the list of known networks and connect the device to it + Icon + Share + Copy to clipboard + No app available to handle this action + Text + Configure this device + Wi-Fi Easy Connect™ (DPP) + Handle this FIDO QR code + Use passkey + Share with -- GitLab From fc77f583f2cdc2c7573a981ad51859b48094136c Mon Sep 17 00:00:00 2001 From: Mohammed Althaf Thayyil Date: Wed, 24 Apr 2024 12:33:05 +0000 Subject: [PATCH 48/58] Add dedicated view for QR --- .../opencamera/preview/OverlayQRCodeView.java | 64 +++++++++++++++++++ .../opencamera/preview/Preview.java | 14 ++++ .../main/res/drawable/ic_switch_qrcode.xml | 44 +++++++++++-- app/src/main/res/drawable/scan_area.xml | 14 ++++ .../res/layout/qr_bottom_sheet_dialog.xml | 16 +++-- 5 files changed, 138 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/net/sourceforge/opencamera/preview/OverlayQRCodeView.java create mode 100644 app/src/main/res/drawable/scan_area.xml diff --git a/app/src/main/java/net/sourceforge/opencamera/preview/OverlayQRCodeView.java b/app/src/main/java/net/sourceforge/opencamera/preview/OverlayQRCodeView.java new file mode 100644 index 000000000..92d5f397f --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/preview/OverlayQRCodeView.java @@ -0,0 +1,64 @@ +/* + * Copyright MURENA SAS 2024 + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.sourceforge.opencamera.preview; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.util.DisplayMetrics; +import android.view.View; + +import androidx.core.content.ContextCompat; + +import foundation.e.camera.R; + +public class OverlayQRCodeView extends View { + private Drawable qrcode; + // Do not draw the additional resource if something goes wrong + private boolean isValid = true; + + public OverlayQRCodeView(Context context) { + super(context); + init(); + } + + private void init() { + qrcode = ContextCompat.getDrawable(this.getContext(), R.drawable.scan_area); + DisplayMetrics displayMetrics =this.getContext().getResources().getDisplayMetrics(); + final int screenWidth = displayMetrics.widthPixels; + final int screenHeight = displayMetrics.heightPixels; + + final int left = (screenWidth - qrcode.getIntrinsicWidth()) / 2; + final int top = (screenHeight - qrcode.getIntrinsicHeight()) / 2; + final int right = left + qrcode.getIntrinsicWidth(); + final int bottom = top + qrcode.getIntrinsicHeight(); + + if (left <= 0 || top <= 0 || right <= 0 || bottom <= 0) { + isValid = false; + } else { + qrcode.setBounds(left, top, right, bottom); + } + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (isValid) { + qrcode.draw(canvas); + } + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java index 174e4cb79..3835e80ab 100644 --- a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java +++ b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java @@ -53,6 +53,7 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; +import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; @@ -227,6 +228,8 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu * Important to call close() when the video recording is finished, to free up any resources * (e.g., supplied ParcelFileDescriptor). */ + + private OverlayQRCodeView overlayQRCodeView; private static class VideoFileInfo { private final ApplicationInterface.VideoMethod video_method; private final Uri video_uri; // for VideoMethod.SAF, VideoMethod.URI or VideoMethod.MEDIASTORE @@ -503,6 +506,8 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu if( canvasView != null ) { parent.addView(canvasView); } + + overlayQRCodeView = new OverlayQRCodeView(getContext()); } /*private void previewToCamera(float [] coords) { @@ -4852,6 +4857,9 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu stopVideo(false); } this.functionalMode = FunctionalMode.QRCODE; + final Activity activity = (Activity) Preview.this.getContext(); + final FrameLayout rootLayout = activity.findViewById(android.R.id.content); + rootLayout.addView(overlayQRCodeView); int qrcodeCamId = ((MainActivity)getContext()).getBetterQRCodeCameraID(); if (qrcodeCamId >= 0) { applicationInterface.setCameraIdPref(qrcodeCamId); @@ -4859,6 +4867,11 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } } else if (this.is_qrcode()) { this.functionalMode = FunctionalMode.PHOTO; + final Activity activity = (Activity) Preview.this.getContext(); + final FrameLayout rootLayout = activity.findViewById(android.R.id.content); + if (overlayQRCodeView.getParent() != null) { + rootLayout.removeView(overlayQRCodeView); + } } else if (this.is_photo()) { if( this.isOnTimer() ) { cancelTimer(); @@ -4874,6 +4887,7 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu ((MainActivity)getContext()).setDecorFitsSystemWindows(true); this.functionalMode = FunctionalMode.VIDEO; } + // nothing to do for overlayQRCodeView in this mode } if (is_qrcode() != old_is_qrcode) { diff --git a/app/src/main/res/drawable/ic_switch_qrcode.xml b/app/src/main/res/drawable/ic_switch_qrcode.xml index 8b31106f9..6fa827cf0 100644 --- a/app/src/main/res/drawable/ic_switch_qrcode.xml +++ b/app/src/main/res/drawable/ic_switch_qrcode.xml @@ -1,17 +1,47 @@ + android:width="36dp" + android:height="36dp" + android:viewportWidth="36" + android:viewportHeight="36"> + android:pathData="M0,0h36v36h-36z"/> + + + + + + + + + + diff --git a/app/src/main/res/drawable/scan_area.xml b/app/src/main/res/drawable/scan_area.xml new file mode 100644 index 000000000..2486da080 --- /dev/null +++ b/app/src/main/res/drawable/scan_area.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/layout/qr_bottom_sheet_dialog.xml b/app/src/main/res/layout/qr_bottom_sheet_dialog.xml index 339cc0a32..947068f91 100644 --- a/app/src/main/res/layout/qr_bottom_sheet_dialog.xml +++ b/app/src/main/res/layout/qr_bottom_sheet_dialog.xml @@ -27,7 +27,7 @@ + tools:text="URL" + android:breakStrategy="high_quality" /> Date: Tue, 23 Apr 2024 11:56:53 +0530 Subject: [PATCH 49/58] Camera: add qr scanner activity --- app/src/main/AndroidManifest.xml | 12 +++++++ .../opencamera/preview/OverlayQRCodeView.java | 2 +- .../opencamera/preview/Preview.java | 32 ++++++++++--------- .../opencamera/qr/QrScannerActivity.kt | 11 +++++++ 4 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/net/sourceforge/opencamera/qr/QrScannerActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ad9a752c5..39c00ccfb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -99,6 +99,18 @@ android:exported="false" > + + + + = 0) { - applicationInterface.setCameraIdPref(qrcodeCamId); - //userSwitchToCamera(qrcodeCamId, true); - } + setQRCode(true); } else if (this.is_qrcode()) { this.functionalMode = FunctionalMode.PHOTO; - final Activity activity = (Activity) Preview.this.getContext(); - final FrameLayout rootLayout = activity.findViewById(android.R.id.content); - if (overlayQRCodeView.getParent() != null) { - rootLayout.removeView(overlayQRCodeView); - } + setQRCode(false); } else if (this.is_photo()) { if( this.isOnTimer() ) { cancelTimer(); @@ -8883,6 +8870,21 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu } } + public void setQRCode(boolean enabled) { + final Activity activity = (Activity) Preview.this.getContext(); + final FrameLayout rootLayout = activity.findViewById(android.R.id.content); + if (enabled) { + this.functionalMode = FunctionalMode.QRCODE; + rootLayout.addView(overlayQRCodeView); + int qrcodeCamId = ((MainActivity)getContext()).getBetterQRCodeCameraID(); + if (qrcodeCamId >= 0) { + applicationInterface.setCameraIdPref(qrcodeCamId); + } + } else if (overlayQRCodeView.getParent() != null) { + rootLayout.removeView(overlayQRCodeView); + } + } + public boolean isQRCode() { return functionalMode == FunctionalMode.QRCODE; } diff --git a/app/src/main/java/net/sourceforge/opencamera/qr/QrScannerActivity.kt b/app/src/main/java/net/sourceforge/opencamera/qr/QrScannerActivity.kt new file mode 100644 index 000000000..94a501b74 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/qr/QrScannerActivity.kt @@ -0,0 +1,11 @@ +package net.sourceforge.opencamera.qr + +import android.os.Bundle +import net.sourceforge.opencamera.MainActivity + +class QrScannerActivity : MainActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + preview.setQRCode(true) + } +} -- GitLab From 4015c286dfd653e4bdf295c4f309a2a065cf00a7 Mon Sep 17 00:00:00 2001 From: frankpreel Date: Thu, 16 May 2024 08:51:54 +0200 Subject: [PATCH 50/58] Analyze only QRCode --- .../java/net/sourceforge/opencamera/preview/Preview.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java index a6a1b9376..78fcee290 100644 --- a/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java +++ b/app/src/main/java/net/sourceforge/opencamera/preview/Preview.java @@ -101,6 +101,7 @@ import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; +import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; @@ -1148,7 +1149,9 @@ public class Preview implements SurfaceHolder.Callback, TextureView.SurfaceTextu MainActivity mActivity = (MainActivity) this.getContext(); if (MyDebug.LOG) Log.d(TAG, "Find QRCode qrcodeContent="+qrcodeContent ); - mActivity.qrImageAnalyzer.showQrDialog(result); + if (result.getBarcodeFormat() == BarcodeFormat.QR_CODE) { + mActivity.qrImageAnalyzer.showQrDialog(result); + } } catch (Exception e) { // K1ZFP TODO Error 2 } -- GitLab From dbd8d1bbdbafbfd57a717c167f44c9f1e7f72f43 Mon Sep 17 00:00:00 2001 From: Rohit Sekhar Date: Thu, 22 Aug 2024 13:05:21 +0530 Subject: [PATCH 51/58] CameraController2: Expose QCFA Dimension for Fairphone * This patch exposes the non Pixel binned 48 MP / 50 MP modes on FP4/FP5. * This patch is generic & could be extended to any other applicable qcom device, but with the existing camera app logic, the default resolution would be the non pixel binned one, which is not a sane default. * FP4/FP5 override default resolution with config_e_os_camera_default_resolution_lens. --- .../cameracontroller/CameraController2.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java index fe3491d3b..d0abeb0b0 100644 --- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java +++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java @@ -80,7 +80,7 @@ public class CameraController2 extends CameraController { private CameraDevice camera; private final String cameraIdS; - private final boolean is_fairphone_4; + private final boolean is_fairphone; private final boolean is_samsung; private final boolean is_samsung_s7; // Galaxy S7 or Galaxy S7 Edge private final boolean is_samsung_galaxy_s; @@ -2061,12 +2061,12 @@ public class CameraController2 extends CameraController { this.camera_error_cb = camera_error_cb; //this.is_oneplus = Build.MANUFACTURER.toLowerCase(Locale.US).contains("oneplus"); - this.is_fairphone_4 = Build.MODEL.toLowerCase(Locale.US).contains("fp4"); + this.is_fairphone = Build.MANUFACTURER.toLowerCase(Locale.US).contains("fairphone"); this.is_samsung = Build.MANUFACTURER.toLowerCase(Locale.US).contains("samsung"); this.is_samsung_s7 = Build.MODEL.toLowerCase(Locale.US).contains("sm-g93"); this.is_samsung_galaxy_s = is_samsung && Build.MODEL.toLowerCase(Locale.US).contains("sm-g"); if( MyDebug.LOG ) { - Log.d(TAG, "is_fairphone_4: " + is_fairphone_4); + Log.d(TAG, "is_fairphone: " + is_fairphone); Log.d(TAG, "is_samsung: " + is_samsung); Log.d(TAG, "is_samsung_s7: " + is_samsung_s7); Log.d(TAG, "is_samsung_galaxy_s: " + is_samsung_galaxy_s); @@ -2915,24 +2915,23 @@ public class CameraController2 extends CameraController { } } - if (is_fairphone_4 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - CameraCharacteristics.Key fairphoneAvailableStreamConfigurations = - new CameraCharacteristics.Key<>("fp.scaler.availableStreamConfigurations", int[].class); - int[] fpStreamConfigs = characteristics.get(fairphoneAvailableStreamConfigurations); - - for (int i = 0; i < fpStreamConfigs.length / 4; i++) { - int width = fpStreamConfigs[i * 4 + 1]; - int height = fpStreamConfigs[i * 4 + 2]; - int output = fpStreamConfigs[i * 4 + 3]; - - if (output != 0) { - Size size = new Size(width, height); - if (!camera_features.picture_sizes.contains(size)) { + if(is_fairphone && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + CameraCharacteristics.Key qcfaDimensionKey = + new CameraCharacteristics.Key<>("org.codeaurora.qcamera3.quadra_cfa.qcfa_dimension", int[].class); + try { + int[] qcfaDimension = characteristics.get(qcfaDimensionKey); + if (qcfaDimension != null && qcfaDimension.length == 2) { + int qcfaWidth = qcfaDimension[0]; + int qcfaHeight = qcfaDimension[1]; + Size qcfaSize = new Size(qcfaWidth, qcfaHeight); + if (!camera_features.picture_sizes.contains(qcfaSize)) { if (MyDebug.LOG) - Log.d(TAG, "custom scaler size: " + height + " x " + width); - camera_features.picture_sizes.add(size); + Log.d(TAG, "Adding QCFA size: " + qcfaWidth + " x " + qcfaHeight); + camera_features.picture_sizes.add(qcfaSize); } } + } catch (IllegalArgumentException e) { + e.printStackTrace(); } } -- GitLab From 3f7406d4c1e73ddad37a8378c273487499c7ad7a Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 23 Aug 2024 17:51:51 +0530 Subject: [PATCH 52/58] camera: Improve camera UX for murena two --- app/src/main/AndroidManifest.xml | 1 + .../opencamera/DeviceSettings.java | 4 +++ .../sourceforge/opencamera/MainActivity.java | 28 +++++++++++++++++++ .../opencamera/MyApplicationInterface.java | 1 + .../net/sourceforge/opencamera/Utils.java | 19 +++++++++++++ .../opencamera/ui/DrawPreview.java | 14 +++++++++- app/src/main/res/values/strings.xml | 6 ++++ 7 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/net/sourceforge/opencamera/Utils.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 39c00ccfb..2ae6ec27e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,7 @@ diff --git a/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java b/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java index ed6011b1c..b76e9fcb3 100644 --- a/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java +++ b/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java @@ -38,4 +38,8 @@ public class DeviceSettings { final boolean isOne = Build.DEVICE.equals("one") || Build.DEVICE.equals("X2"); return isMurena && isOne; } + + public static boolean isMurenaTwo() { + return Build.DEVICE.toLowerCase(Locale.US).contains("two"); + } } diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index a285960f2..2e4702a8e 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -30,6 +30,7 @@ import java.util.Hashtable; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -188,6 +189,11 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen public static volatile boolean test_preview_want_no_limits; // test flag, if set to true then instead use test_preview_want_no_limits_value; needs to be static, as it needs to be set before activity is created to take effect public static volatile boolean test_preview_want_no_limits_value; + private boolean murenaTwoHwKill = false; + + private Handler handler; + private Runnable retryRunnable = null; + // whether this is a multi-camera device (note, this isn't simply having more than 1 camera, but also having more than one with the same facing) // note that in most cases, code should check the MultiCamButtonPreferenceKey preference as well as the is_multi_cam flag, // this can be done via isMultiCamEnabled(). @@ -359,6 +365,8 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen magneticSensor = new MagneticSensor(this); //speechControl = new SpeechControl(this); + handler = new Handler(); + // determine whether we support Camera2 API // must be done before setDeviceDefaults() initCamera2Support(); @@ -1625,6 +1633,26 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen else { mainUI.onKeyUp(keyCode, event); } + + if (!camera_in_background && keyCode == 131 && DeviceSettings.isMurenaTwo()) { + String cameraState = Utils.getProperty("persist.sys.hwswitch.state", null); + if (cameraState == null) return super.onKeyUp(keyCode, event); + + if (retryRunnable != null) { + handler.removeCallbacks(retryRunnable); + } + + murenaTwoHwKill = Objects.equals(cameraState, "1"); + retryRunnable = () -> { + if (!murenaTwoHwKill) { + preview.retryOpenCamera(); + } else { + restartOpenCamera(); + } + }; + handler.postDelayed(retryRunnable, murenaTwoHwKill ? 200 : 5000); + } + return super.onKeyUp(keyCode, event); } diff --git a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java index e0c997e5b..69c0b5de7 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java +++ b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java @@ -2639,6 +2639,7 @@ public class MyApplicationInterface extends BasicApplicationInterface { @Override public void onCameraError() { + if (DeviceSettings.isMurenaTwo()) return; main_activity.getPreview().showToast(null, R.string.camera_error); } diff --git a/app/src/main/java/net/sourceforge/opencamera/Utils.java b/app/src/main/java/net/sourceforge/opencamera/Utils.java new file mode 100644 index 000000000..761e8e0d8 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/Utils.java @@ -0,0 +1,19 @@ +package net.sourceforge.opencamera; + +import android.os.Build; + +import java.lang.reflect.Method; +import java.util.Locale; + +public class Utils { + public static String getProperty(String key, String defaultValue) { + try { + Class systemProperties = Class.forName("android.os.SystemProperties"); + Method get = systemProperties.getMethod("get", String.class, String.class); + return (String) get.invoke(null, key, defaultValue); + } catch (Exception e) { + e.printStackTrace(); + return defaultValue; + } + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java index 69392e972..0f70450a6 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java @@ -8,10 +8,12 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import net.sourceforge.opencamera.DeviceSettings; import net.sourceforge.opencamera.GyroSensor; import net.sourceforge.opencamera.ImageSaver; import net.sourceforge.opencamera.LocationSupplier; @@ -19,6 +21,7 @@ import net.sourceforge.opencamera.MainActivity; import net.sourceforge.opencamera.MyApplicationInterface; import net.sourceforge.opencamera.MyDebug; import net.sourceforge.opencamera.PreferenceKeys; +import net.sourceforge.opencamera.Utils; import net.sourceforge.opencamera.preview.ApplicationInterface; import net.sourceforge.opencamera.R; import net.sourceforge.opencamera.cameracontroller.CameraController; @@ -2119,7 +2122,16 @@ public class DrawPreview { p.setTextAlign(Paint.Align.CENTER); int pixels_offset = (int) (20 * scale_font + 0.5f); // convert dps to pixels if( preview.hasPermissions() ) { - if( preview.openCameraFailed() ) { + String cameraState = Utils.getProperty("persist.sys.hwswitch.state", null); + if (cameraState != null && DeviceSettings.isMurenaTwo() && preview.openCameraFailed()) { + boolean enabled = Objects.equals(cameraState, "1"); + int text1 = enabled ? R.string.failed_to_open_camera_two_1_disabled : R.string.failed_to_open_camera_two_1_enabled; + int text2 = enabled ? R.string.failed_to_open_camera_two_2_disabled : R.string.failed_to_open_camera_two_2_enabled; + canvas.drawText(getContext().getResources().getString(text1), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f, p); + canvas.drawText(getContext().getResources().getString(text2), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f + pixels_offset, p); + } + + if ( !DeviceSettings.isMurenaTwo() && preview.openCameraFailed() ) { canvas.drawText(getContext().getResources().getString(R.string.failed_to_open_camera_1), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f, p); canvas.drawText(getContext().getResources().getString(R.string.failed_to_open_camera_2), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f + pixels_offset, p); canvas.drawText(getContext().getResources().getString(R.string.failed_to_open_camera_3), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f + 2 * pixels_offset, p); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4c7d11362..274257cc1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1137,4 +1137,10 @@ Handle this FIDO QR code Use passkey Share with + + "YOUR PRIVACY SWITCH MUST BE ACTIVATED" + "AS THE CAMERA IS NOT AVAILABLE ;-)" + + "PLEASE WAIT 5 SECONDS FOR YOUR CAMERA" + "TO LOAD AS IT'S JUST BEEN ENABLED" -- GitLab From 8014f59cc33448153040528462e3fe2c72f186f2 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 5 Sep 2024 22:10:45 +0530 Subject: [PATCH 53/58] camera: Import e translations --- app/src/main/res/values-az/strings.xml | 15 +- app/src/main/res/values-be/strings.xml | 16 +- app/src/main/res/values-cs/strings.xml | 15 +- app/src/main/res/values-de/strings.xml | 431 +++++---- app/src/main/res/values-el/strings.xml | 7 +- app/src/main/res/values-es/strings.xml | 619 +++++++++---- app/src/main/res/values-eu/strings.xml | 601 +++++++++++++ app/src/main/res/values-fr/strings.xml | 944 +++++++++++++++----- app/src/main/res/values-gd/strings.xml | 897 +++++++++++++++++++ app/src/main/res/values-gl/strings.xml | 897 +++++++++++++++++++ app/src/main/res/values-hu/strings.xml | 129 +-- app/src/main/res/values-is/strings.xml | 967 +++++++++++++++++++++ app/src/main/res/values-it/strings.xml | 406 ++++----- app/src/main/res/values-ja/strings.xml | 460 +++++----- app/src/main/res/values-ko/strings.xml | 14 +- app/src/main/res/values-nb/strings.xml | 343 ++++---- app/src/main/res/values-nl/strings.xml | 838 ++++++++++++++++++ app/src/main/res/values-pl/strings.xml | 13 +- app/src/main/res/values-pt-rBR/strings.xml | 14 +- app/src/main/res/values-pt-rPT/strings.xml | 17 +- app/src/main/res/values-ro/strings.xml | 2 + app/src/main/res/values-ru/strings.xml | 399 ++++----- app/src/main/res/values-sl/strings.xml | 41 +- app/src/main/res/values-sv/strings.xml | 960 ++++++++++++++++++++ app/src/main/res/values-tr/strings.xml | 146 ++-- app/src/main/res/values-uk/strings.xml | 171 +--- app/src/main/res/values-vi/strings.xml | 17 +- app/src/main/res/values-zh-rCN/strings.xml | 79 +- app/src/main/res/values-zh-rTW/strings.xml | 11 +- app/src/main/res/values/strings.xml | 61 +- 30 files changed, 7565 insertions(+), 1965 deletions(-) create mode 100644 app/src/main/res/values-eu/strings.xml create mode 100644 app/src/main/res/values-gd/strings.xml create mode 100644 app/src/main/res/values-gl/strings.xml create mode 100644 app/src/main/res/values-is/strings.xml create mode 100644 app/src/main/res/values-nl/strings.xml create mode 100644 app/src/main/res/values-ro/strings.xml create mode 100644 app/src/main/res/values-sv/strings.xml diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 17b8aa81a..8aa42b6e5 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -317,17 +317,18 @@ Sol əllə işləyənlər üçün Sağ əllə işləyənlər üçün - - Bağla - Hərəkət düyməsini gizlə - GUI gizlə - Hamısını gizlə - + About Quraşdırma versiyası - Kamera OpenCamera-dan çəngəldir + Kamera Camera-dan çəngəldir Müəlliflər Mənbə kodu Lisenziyası Kamera məlumatları Xidmət şərtləri + + Bağla + Hərəkət düyməsini gizlə + GUI gizlə + Hamısını gizlə + diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 3bb41158f..d2cccf7a5 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -200,7 +200,7 @@ Крыніца гуку Мікрафон падчас запісу аўдыё\n%s Аўдыяканалы - Мона або стэрэа падчас запісу аўдыё (стэрэа падтрымліваецца толькі на некаторых прыладах)\n%s + Мона або стэрэа падчас запісу аўдыё (стэрэа падтрымліваецца толькі на некаторых прыладах) Выьліск падчас запісу відэа Калі ўключана, то можна будзе ўкл / выкл выбліск падчас запісу відэа @@ -362,17 +362,17 @@ Тэкст з ценем Звычайны тэкст - - Выключана - Хаваць віртуальныя кнопкі навігацыі на экране - Хаваць GUI - Хаваць усе - + About Зборка версіі - Камера раздвоеная ад OpenCamera + Камера раздвоеная ад Camera Аўтары Зыходны код Ліцэнзія Інфармацыя пра камеру Умовы прадастаўлення паслуг + + Выключана + Хаваць віртуальныя кнопкі навігацыі на экране + Хаваць GUI + Хаваць усе diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 2632c59d3..4442ce29f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -204,7 +204,7 @@ Zdroj zvuku Mikrofon používaný při natáčení videa\n%s Kanály zvuku - Nastavit mono nebo stereo pro nahrávání zvuku (stereo je podporováno jen na některých zařízeních)\n%s + Nastavit mono nebo stereo pro nahrávání zvuku (stereo je podporováno jen na některých zařízeních) Blikat při nahrávání videa Při zapnutí bude přisvětlovací dioda blikat při nahrávání videa (umožňuje z dálky určit, zda-li fotoaparát nahrává) @@ -366,18 +366,17 @@ Vystínovaný text Prostý text - - Vypnuto - Skrýt pouze virtuální navigační tlačítka - Skrýt grafické rozhraní - Skrýt vše - About Sestavte verzi - Kamera je vidlice z OpenCamera + Kamera je vidlice z Camera Autor Zdrojový kód Licence Informace o kameře Podmínky služby + + Vypnuto + Skrýt pouze virtuální navigační tlačítka + Skrýt grafické rozhraní + Skrýt vše diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d7c58644d..61dfae62f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,24 +1,26 @@ - - Camera + Kamera + Einstellungen Popup-Einstellungen OK (Diese Nachricht wird nicht wieder angezeigt.) - - Ein - Aus - + An + + Aus + Speicherort auswählen: Ordnerhistorie löschen Ordnerhistorie löschen? Bitte wählen Sie einen anderen Ordner Speicherort geändert nach: Videoaufnahme angehalten - Wiederholungen ausbleibend + Wiederholungen ausbleibend + Verbindung mit der Kamera fehlgeschlagen Fehler, die Video-Datei könnte beschädigt sein - wird von Ihrem Gerät nicht unterstützt + wird von Ihrem Gerät nicht unterstützt + Unbekannter Fehler, Videoaufnahme angehalten Server abgestürzt, Video angehalten Video hat die Maximaldauer erreicht @@ -57,7 +59,6 @@ Farbeffekt Szenenmodus Weißabgleich - Winkel Richtung FEHLER BEIM ÖFFNEN DER KAMERA. @@ -68,10 +69,9 @@ Frei [GESPERRT: Zum Entsperren wischen] - Fehler beim Stempeln des Fotos - m - + m + Kameraeffekte Bildlagekorrektur Die Aufnahme wird automatisch waagerecht ausgerichtet (nur bei Fotos, Aufnahme dauert länger und kann bei kleinem Gerätespeicher fehlschlagen) @@ -89,7 +89,6 @@ Wenn aktiviert, wird die Lage des Gerätes ignoriert und die Orientierung der Aufnahme auf diesen Wert fest eingestellt\n%s Gesichtserkennung Stellt die Schärfe auf die Gesichter ein - Kamera-Einstellungen Timer Timer-Signalton @@ -100,7 +99,7 @@ Serienbild-Intervall Mehr Kamera-Einstellungen… Aufnahme bei Berührung - Fotoaufnahme durch Berührung oder Doppelklick der Vorschau starten + Aufnahme eines Fotos oder Videos durch Tippen oder Doppelklicken auf die Vorschau Pause nach der Fotoaufnahme Nach der Aufnahme pausieren mit der Möglichkeit, das Foto zu teilen oder zu löschen Auslöseton @@ -111,7 +110,7 @@ Mikroempfindlichkeit für lautes Geräusch Speicherort Ordner, wo die Fotos/Videos gespeichert werden - Für das Speichern der Fotos/Videos Storage Access Framework verwenden + Für das Speichern der Fotos/Videos Storage Access Framework verwenden. Dies sollte aktiviert werden, um das Speichern auf externen SD-Karten zu ermöglichen. Bei Android 10 und höher muss dies Option aktiviert werden, wenn in einem Ordner außerhalb DCIM gespeichert werden soll. Foto-Präfix Den Präfix für die Dateinamen der Fotos einstellen Video-Präfix @@ -120,7 +119,7 @@ Kamera trotz Sperre anzeigen Wenn aktiviert, wird Camera über dem Sperrbildschirm stehen (das Entsperren ist jedoch für den Zugriff auf Einstellungen, Galerie usw. nötig) Verwende Auto-Fokus bei Start der App - Beim Start von Camera automatisch fokussieren. Deaktiviere diese Option bei einem Problem mit dem Blitz. + Beim Starten der Kamera automatisch fokussieren. Deaktiviere diese Option, falls der Blitz beim Starten auch immer angeht. Bildschirm bei Videoaufnahme sperren Wenn aktiviert, wird bei Videoaufnahmen die Oberfläche gesperrt, um versehentliches Stoppen zu verhindern. Zum Entsperren einfach wischen. Vorschau drehen @@ -152,20 +151,20 @@ Batterieanzeige Zeigt den aktuellen Ladezustand des Akkus auf dem Bildschirm an Gitter-Hilfslinien - Gitter + Gitter + Beschnitt-Hilfslinien Anzeige einer rechteckigen Hilfslinie entsprechend dem gewählten Seitenverhältnis (nützlich, wenn ein Beschnitt geplant ist). Nur in der WYSIWYG-Vorschau oder bei Videoaufnahme möglich\n%s - Toast-Benachrichtigungen + Bildschirmbenachrichtigungen anzeigen Anzeige von Popup-Meldungen aktivieren/deaktivieren Vorschau-Animation Zeigt eine Vorschaubildanimation bei der Fotoaufnahme Zeige Rahmen, wenn Fotos aufgenommen werden - Zeige einen Rahmen auf der Anzeige um die Aufnahme eines Bildes anzuzeigen. + Zeige einen Rahmen auf dem Bildschirm, um die Aufnahme eines Bildes anzuzeigen Bildschirm immer an - Wenn aktiviert, wird der Bildschirm nie ausgeschaltet solange die Oberfläche aktiv ist. + Wenn aktiviert, wird der Bildschirm nie ausgeschaltet, solange die Kamera-Benutzeroberfläche aktiv ist Maximale Helligkeit erzwingen Wenn aktiviert, wird der Bildschirm auf die höchste Helligkeit eingestellt. - Foto- und Video-Einstellungen Foto-Einstellungen… Video-Einstellungen… @@ -175,7 +174,7 @@ Die Qualität beim Speichern der Fotos einstellen (Empfehlung: 90%%)\n%s RAW Geotagging - Wenn aktiviert, werden die GPS-Standortdaten in den Aufnahmen gespeichert. + GPS-Standortdaten in den Aufnahmen (Foto/Video) speichern (Bei Fotos ist das nur in den JPEG und DNG-Format möglich) Himmelsrichtung Speichere die GPS-Kompassrichtung in den Fotos (nur JPEG-Format) Standortdaten erforderlich @@ -197,14 +196,14 @@ Legt fest, ob ein Hintergrund-Thread zum Speichern eines Bildes zur schnelleren Ausführung benutzt wird Video-Auflösung Erzwinge UHD/4K (experimentell) - Aktiviert die Auflösung von 3840x2160 für die Videoaufnahme der Hauptkam - era. Funktioniert jedoch nur, wenn es vom Gerät unterstützt wird - Video-Stabilisierung - Die Video-Stabilisierung reduziert das Bildwackeln in der Vorschau und der Aufnahme + Aktiviert die Auflösung von 3840x2160 für die Videoaufnahme der Hauptkamera. Diese Funktion ist ein Hack, der ermöglichen soll, dass 4K-Aufnahmen bei 4K-Kameras gemacht werden, selbst wenn keine Drittanbieter-Apps unterstützt werden. Bitte ausprobieren, ob das auf deinem Gerät funktioniert. + Digitale Video-Stabilisierung aktivieren + Die Video-Stabilisierung reduziert Bildwackeln in der Vorschau und der Aufnahme. Dies ist eventuell nicht erforderlich, wenn das Gerät optische Bildstabilisierung (OIS) unterstützt. Video-Bitrate (durchschnittlich) Einstellung der durchschnittlichen Bitrate der Videoaufnahme (je höher umso besser die Qualität und höher die Dateigröße). Nicht alle Geräte unterstützen alle Bitraten\n%s Bildwiederholfrequenz - Einstellung der Bildwiederholrate (FPS) der Videoaufnahme. Dieser Wert kann nicht immer garantiert werden. Nicht alle Geräte unterstützen alle Raten\n%s + Einstellung der Bildwiederholrate (FPS) der Videoaufnahme. Dieser Wert kann nicht immer garantiert werden. Die Videoaufnahme kann fehlschlagen, wenn die Bildrate nicht unterstützt wird. Bitte prüfen Sie die erzeugten Videos, um die tatsächliche Bildrate zu ermitteln. Diese Einstellung wird nicht bei Slow-Motion-Videos berücksichtigt. +\n%s Maximaldauer Die Videoaufnahme wird nach dieser Zeit abgebrochen.\n%s Neustart der Aufnahme nach Maximaldauer @@ -212,16 +211,16 @@ Maximale Dateigröße für Video Die Videoaufnahme stoppt und/oder started (siehe nächste Optionen), wenn die maximale Dateigröße fast erreicht ist. Alle Android Geräte haben eine maximale Größe von 2GB oder 4GB für Videos. Mit diesem Wert läßt sich ein bestimmter Wert einstellen.\n%s Neustart bei maximaler Dateigröße - Legt fest, ob die Videoaufnahme neugestartet wird, sobald das geräte-definierte oder das benutzerdefinierte Maximum erreicht ist. + Bestimmt, ob die Videoaufnahme neu gestartet werden soll, sobald die maximale Dateigröße erreicht ist (die vom Gerät oder vom Benutzer festgelegt ist) Ton aufzeichnen - Wenn aktiviert, wird das Video mit Ton aufgenommen. + Ton auch aufnehmen, wenn Video aufgenommen wird Audio-Quelle - Einstellung der Mikrofonquelle für die Tonaufnahme\n%s + Einstellung der Mikrofonquelle für die Tonaufnahme. Die exakte Auswirkung der Einstellungen ist abhängig vom Gerät. +\n%s Audio-Kanäle - Mono- oder Stereo-Aufnahme (Stereo wird nur von einigen Geräten unterstützt)\n%s + Mono- oder Stereo-Aufnahme (Stereo wird nur von einigen Geräten unterstützt) Blitzlicht während der Videoaufnahme - Wenn aktiviert, blinkt der Blitz während der Videoaufnahme. - + Wenn aktiviert, blinkt der Blitz während der Videoaufnahme (damit man aus der Ferne erkennen kann, ob die Aufnahme läuft) Verschiedenes Online-Hilfe Öffne die Camera Website in deinem Browser @@ -234,11 +233,9 @@ Einstellungen zurücksetzen Standard-Einstellungen von Camera wiederherstellen Sind Sie sich sicher, alle Einstellungen von Camera auf die Standardwerte zurückzusetzen? - verfügbar nicht verfügbar In die Zwischenablage kopieren - Foto aufnehmen Galerie Belichtung @@ -251,7 +248,6 @@ Umschalten in Kamera Modus Letztes Foto löschen Foto teilen - Übergeordnetes Verzeichnis Neuer Ordner In diesem Ordner kann nicht gespeichert werden @@ -259,109 +255,94 @@ Neuen Ordnername eingeben Fehler beim Erstellen des Ordners Ordner existiert bereits - Speicherort auswählen Storage Access Framework abgebrochen Kann nicht in diesem Verzeichnis speichern - Mikrofon-Berechtigung ist nicht gegeben Location-Berechtigung ist nicht gegeben - Starte Videoaufnahme Stoppe Videoaufnahme - - Max. Filegröße - MB - GB - + Max. Dateigröße + MB + + GB + Starte Sprach/Geräusch-Steuerung Stoppe Sprach/Geräusch-Steuerung Sag \"cheese\" Mache ein lautes Geräusch - Autostabilisierung rotiert die Fotos so, dass sie waagerecht erscheinen.\n\nDies bedeutet aber auch eine geringere Auflösung aufgrund von Rotation und Beschneidung. DNG-Dateien enthalten die volle, unkomprimierte Bildinformation der Kamera. Manche Galerie-Apps erkennen das DNG-Format nicht. DNG-Dateien können in spezialisierten Foto-Editor-Apps verwendet werden. Verschiedene Bildbearbeitungsoptionen wie \"Fotostempel\" oder \"Autostabilisierung\" werden nur bei JPEG-Dateien angewandt und nicht bei DNG-Dateien. Der HDR-Modus ist nützlich für Motive mit starkem Kontrast. Dabei werden mehrere Bilder mit verschiedener Belichtung kombiniert.\n\nHDR ist nicht für bewegte Szenen geeignet, kann Farbänderungen bewirken und benötigt mehr Zeit. - Nicht wieder zeigen - Foto Modus - Std + Std + Standard HDR - Expo {} + Expo {} + Belichtungsreihe Schnelle Fotofolge - NR + NR + Rauschunterdrückung Fotostempel Alle Bilder der HDR Aufnahme speichern Wenn aktiviert, dann werden im HDR-Modus die drei Basis-Belichtungsbilder zusammen mit dem HDR-Foto gespeichert. Beachte, dass das die Aufnahmen verlangsamt, besonders wenn Optionen wie \"Fotostempel\" oder \"Autostabilisieung\" verwendet werden. - BERECHTIGUNGEN NICHT VERFÜGBAR Berechtigung benötigt Kamera Berechtigung wird benötigt um die Kamera zu aktivieren - Location-Berechtigung für das Geotagging benötigt (Speicherung der Standortdaten in - Fotos und Videos). Location-Berechtigung wird auch benötigt, um eine Verbindung zu Bluetooth LE Fernbedienungen herzustellen (Android 11 or earlier). - - Debug-Optionen - Debug-Optionen - Benutze alternative Blitz Methode + Standort-Berechtigung ist für Geotagging benötigt (das Speichern von Standortdaten in Fotos und Videos, auch von Wasserzeichen und Untertitel-Optionen). Standort-Berechtigung ist auch notwendig, um mit Bluetooth LE Fernsteuerungen zu verbinden (zumindest bei Android 11 und früher). + Fehlersuche-Optionen + Fehlersuche-Optionen + Benutze alternative Blitzmethode Aktiviere dies, wenn dein Gerät Probleme mit der Camera2-API hat - Belichtungsreihe Anzahl der Bilder für die Belichtungsreihe\n%s Blendenschritte in der Belichtungsreihe Anzahl der Blendenschritte pro Foto\n%s - Rauschminderung im Originalbild Speichere alle Originalbilder mit Rauschminderung (langsam) - Keine Rauschminderung im Originalbild Speichere einzelnes Originalbild Sollen Originalbilder mit Rauschminderung gespeichert werden? (Benötigt mehr Zeit)\n%s - - s - + s + Nicht genügend freier Speicher um Video aufzunehmen - Videoaufzeichnung gestoppt\nBatterie fast leer. + Videoaufzeichnung gestoppt +\nBatterie fast leer Überprüfung der Batterieladung - Stoppe die Videoauszeichnung wenn die Batterie fast leer ist. Dies vermeidet korrupte Videos, falls dein Gerät aufgrund von Energiemangel plötzlich abschaltet - - Dunkel - Hell + Stoppe die Videoauszeichnung, wenn die Batterie fast leer ist. Dies vermeidet korrupte Videos, falls dein Gerät dann plötzlich abschaltet. + Dunkel + + Hell + Verschlusszeit - Ernsthafter Kamera Fehler - Aktiviere schnellen HDR-/Expo-Burst Erlaubt schnellere Aufnahmen im HDR-/Expo-Modus. Deaktiviere diesen Modus, falls dein Gerät damit Probleme hat. - Kamera Zeichne Video auf Selfie - Spiegele Front Kamera Bestimmt, ob Bilder der Front Kamera gespiegelt werden\n%s - Kalibriere den Gyro - Diese Option kalibriert den Lagesensor, sodaß die Bilderausrichtung korrekt bestimmt wird. + Diese Option kalibriert den Lagesensor, sodass die Bilderausrichtung korrekt bestimmt wird Lege dein Gerät auf eine ebene Fläche, sodass es ebenfalls eben liegt (entweder Portrait- oder Landscape-Orientierung), and wähle \'Kalibriere\'.\n\nDrücke \'Reset\' um die Kalibrierung für dieses Gerät zu entfernen.\n\nDrücke \'Zurück\' zum Abbruch. Kalibriere Reset - Waagerechte Ebene kalibriert. + Waagerechte Ebene kalibriert Ebenen-Kalibrierung zurückgesetzt - DRO - Zeige Neigungslinien Zeige horizontale Neigungsebene Zeige Kompass-Richtungslinien Zeige Kompass Richtungslinien Video Untertitel - Erzeuge eine Untertiteldatei (.SRT) mit Datum und Uhrzeit sowie mit GPS-Daten, sofern GPS aktiviert ist\n%s - + Erzeuge eine Untertiteldatei (.SRT) mit Datum und Uhrzeit sowie mit GPS-Daten, sofern GPS aktiviert ist. (Für Android 11+ erfordert diese Option weitere aktivierbare Kamerasteuerungen/ Speicherzugriffssteuerungen) +\n%s Unbegrenzt 3 Sekunden 5 Sekunden @@ -386,20 +367,15 @@ 30 Minuten 45 Minuten 1 Stunde - Zeige \'Bildaufnahme\' Icon Zeige das Icon um Bilder und Videos aufzunehmen. Nützlich, wenn das Gerät einen eigenen Auslöser hat und man diesen benutzen will. - Videoaufnahme pausiert Videoaufnahme fortgesetzt Pausiere Videoaufnahme Videoaufnahme fortsetzen - Aufnahme läuft… - Initialisierung der Audioaufnahme fehlgeschlagen HDR-Bild konnte nicht erzeugt werden - Auto Bewölkt Tageslicht @@ -409,7 +385,6 @@ Zwielicht Warme Leuchtstofflampe Manuell - Action Barcode Strand @@ -426,7 +401,6 @@ Langzeit Sonnenuntergang Theater - Wasser Schwarze Tafel Mono @@ -436,10 +410,8 @@ Sepia Solarisation Weiße Tafel - Was ist neu? Spenden - Gesicht Gesichter @@ -448,29 +420,22 @@ oben im Bild unten im Bild in der Mitte - - High Speed - + Highspeed Standard - Spezifische EXIF-Kennungen Ersteller Text für den "Ersteller"-Eintrag in den Foto-Metadaten (nur JPEG-Format, freilassen, falls nicht verwendet.) Copyright Text für den "Copyright"-Eintrag in den Foto-Metadaten (nur JPEG-Format, freilassen, falls nicht verwendet.) - Bearbeitung… - Nur JPEG JPEG und DNG (RAW) Nur DNG (RAW) - Standard JJJJ-MM-TT TT/MM/JJJJ MM/TT/JJJJ Kein Datum-Stempel - Anzahl Fotos 2 3 @@ -482,7 +447,6 @@ 12 15 20 - Anzahl Fotos 2 3 @@ -501,12 +465,10 @@ 100 150 200 - Geschwindigkeit Normal Zeitlupe aus Zeitlupe ein - Ohne Blitz Automatischer Blitz Mit Blitz @@ -515,26 +477,21 @@ Frontblitz Auto Frontblitz ein Bildschirmleuchte - Anti-Banding Algorithmen gegen Flackern.\n%s Auto 50 Hz 60 Hz Aus - Geisterbilder Überlagere ein Bild zwecks Ausrichtung.\n%s Aus Zuletzt aufgenommenes Foto Ausgewähltes Bild - Kein Datei-Dialog möglich, die Geisterbilder-Option wird nicht unterstützt Bild kann nicht geöffnet werden - Ermögliche Fotos während der Videoaufnahme Ermögliche Fotos während der Videoaudnahme. Diese Option ausschalten, falls Probleme mit dem Camera-2-API auftreten. - Flaches (Log-) Video-Profil Aktiviere ein flaches (Log-) Profil für den Video-Modus\n%s Aus @@ -544,14 +501,12 @@ Stark Extra stark Log-Profil - Camcorder Externes Mikrofon Standard-Audioquelle Optimiert für Stimme Optimiert für Stimmerkennung Unbearbeitet - Standard 100 kbit/s 200 kbit/s @@ -578,40 +533,32 @@ 100 Mbit/s 150 Mbit/s 200 Mbit/s - - Kein Burst - + Kein Burst + Anzeige der Lautstärke Anzeige der Lautstärke bei der Video-Aufnahme - - Focus {} + Fokus {} + Focus Bracketing - Focus Bracketing Quell-Entfernung Focus Bracketing Ziel-Entfernung - Füge unendlich hinzu - Dein Kompass muss kalibriert werden, um die Genauigkeit zu verbessern. Dazu bewege Dein Handy in der Bahn einer Acht.\n\nAktuelle Präzision: Kompassausrichtung - Ungenau Niedrig Mittel Hoch Unbekannt - Entfernungseinheit Verwendet für GPS-Höhe, Fotostempel und Video-Untertitel\n%s Meter Fuß - ft - + ft + Zeige den What\'s-New-Dialog Zeigt Info zu neuen Features und Verbesserungen wenn die App upgedatet wurde - Verarbeitungseinstellungen… - Algorithmus zur Rauschunterdrückung Algorithmus, den der Kameratreiber zur Unterdrückung des Rauschens verwenden soll. Der Algorithmus zur Rauschunterdrückung versucht, die Bildqualität zu verbessern, indem er übermäßiges Rauschen das bei der Bildaufnahme entstanden ist (besonders be wenig einfallendem Licht) entfernt. (Beachte, dass diese Option im NR Aufnahme-Modus nicht verwendet wird.)\n%s Standard @@ -619,18 +566,16 @@ Minimal Schnell Hohe Qualität - Fokus-Assistenz Zoomt näher bei manueller Fokussierung\n%s Aus 2x 4x - Erhöhe oder vermindere die Belichtungskorrektur - - Vorheriges - Nächstes - + Vorheriges + + Weiter + Aus 2x 3x @@ -645,7 +590,6 @@ 200x 500x Unbegrenzt - Keine Verzögerung 0,5 s 1 s @@ -664,7 +608,6 @@ 30 min 1 h 2 h - Standard 100 MB 200 MB @@ -674,9 +617,7 @@ 2 GB 5 GB 9 GB - Fokus-Bracketing beendet - Keine Hilfslinien 1,0 (1:1) 1,25 (5:4) @@ -689,7 +630,6 @@ 2,33 (21:9) 2,35 (47:20) 2,4 (12:5) - +3 (Hohe Empfindlichkeit) +2 +1 @@ -697,93 +637,80 @@ -1 -2 -3 (Niedrige Empfindlichkeit) - HDR-Kontrastverstärkung Verwendet einen Algorithmus zur Verstärkung des HDR-Kontrasts. Das kann die Aufnahme verbessern, wenn eine Szene einen sehr hohen Dynamikumfang hat aber einen "HDR-Look" bekommen soll.\n%s Aus - Smart + Intelligent Immer - Video-Format Video- und Audio-Dateiformat and -Codecs\n%s - Standard MPEG4 H264 MPEG4 HEVC 3GPP WebM (Audio nicht unterstützt) - Einstellungsmanager - Sichere Einstellungen Sichere alle Einstellungen von Camera in eine Datei Name der Einstellungsdatei - Einstellungen wiederherstellen Stelle zuvor gesicherte Einstellungen wieder her. Alle aktuellen Einstellungen werden durch die gesicherten ersetzt! Diese Option erlaubt die Auswahl einer zuvor gespeicherten Einstellungsdatei. Vorsicht! Alle aktuellen Einstellungen werden überschrieben, wenn eine Einstellungsdatei geladen wird! - Gesicherte Einstellungen Fehler beim Speichern der Einstellungen Fehler beim Laden der Einstellungen - Kein Datei-Dialog verfügbar, das Gerät unterstützt diese Funktion nicht. - + Kein Datei-Dialog verfügbar, das Gerät unterstützt diese Funktion nicht Bild-Format JPEG WebP PNG - NR-Modus Normal Dunkelheit - Oberfläche für Linkshänder Oberfläche für Rechtshänder Icons oben (Portrait) - Zeige Icon für Gesichtserkennung Zeigt ein Icon an zum Ein- und Ausschalten der Gesichtserkennung - Aktiviere die Gesichtserkennung - Deaktiviere die Gesichtserkennung + Aktiviere die Gesichtserkennung + + Deaktiviere die Gesichtserkennung + Gesichtserkennung aktiv Gesichtserkennung inaktiv - Zeige Icon für Horizontalausrichtung Zeigt ein Icon an zum Ein- und Ausschalten der Horizontalausrichtung. Wenn die Horizontalausrichtung aktiviert ist, werden Fotos so rotiert, dass der Horizont waagerecht ist. - Aktiviere die Horizontalausrichtung - Deaktiviere die Horizontalausrichtung - + Aktiviere die Horizontalausrichtung + + Deaktiviere die Horizontalausrichtung + Zeige Icon für Fotostempel Zeigt ein Icon zum Ein- und Ausschalten des Fotostempels - Aktiviere Fotostempel - Deaktiviere Fotostempel + Aktiviere Fotostempel + + Deaktiviere Fotostempel + Fotostempel ein Fotostempel aus - Zeige Icon für eigenen Foto-Textstempel Zeigt ein Icon für den Fotostempel mit selbst erstelltem Text - Zeige Icon für die Sperre des automatischen Weißabgleichs Zeigt ein Icon für Sperrung oder Freigabe des automatischen Weißabgleichs Sperre für autom. Weißabgleich Freigabe für autom. Weißabgleich Weißabgleich gesperrt Weißabgleich aktiv - Zeige Icon zur Deaktivierung der automatischen Belichtung Zeigt ein Icon für Sperrung oder Freigabe der automatischen Belichtung Autom. Belichtung aktiv - Dunkel-Modus: Bitte Kamera still halten - - Pano + Pano + Panorama - Bluetooth-LE-Fernsteuerung… Aktiviere die Bluetooth-LE-Fernsteuerung Aktiviere die Gerätesteuerung per Bluetooth-LE (BLE) Typ des zu steuernden Geräts - BLE wird nicht unterstützt BLE-Geräte-Scan Bluetooth wird nicht unterstützt. @@ -793,18 +720,15 @@ Setze Salzwasser zur Tiefenberechnung Für Unterwassergehäuse, verbessert die Genauigkeit bei korrekter Auswahl der Wasserart. Fernsteurung verbunden - Verwende Adressen Zeige zusätzlich zur GPS-Position die zugehörige Adresse an Bevorzuge Adressdaten vor GPS-Koordinaten Zeige keine Adressdaten an - Zeige Standortdaten-Icon - Zeige ein Icon mit dem die Erfassung von Standortdaten (Geotagging) ermöglicht wird. + Anzeigen eines Symbols, mit dem die Erfassung von Standortdaten (Geotagging) an- und ausgeschaltet werden kann Speichere Standortdaten Beende das Speichern von Standortdaten - Zeige ein Histogramm Zeigt ein Farb-Histogramm an\n%s Aus @@ -813,101 +737,83 @@ Wert (Maximum) Intensität (Durchschnitt) Helligkeit (Durchschnitt des Min.-Max.) - Zeige Zebrastreifen Zeigt in der Vorschau Zebrastreifen in den überbelichteten Stellen der Aufnahme.\n%s Aus - 70% - 80% - 90% - 93% - 95% - 97% - 98% - 99% - 100% - + 70% + + 80% + + 90% + + 93% + + 95% + + 97% + + 98% + + 99% + + 100% + Fokus-Peaking Fokus-Peaking hebt scharf abgebildete Konturen hervor. Das ist vorrangig bei manuellem Fokus nützlich und hilft die scharf eingestellten Bereiche des Bilds zu erkennen.\n%s Aus An Fokus-Peaking-Farbe Bestimmt die Farbe zur Hervorhebung der fokussierten Konturen.\n%s - - Verbleibende - + Verbleibende + Kamera-Vorschau… - Blitz-Optionen Zeige Blitz-Icon - Zeigt Icon für die Blitz-Optionen-Auswahl direkt auf dem Bildschirm, anstelle der Auswahl per Popup-Menü. - + Anzeigen eines Symbols für die Blitz-Optionen-Auswahl direkt auf dem Bildschirm, anstelle der Auswahl per Popup-Menü. Beachte, dass die Taschenlampe nicht verfügbar ist, wenn dieses Symbol aktiviert ist. RAW für Belichtungsreihe Speichert die Fotos von Belichtungsreihen (Expo {}) auch im RAW-Format (oder für HDR-Modus, wenn \"Speichere alle Fotos für HDR-Modus\" gewählt ist). Ist die Option \"RAW für Belichtungsreihe\" nicht ausgewählt, werden in diesen Modi nur JPEGs gespeichert. - RAW für Fokus-Reihe Speichert die Fotos von Fokus-Reihen (FOCUS {}) auch im RAW-Format. Ist die Option \"RAW für Fokus-Reihe\" nicht ausgewählt, werden in diesen Modi nur JPEGs gespeichert. - RAW-Mode-Optionen Zeige RAW-Icon - Zeigt Icon für die RAW-Mode-Auswahl direkt auf dem Bildschirm. - + Anzeigen eines Symbols für die RAW-Mode-Auswahl direkt auf dem Bildschirm Momentane Fernsteurung: Scan - Schattierter Text Normaler Text Text mit schatiertem Hintergrund - Speichere Bilder… - Panorama fertigstellen Panorama abbrechen Panorama abgebrochen Panorama-Bild konnte nicht erstellt werden - Panorama Auto-Crop Im Panorama Modus wellige Bereiche entfernen\n%s - Um ein Panoramabild aufzunehmen, halte das Gerät im Hochformat und klicke auf den Auslöser zum Start des Panoramas. Drehe dann das Gerät entweder nach links oder rechts, um den zentrierten weißen Kreis über den blauen Punkt zu bewegen. Nachdem jedes neue Bild aufgenommen wurde, drehe das Gerät weiter, um jeden neuen blauen Punkt, der nacheinander erscheint, abzudecken.\n\nKlicke auf das Häkchen-Symbol, um das Panorama zu speichern oder auf das Kreuz-Symbol, um abzubrechen.\n\nBeachte, dass die Verarbeitung und Speicherung von Panoramafotos Zeit in Anspruch nehmen kann. - Panorama Originalbilder Ob Originalbilder im Panorama-Modus gespeichert werden sollen. Die Speicherung der Panoramafotos wird dadurch langsamer. Ermöglicht auch die Option eine XML-Datei zu speichern, was bei der Meldung von Problemen mit Panoramafotos hilfreich sein kann.\n%s - Originalbilder nicht speichern Originalbilder speichern Originalbilder und Debug-XML speichern - - ID - + ID + Suchfeld zur Änderung der Belichtungskorrektur - Wähle das Dateiformat zum Speichern der Fotos. Das wirkt sich nur auf \"Standard-\" (nicht RAW-) Fotos aus. Merke: Das PNG-Format ist nicht verlustlos, es wird aus einem JPEG mit 100%%iger Qualität konvertiert.\n%s - Camera-API - Wähle das Camera2-API um extra Features wie manuelle Modi für Belichtung, Fokus, Weißabgleich sowie RAW-Format (falls vom Gerät unterstützt) zu nutzen. Die Änderung des API verursacht einen Neustart der App.\n%s - Original Camera-API + Wähle die Kamera2-API, um extra Funktionen wie manuelle Modi für Belichtung, Fokus, Weißabgleich sowie RAW-Format (falls vom Gerät unterstützt) zu nutzen. Die Änderung der API wird einen Neustart der App auslösen. +\n%s + Originale Kamera-API Camera2-API - Foto/Video aufnehmen, wenn ein Geräusch erkannt wird. Wenn aktiviert, nutze die Mikrofon-Taste auf dem Bildschirm, um die Erkennung zu starten/stoppen. \n%s - - Wenn möglich, nutze eine Adresse bei der Speicherung des GPS Standorts. - Diese Option erfordert, dass Ihr Gerät Standortdaten über das Internet an einen Dritten überträgt, - um GPS in eine Adresse umzuwandeln. Siehe https://developer.android.com/reference/android/location/Geocoder . - Gibt keine Garantien für Verfügbarkeit oder Genauigkeit. Es wird nicht garantiert, dass die Ergebnisse aussagekräftig oder korrekt sind. - \n%s - - Zum Fokussieren berühren und blaue Kamerataste drücken, um Bilder aufzunehmen. - \n\nUm die maximale Bildschirmhelligkeit zu deaktivieren, siehe Einstellungen/Benutzeroberfläche/\"Maximale Helligkeit erzwingen\". - Zur Speicherung auf der SD-Karte auf Android 5+, siehe Einstellungen/Mehr Kamera-Einstellungen…/\"Storage Access Framework\". - Für weitere Hilfe, klicke auf \"Online-Hilfe\" in den Einstellungen. - - + Wenn möglich, nutze eine Adresse bei der Speicherung des GPS Standorts. Diese Option erfordert, dass Ihr Gerät Standortdaten über das Internet an einen Dritten überträgt, um GPS-Koordinaten in eine Adresse umzuwandeln. Siehe https://developer.android.com/reference/android/location/Geocoder. Es gibt keine Garantien für Verfügbarkeit oder Genauigkeit. Es wird nicht garantiert, dass die Ergebnisse aussagekräftig oder korrekt sind. +\n%s + Zum Fokussieren berühren, und die weiße Kamerataste drücken, um Bilder aufzunehmen. +\n +\nUm die maximale Bildschirmhelligkeit zu deaktivieren, siehe Einstellungen/Benutzeroberfläche/„Maximale Helligkeit erzwingen“. Zur Speicherung auf der SD-Karte auf Android 5+, siehe Einstellungen/Mehr Kamera-Einstellungen…/„Storage Access Framework“. Für weitere Hilfe tippe auf „Online-Hilfe“ in den Einstellungen. Wähle eine Fernsteuerung - REC709 sRGB Gamma @@ -923,61 +829,116 @@ 2,4 2,6 2,8 - Nichts ausblenden Nur Navigationstasten auf dem Bildschirm dimmen Nur Navigationstasten ausblenden Alle Einstellelemente ausblenden Alles ausblenden - Geisterbild-Durchsichtigkeit Alpha-Wert für Geisterbilder. Umso niedriger der Wert, desto transparenter das Geisterbild.\n%s - Zebrastreifen-Vordergrundfarbe Zu verwendende Vorderundfarbe für Zebrastreifen.\n%s Zebrastreifen-Hintergrundfarbe Zu verwendende Hintergrundfarbe für Zebrastreifen.\n%s - Schwarz Rot Orange Transparent Weiß - Externe Kamera Ultraweit - Zu externer Kamera wechseln Kamera wechseln Zwischen mehreren Kameras wechseln Tasten für mehrere Kameras Falls aktiviert, werden verschiedene Tasten verwendet, um zwischen (mehreren) Front- und Rück-Kameras zu wechseln. Falls deaktiviert, rotiert die Taste zum Wechsel der Kamera durch alle Kameras hindurch. - Kamera-ID anzeigen Aktuelle Kamera-ID auf dem Bildschirm anzeigen - Aktionen über langen Tastendruck erlauben Ob Aktionen durch langen Tastendruck aktiviert werden(z.B. Langer Druck auf Gallery-Symbol zur Änderung des Speicherortes). - Blende - 4K UHD Bitrate Framerate Slow-Motion - Eigentliche Eulerwinkel speichern Speichern der drei Euler-Winkel (Drehlage des Geräts im EXIF Benutzerkommentar des Fotos (nur im JPEG-Format) - Keine Lautes Geräusch - Sprachkommando: \"cheese\" - - Build version - Die Kamera ist von OpenCamera gespalten - Autor - Quellcode - Lizenz - Kamerainformationen + Sprachkommando: \"cheese\" + + Für das Speichern von Dateien wie Fotos oder Videos ist eine Lese-/Schreibberechtigung erforderlich + Die Berechtigung zur Nutzung des Mikrofons ist erforderlich, um Videos mit Ton aufzunehmen oder die Optionen der „Audiosteuerung“ zu nutzen + Der Algorithmus, den der Kameratreiber für Kantenglättung verwenden sollte. Kantenglättung verbessert die Schärfe und die Details des aufgenommenen Bildes. (Diese Einstellung wird im NR Fotomodus ignoriert.) +\n%s + Überspringen + Weiter + Zurück Nutzungsbedingungen - + Information über Kamera + Erweiterung: Gesichtsverschönerung + X-Bty + Erweiterung: Bokeh + X-Bokeh + Erweiterung: Nacht + X-Nacht + Erweiterung: HDR + X-HDR + Erweiterung: Auto + X-Auto + Bluetooth Suche- und Verbindungsberechtigungen sind notwendig, damit Bluetooth LE-Fernbedienungen gefunden und verbunden werden können. + Kantenglättung-Algorithmus + Autoren + Kamera ist eine Abänderung von Camera + Build-Version + Material-Design-Symbole von Google + Kamera © 2013–2023 Mark Harman, veröffentlicht unter GPL v3 oder später. Tippe hier für den vollständigen Lizenztext. + Kamera + Open-Source-Lizenzen + Lizenz + Quellcode + Kamera verwendet Symbole von Googles Material Design-Icons (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , https://google.github.io/material-design-icons/) unter der Apache Lizenz Version 2.0. Einige Symbole wurden verändert. Tippe hier für den vollständigen Lizenztext. + Unbekanntes Gerät (Bluetooth-Verbindungserlaubnis nicht verfügbar) + Suchleiste zum Ändern des aktuellen Präferenzwertes + Dummy-HDR-Aufnahme/Expositionsberichtigung aktivieren + LINSEN + Wenn dein Gerät Probleme bei der Aufnahme von HDR oder Expo-Foto-Modi hat (wenn Expo-Bilder mit derselben Belichtung herauskommen), versuche, diese Option zu aktivieren. Dies funktioniert nur, wenn die schnelle HDR/Expo-Option unterhalb auch aktiviert ist. + Standard + Entfernen, außer Datum und Zeit + Für bessere Fotos die Kamera bitte ruhig halten. + HDR Dynamikkompression + Hiermit können die EXIF-Metadaten von JPEG-Fotos entfernt werden. Dies entfernt nicht die EXIF-Kennzeichen aus anderen Einstellungen, wie z.B. Standort oder Geotagging. Diese anderen Einstellungen sind unabhängig und setzen sich über diese Einstellung hier hinweg. RAW/DNG und Video werden durch diese Einstellung nicht betroffen. +\n%s + EXIF-Daten nicht entfernen + Einfache Klammer + EXIF-Daten des Gerätes entfernen + Der benutzte Algorithmus für Dynamikkompression im HDR Fotomodus: +\n%s + Exponentiell + EXIF-Daten entfernen + QR Code + Einen Kontakt hinzufügen + Einen Kontakt hinzufügen + Ein Kalenderereignis hinzufügen + Dieses Ereignis dem Kalender hinzufügen + Diesen Ort öffnen + Diesen Ort öffnen + Ein neues E-Mail versenden + Öffnet ein neues E-mail an die enthaltenen Adressen + Diese ISBN anschauen + Diese ISBN auf isbnsearch.org suchen + Produkt suchen + Den ID Barcode dieses Produktes suchen + Ein neues SMS senden + Sendet ein neues SMS an die enthaltenen Empfänger + Diese Telefonnummer anrufen + VIN suchen + Diese VIN (Fahrzeug-Identifikationsnummer) suchen + Diese Telefonnummer anrufen + + IHRE PRIVACY-SCHALTER MUSS AKTIVIERT SEIN + DA DIE KAMERA NICHT VERFÜGBAR IST ;-) + + BITTE WARTEN SIE 5 SEKUNDEN AUF IHRE KAMERA + UM SIE ZU LADEN, DA SIE SOEBEN AKTIVIERT WURDE + \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index e9a3f996b..ff17f8227 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -216,7 +216,7 @@ Πηγή ήχου Χρήση μικροφώνου για την καταγραφή ήχου\n%s Κανάλια ήχου - Καθορισμός μονοφωνικής ή στερεοφωνικής καταγραφής ήχου (ο ήχος στέρεο υποστηρίζεται μόνο σε ορισμένες συσκευές)\n%s + Καθορισμός μονοφωνικής ή στερεοφωνικής καταγραφής ήχου (ο ήχος στέρεο υποστηρίζεται μόνο σε ορισμένες συσκευές) Φλας κατά την καταγραφή βίντεο Ενεργοποίηση τού φλας κατά την καταγραφή των βίντεο (μπορεί να χρησιμοποιηθεί αν γίνεται καταγραφή από απόσταση) @@ -445,12 +445,13 @@ Υψηλή Ταχύτητα Προεπιλογή - + About Δημιουργία έκδοσης - Η κάμερα είναι διχαλωτή από το OpenCamera + Η κάμερα είναι διχαλωτή από το Camera Συγγραφέας Κωδικός πηγής Άδεια Πληροφορίες κάμερας Όροι υπηρεσίας + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2f9f9fd7a..1a6bcc363 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,29 +1,30 @@ - + - - Camera + Cámara Ajustes Ajustes de ventana emergente OK (Este mensaje no se mostrará de nuevo) - - Encendido - Apagado - + Encendido + + Apagado + Guardar en: - Limpiar historial de carpetas - Desea limpiar el historial de carpetas? + Borrar el historial de carpetas + Deseas borrar el historial de carpetas? Seleccione otra carpeta Cambiar ruta de guardado a: - La grabación de video se ha detenido - repite para ir - Error al volver a conectar a la cámara + Se detuvo la grabación de vídeo + repeticiones por hacer + + Falla en la reconexión con la cámara Error, el archivo de vídeo puede estar dañado - no soportado en tu dispositivo + no es soportado en tu dispositivo + Error desconocido, vídeo detenido Servidor caído, video detenido - El video alcanzo la máxima duración - El video alcanzo el máximo tamaño - Compensar exposición + El video alcanzó la máxima duración + El video alcanzó el tamaño máximo + Compensación de exposición FPS Distancia focal Infinito @@ -34,95 +35,96 @@ Exposición bloqueada Exposición desbloqueada Temporizador cancelado - Modo ráfaga cancelado + Modo de repetición cancelado Temporizador iniciado Error al guardar el video Error al grabar el video Grabando - Lo lamento + Perdón Error al guardar foto Error al guardar la foto RAW - Error del nivel automático - Error al iniciar la vista previa de la cámara + Fallo en el autonivelado + Fallo al iniciar la vista previa de la cámara Tomando foto Error al tomar foto Ubicación GPS no está disponible Foto eliminada - No hay una aplicación de galería disponible - La pantalla esta bloqueada\ndeslize el dedo por la\npantalla para desbloquear + No hay aplicación de galería disponible + La pantalla esta bloqueada +\ndesliza para desbloquear Desbloqueado - Lo sentimos, auto-estabilizar no esta\nsoportado en este dispositivo + Perdón, el nivelador automático no es compatible +\ncon este dispositivo Audio deshabilitado Duración máxima Efecto de color Modo de escena Balance de blancos - Ángulo Dirección FALLO AL ABRIR CÁMARA. - PUEDE ESTAR LA CÁMARA EN USO + LA CÁMARA PUEDE ESTAR EN USO POR OTRA APLICACIÓN? ISO Zoom Libre [BLOQUEADO: Desliza para desbloquear] - - Error en el estampado de la información - m - + No se pudo estampar la información en la foto + m + Efectos de cámara - Nivel automático - Las Imágenes serán rotadas automáticamente para que esten niveladas perfectamente (sólo fotos) (la toma de fotos es mas lenta y puede que falle en dispositivos con poca memoria) + Autonivelador + Las imágenes se rotarán para que estén niveladas automáticamente (sólo fotos) (es más lento tomar fotos y puede fallar en dispositivos con poca memoria) Aplicar un efecto de color Aplica el efecto de color seleccionado a la foto - Aplicar modo de escena + Aplicar un modo de escena Optimiza la foto para distintas escenas - Establece el balance de blancos - Elige un ajuste de balances de blancos - Establecer ISO - Mayor valor significa mayor sensibilidad a la luz (puede no funcionar en algunos dispositivos) - Establece la compensación de la Exposición - Establece a 0 para la compensación de la Exposición por defecto + Ajusta el balance de blancos + Elige una opción para ajustar el balances de blancos + Ajustar ISO + Un valor más alto significa más sensibilidad a la luz (puede que no funcione en algunos dispositivos) + Ajusta la compensación de la exposición + Ajuste a 0 para la compensación de la exposición por defecto Bloquear la orientación de fotos y videos - Si se establece, la orientación del dispositivo será ignorada y la orientación de la foto/video será con respecto a la orientación especificada\n%s + Si se ajusta, la orientación del dispositivo será ignorada y la orientación de la foto/video será con respecto a la orientación especificada +\n%s Detección de rostro - Utilice la detección de rostros en lugar de las áreas de enfoque - + Utilizar detección de rostro en lugar de áreas de enfoque Controles de cámara Temporizador Sonido del temporizador - Sonar cuando el temporizador está contando regresivamente o para el retardo en el modo de ráfaga + Sonar cuando el temporizador está en cuenta regresiva o para el retardo del modo de repetición Cuenta regresiva del temporizador por voz - Activa la cuenta regresiva por voz para el temporizador o el modo ráfaga (desde 60 segundos) - Ráfaga - Intervalo de modo de ráfaga + Activa con la voz la cuenta atrás para el temporizador o el retardo del modo de repetición (a partir de 60 segundos) + Repetir + + Intervalo de modo de repeticion Más controles de cámara… Tocar para capturar - Toma una foto simplemente tocando o tocando dos veces la pantalla - Pausar después de tomar la foto - Pause la pantalla después de tomar una foto, con la opción de compartir o eliminar la foto + Toma una foto simplemente tocando una o dos veces en la pantalla + Pausar después de tomar foto + Pause la pantalla después de tomar una foto, con opción de compartir o eliminar la foto Sonido del obturador - Reproducir un sonido al tomar una foto + Sonido al tomar una foto Teclas de volumen Opciones de control de audio - Sensibilidad de control de audio - Sensibilidad al nivel de ruido para la opción de audio (ruido fuerte) + Sensibilidad del control de audio + Sensibilidad del nivel de ruido para la opción de audio (ruido fuerte) Carpeta de almacenamiento Carpeta para guardar los archivos de foto/video - Utilice el Framework de Acceso del Almacenamiento para guardar fotos y videos - Prefijo de foto + Si se debe usar Storage Access Framework para guardar fotos y vídeos. Debe estar activado si deseas guardar en tarjetas SD externas. En Android 10+ esta opción debe estar activa si deseas guardar en otra carpeta aparte de DCIM. + Guardar prefijo de foto Prefijo utilizado para el nombre de las fotos - Prefijo de video + Guardar prefijo de video Prefijo utilizado para el nombre de los videos Formato de hora para el nombre de archivo Mostrar cámara aunque el dispositivo esté bloqueado - Si está activado, Camera se mostrará por encima de la pantalla de bloqueo (sin embargo tendrá que desbloquear para acceder a la Galería, Ajustes, etc) + Si está activado, la cámara se mostrará por encima de la pantalla de bloqueo (tendrás que desbloquear para acceder la Galería, Ajustes, etc) Realizar autoenfoque al iniciar - Realice un autoenfoque cuando Camera se inicie. Si presenta el problema donde el flash se enciende al iniciar, desactive esta opción + Si deseas auto-enfoque cuando se inicia la cámara. Si tienes el problema de que el flash se enciende al iniciar, desactiva esta opción Bloquear pantalla al grabar video - Al grabar vídeo, la interfaz de pantalla se bloqueará para evitar detener accidentalmente la grabación. Desliza la pantalla para desbloquearla. Tenga en cuenta que la grabación de video siempre se detendrá si la aplicación entra en segundo plano o la pantalla se borra. + Al grabar vídeo, la pantalla se bloqueará para evitar detener accidentalmente la grabación. Desliza sobre la pantalla para desbloquear. Ten en cuenta que la grabación de vídeo siempre se detendrá si la aplicación pasa a segundo plano o se apaga la pantalla. Rotar vista previa Opción para rotar la vista previa (no afectará a las fotos/videos resultantes)\n%s Interfaz de pantalla… @@ -130,10 +132,10 @@ Ubicación de la Interfaz de Usuario Modo inmersivo Mostrar zoom - Muestra el nivel de zoom actual de la cámara en la pantalla (cuando se amplía) + Mostrar nivel de zoom actual de la cámara en pantalla (cuando se amplía) Mostrar controles zoom -/+ - Muestra los botones para el control del zoom -/+ - Mostrar control deslizante del zoom + Muestra los botones -/+ para el control del zoom + Mostrar control deslizante de zoom Muestra el control deslizante para controlar el zoom Mostrar ISO Muestra el nivel de ISO actual (requiere API de Camera2) @@ -152,11 +154,12 @@ Mostrar batería Muestra el nivel actual de la batería en la pantalla Mostrar cuadrícula - Cuadrícula + Cuadrícula + Mostrar guía de recorte Una guía de recorte muestra un rectángulo que indica la relación de aspecto especificada, útil si planea recortar la foto/video posteriormente con una relación de aspecto diferente. Requiere modo de foto WYSIWYG, o estar en modo de video\n%s - Mostrar mensajes \"toast\" - Muestra mensajes emergentes \"toast\" + Mostrar mensajes en pantalla + Si se mostrarán mensajes de información temporales en pantalla Mostrar animación en miniatura Muestra la animación en miniatura en movimiento al tomar una foto Mostrar borde cuando se toma una foto @@ -165,14 +168,15 @@ Si se activa, la pantalla no se apagará mientras la interfaz de usuario principal de Camera esté activa Forzar brillo al máximo Forzar la visualización de la pantalla a tener el brillo máximo, en lugar del valor predeterminado del dispositivo - Configuración de fotos y videos Configuración de fotos… Configuración de videos… Configuración de ubicación… - Resolución + Resolución + Calidad de la imagen - Establece la calidad JPEG de las imágenes fotográficas guardadas (el valor predeterminado es 90 %%)\n%s + Establece la calidad JPEG de las imágenes fotográficas guardadas (el valor predeterminado es 90 %%)\n%s + RAW Almacenar datos de ubicación (Geotagging) Almacene los datos de ubicación del GPS en las fotos/videos @@ -197,13 +201,14 @@ Guarde fotos con un subproceso en segundo plano (para una operación más rápida) Resolución de video Forzar 4K UHD vídeo (experimental) - Activa la resolución 3840x2160 para la grabación de vídeos en la cámara trasera - esto solo funcionara si tu dispositivo lo soporta - Activar Estabilización de Vídeo - La estabilización de vídeo reduce las vibraciones + Activa la resolución 3840x2160 para la grabación de vídeo en la cámara trasera - esta opción es un hack que puede permitir que los dispositivos 4K en cámaras 4K que no exponen la opción de aplicaciones de la cámara de terceros. Esto no está garantizado que funcione, por favor prueba antes. + Activar estabilización de Vídeo digital + La estabilización de vídeo reduce las sacudidas debidas al movimiento de la cámara tanto en la vista previa como en los vídeos grabados. Esto puede ser innecesario si tu dispositivo es compatible con estabilización óptica de imagen (OIS). Tasa de bits del video (aprox) Establece la tasa de bits aproximada de los videos (mayor tasa significa una mejor calidad, pero ocupa más espacio en disco, puede causar que la grabación del video falle si la tasa de bits no es compatible)\n%s Frecuencia de fotogramas del vídeo (aprox.) - Establece la velocidad de fotogramas (FPS) de los videos (puede ser aproximada, no hay garantía que se logre, puede causar que la grabación del video falle si la velocidad de fotogramas no es compatible)\n%s + Ajusta la velocidad de cuadros por segundo (FPS) de los vídeos (puede ser aproximada, no se garantiza que se alcance y puede hacer que falle la grabación de vídeo si no se admite la velocidad de cuadros por segundo). Comprueba los vídeos resultantes para conocer la frecuencia de imagen real utilizada. Ten en cuenta que este ajuste se ignora en los vídeos a cámara lenta. +\n%s Máxima duración de un video La grabación de video se detendrá después de la duración especificada\n%s Reiniciar el vídeo después de la duración máxima @@ -215,12 +220,12 @@ Grabar audio Grabe audio durante la grabación del video Fuente del audio - Micrófono a utilizar para grabar audio\n%s + Micrófono que se utilizará para grabar audio. Ten en cuenta que el comportamiento exacto de las opciones depende de cómo esté implementada la opción en tu dispositivo. +\n%s Canales de audio - Especifique mono o estéreo para grabar audio (estéreo sólo es admitido en algunos dispositivos)\n%s + Especifique mono o estéreo para grabar audio (estéreo sólo es admitido en algunos dispositivos) Flash durante la grabación de video Si está activado, el flash se activará/desactivará al grabar video (se puede utilizar para indicar que la cámara sigue grabando a distancia) - Varios Ayuda en línea Inicie el sitio web de Camera en su navegador @@ -233,11 +238,9 @@ Restablecer ajustes Restablece todos los ajustes de Camera a la configuración predeterminada Estás seguro de que quieres resetear todos los ajustes de Camera a los predefinidos? - Disponible No disponible Copiar al portapapeles - Tomar Foto Galería Exposición @@ -250,7 +253,6 @@ Cambiar al modo de foto Borrar última foto Compartir Foto - Subir Carpeta Nueva Carpeta No se puede escribir en esta carpeta @@ -258,35 +260,34 @@ Introduce un nombre a tu nueva carpeta Fallo al crear la carpeta La carpeta ya existe - Selecciona el lugar de guardado Framework de Almacenamiento de Acceso cancelado - No se puede guardar en esta carpeta - + No se puede guardar en esta carpeta El permiso de micrófono no está disponible El permiso de ubicación no está disponible - Iniciar la grabación de vídeo Detener la grabación de vídeo - Máximo tamaño de archivo - MB - GB - + MB + + GB + Comenzar a escuchar el audio Detener la escucha de audio Decir \"cheese\" Introducir un ruido fuerte - El nivel automático rotará ligeramente las fotos para que aparezcan niveladas.\n\nTenga en cuenta que las imágenes saldrán con una resolución ligeramente menor (debido a la rotación y al recorte que se requiere). - Los archivos DNG contienen la información completa sin comprimir y sin procesar de su cámara.\n\nLa mayoría de las aplicaciones de la galería no reconocerán DNG, sino que se deben usar con aplicaciones especializadas.\n\nTenga en cuenta que varias opciones de procesamiento, como el estampado de las fotos y el nivel automático, solo se aplicarán a las imágenes JPEG, y no a las imágenes DNG\n\nLos archivos DNG ocupan mucho espacio; una aplicación de explorador de archivos puede ser útil para transferirlos o eliminarlos.\n\nLos archivos DNG solo se guardan en los modos de fotografía estándar o DRO (D-Range Optimise). + Los archivos DNG contienen toda la información de tu cámara sin comprimir ni procesar. +\n +\nTen en cuenta que algunas aplicaciones de galería no reconocen los archivos DNG. Las imágenes DNG pueden utilizarse con editores de imágenes especializados. +\n +\nTenga en cuenta que varias opciones de procesamiento, como Estampar fotos y Nivel automático, sólo se aplicarán a las imágenes no DNG (JPEG/etc.), y no a las imágenes DNG. El modo HDR es útil para tomas con una gran variación de brillo. Funciona tomando múltiples tomas con diferentes exposiciones y combinándolas para crear la imagen final.\n\nTenga en cuenta que el HDR no es adecuado para escenas con movimiento rápido y puede dar como resultado una reproducción de color menos precisa.\n\nTomar fotos en modo HDR será más lento. - No mostrar de nuevo - Modo de foto - Std + Std + Standard HDR BKT {} @@ -296,69 +297,57 @@ Reducción de ruido Estampado en fotos Guardar todas las imágenes en el modo HDR - Si se activa, cuando se utilice el modo de foto HDR, se guardarán las tres imágenes de exposición base, así como la foto HDR final. Tenga en cuenta que esto hará que guardar sea más lento, especialmente si también se usan opciones como \"Estampar fotos\" o Nivel automático - + Si se activa, cuando se utilice el modo de foto HDR, se guardarán las tres imágenes de exposición base, así como la foto HDR final. Ten en cuenta que guardar será más lento, especialmente si también se usan opciones como \"Estampar fotos\" o Nivel automático. PERMISOS NO DISPONIBLES Permiso requerido Se requiere el permiso de la cámara para habilitarla - Opciones de depuración Opciones de depuración Utilizar un método de flash alternativo Habilitar si su dispositivo tiene un comportamiento erróneo del flash con la API Camera2 - Horquillado de exposición Número de imágenes para el modo de horquillado de exposición\n%s Pasos de horquillado de exposición BKT Establece el rango de pasos (F/Stop) para el aumento y disminución de luminosidad a realizar en las diferentes imágenes del horquillado\n%s - Reducción de ruido original de imágenes Guardar las imágenes originales en modo de reducción de ruido. Esto puede hacer que el ahorro de fotos sea mucho más lento.\n%s - No guardear las imágenes originales Guardar una sola imagen original Guardar todas las imágenes originales (lento) - - s - + s + No hay suficiente espacio libre para grabar vídeo Vídeo detenido.\nNivel de la batería demasiado bajo Comprobar batería crítica Detenga la grabación de vídeo si el nivel de la batería es críticamente bajo. Esto ayuda a reducir el riesgo de que se corrompan los videos si el dispositivo se apaga repentinamente debido a la falta de energía. - - Oscuro - Brillante + Oscuro + + Brillante + Velocidad de obturación - Error grave de la cámara - Habilitar ráfagas HDR / exposiciones rápidas Permite una captura más rápida de las tomas HDR / modo de exposición. Inhabilítelo si su dispositivo tiene problemas al tomar fotografías con los Modos de fotografía HDR o Modos de Exposición. - Cámara Grabar vídeo Selfie - Reflejo en cámara frontal Refleja imágenes cuando se utiliza la cámara frontal\n%s - Calibrar nivel angular - Esta opción calibra el acelerómetro de su dispositivo, para que el nivel automático y las opciones de nivel/ángulo en pantalla funcionen correctamente. + Esta opción calibra el acelerómetro de tu dispositivo, para que el nivel automático y las opciones de nivel/ángulo en pantalla funcionen correctamente Coloque su dispositivo sobre una superficie horizontal plana para que este sea nivelado (en orientación vertical u horizontal), a continuación seleccione Calibrar.\n\nPresione Reiniciar para eliminar la calibración del dispositivo.\n\nPresione el botón Atrás para cancelar. Calibrar Reiniciar Nivel calibrado Calibración de nivel reiniciada - DRO - Mostrar líneas de paso Muestra líneas horizontales de paso Mostrar líneas de dirección Muestra líneas de dirección de la brújula Subtítulos en video - Cree un archivo de subtítulos (.SRT) almacenando la fecha y la hora; y también información del GPS si los datos de la ubicación/dirección están permitidos\n%s - + Crea un archivo de subtítulos (.SRT) que almacena la fecha, hora y también información GPS si los datos de ubicación/dirección están activados. (En Android 11+, esta opción requiere más controles de cámara y acceso al almacenamiento habilitados). +\n%s Ilimitado 3 segundos 5 segundos @@ -383,20 +372,15 @@ 30 minutos 45 minutos 1 hora - Mostra icono para tomar foto Muestra el icono para tomar fotos y grabar videos. Útil si su dispositivo tiene un botón de obturador de hardware y prefiere usarlo. - Vídeo en pausa Vídeo reanudado Pausar la grabación de vídeo Reanudar la grabación de vídeo - Capturando… - Error al inicializar la escucha de audio Error al crear la imagen HDR - Auto (AWB) Nublado Luz día @@ -406,7 +390,6 @@ Sombra Atardecer Luz cálida - Acción Auto Código de barras (Barcode) @@ -423,7 +406,6 @@ Estabilizador Puesta de sol Teatro - Agua Pizarra negra Monocromo @@ -433,10 +415,8 @@ Sepia Solarizar Pizarra blanca - Qué hay de nuevo: Donar - cara detectada caras detectadas @@ -445,26 +425,20 @@ arriba de la pantalla abajo de la pantalla en el centro de la pantalla - Alta velocidad - Autor Texto para almacenar en los metadatos de la imagen para la etiqueta del Autor (formato JPEG solamente). (Déjelo en blanco para ninguno) Copyright Texto para almacenar en los metadatos de la imagen para la etiqueta de Copyright (formato JPEG solamente). (Déjelo en blanco para ninguno) - Procesando… - JPEG sólo JPEG y DNG (RAW) DNG (RAW) sólo - Defecto yyyy-mm-dd (ISO 8601) dd/mm/yyyy mm/dd/yyyy Ninguno - Número de fotos 10 12 @@ -476,13 +450,11 @@ 5 6 8 - Velocidad Normal Cámara lenta habilitada Cámara lenta deshabilitada - - Flash Off + Sin flash Flash Auto Flash On Linterna @@ -490,19 +462,16 @@ Pantalla Flash Auto Pantalla Flash ON Pantalla de la Linterna - Reductor de parpadeo Algoritmos para reducir el parpadeo de la luz.\n%s 50Hz 60Hz Auto Apagado - Videocámara Micrófono Externo(si existe) Entrada de Audio predefinida Optimizada para voz - Default 100kbps 200kbps @@ -527,7 +496,6 @@ 80Mbps 90Mbps 100Mbps - Desactivado 2x 3x @@ -542,7 +510,6 @@ 200x 500x Ilimitado - Sin retardo 1s 2s @@ -560,14 +527,12 @@ 30m 1h 2h - Predeterminado por el dispositivo 100MB 200MB 300MB 500MB 1GB - Ninguno 1 (1:1) 1.25 (5:4) @@ -579,7 +544,6 @@ 2.33 (21:9) 2.35 (47:20) 2.4 (12:5) - +3 (alta sensibilidad) +2 +1 @@ -587,27 +551,380 @@ -1 -2 -3 (baja sensibilidad) - Interfaz de usuario para zurdos Interfaz de usuario para diestros - Texto sombreado Texto plano - + About + Versión de compilación + Camera es una bifurcación de Camera + Autores + Código fuente + Licencia + Información de la cámara + Condiciones de servicio Apagado Sólo ocultar los botones de navegación en pantalla Ocultar interfaz de usuario Ocultar todo - Ninguno Ruido fuerte - Comando de voz: \"cheese\" - - Versión de compilación - La cámara está bifurcada de OpenCamera - Autor - Código fuente - Licencia - Información de la cámara - Términos de servicio - + Comando de voz: \"cheese\" + + Se utiliza para la altitud GPS para sello de fotos y subtítulos de vídeo +\n%s + Distancia objetivo del horquillado de enfoque + Distancia de la fuente del horquillado de enfoque + El permiso de ubicación es necesario para el geoetiquetado (almacenamiento de datos de ubicación en fotos y vídeos, incluidas las opciones de sello y subtítulos). El permiso de ubicación también es necesario (al menos para Android 11 y anteriores) para conectarse a dispositivos de control remoto Bluetooth LE. + Perfiles de imagen de vídeo + Permitir fotos mientras se graba vídeo + No se puede abrir esta imagen + Imagen seleccionada + Superponer una imagen, para ayudar con la alineación +\n%s + 200 + 150 + 100 + 50 + 40 + 30 + 25 + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + Número de fotos + Etiquetas EXIF personalizadas + Por defecto + Permite hacer fotos mientras se graban vídeos. Desactiva esta opción si hay problemas con la grabación de vídeo con la API Camera2 activada en tu dispositivo. + No se encontró diálogo de archivo en este dispositivo, la opción de imagen Ghost no es compatible + Última foto + Desactivado + Imagen Ghost + Acceso al micrófono requerido para grabar vídeo con audio y para utilizar las opciones de \"Control de audio\" + Permiso de lectura/escritura requerido para guardar archivos resultantes, como fotos o vídeos + Definir perfil de imagen estándar o plana para el modo de vídeo +\n %s + Estándar + Registro (Fino) + Registro (Bajo) + sin ráfaga + Registro (Fuerte) + Registro (Extra fuerte) + Perfil de registro + Optimizado para el reconocimiento de voz + 150Mbps + Mostrar o no el nivel de audio en pantalla al grabar vídeo + Mostrar medidor de nivel de audio + Registro (Medio) + Sin procesar + 200Mbps + Añadir distancia infinita + Enfoque horquillado + Dirección del compás + Enfoque {} + El compás de tu dispositivo necesita calibrarse para mejorar su precisión. Para ello, mueve el dispositivo en forma de 8. +\n +\nPrecisión actual: + Inestable + Baja + Media + Alta + Desconocido + Unidad de distancia + Metros + Pies + Si se muestra un histograma de los colores que aparecen en pantalla +\n%s + Mantén la cámara estáble para obtener mejores fotos. + Luminosidad + Valor (Máximo) + Luminosidad (media de mín-máx) + Mostrar rayas de cebra + 95% + 97% + 99% + 100% + Si esta opción está activa, los realces se mostrarán en los bordes enfocados (contornos). Esto es principalmente útil para el enfoque manual, y puede ser utilizado para ayudar a determinar qué regiones de la imagen están enfocadas. +\n%s + Color del pico de enfoque + Si se mostrará información sobre nuevas funciones y mejoras cuando la aplicación se ha actualizado + Horquilla de enfoque cancelada + WebM (audio no soportado) + Guardar ajustes + Guarda todos los ajustes de la cámara en un archivo + Nombre de la configuración guardada + Restaurar configuración + Restablece los ajustes guardados anteriormente. ¡Esta acción reemplazará todos los ajustes actuales con los ajustes guardados! + Esta opción te permite seleccionar uno de los archivos de configuración que guardaste previamente. Ten en cuenta que la selección de un archivo reemplazará todos los ajustes actuales! + Configuración guardada + Error al restaurar la configuración + No se encontró ningún diálogo de archivo en este dispositivo, esta opción no es compatible + Formato de imágen + WebP + Modo NR + Poca luz + Iconos en la parte superior (retrato) + Mostrar icono de detección facial + Modo de poca luz: mantén la cámara estáble + Escaneo de dispositivos BLE + Sugerencia: ajusta el brillo estándar al nivel mínimo antes de iniciar la cámara. + Utilizar Saltwater para el cálculo de la profundidad + Mostrar o no un icono en pantalla para activar o desactivar la detección de rostros + Activar detección de rostro + Detección de rostro desactivada + Mostrar icono de autonivelación + Mostrar o no un icono para activar o desactivar la autonivelación. Si se activa la función de autonivelación, las fotos se rotarán para que se nivelen automáticamente con el horizonte. + Activar autonivelación + Desactivar autonivelación + Si se muestra un icono para activar o desactivar el timbre fotográfico + Activar timbre fotográfico + Desactivar timbre fotográfico + Timbre fotográfico activado + Timbre fotográfico desactivado + Mostrar texto personalizado para el icono de timbre fotográfico + Si se muestra un icono para especificar el texto personalizado a estampar en la foto + Mostrar el icono de bloqueo de balance de blancos automático + Si se muestra un icono para bloquear o desbloquear el balance de blancos automático + Bloquear balance de blancos + Desbloquear balance de blancos + Balance de blancos bloqueado + Balance de blancos desbloqueado + Mostrar el icono de bloqueo de exposición automática + Si se muestra un icono para bloquear o desbloquear la exposición + Mando a distancia Bluetooth LE… + Panorama + Activar mando a distancia Bluetooth LE + Activar mando a distancia Bluetooth LE (BLE) + Mostrar icono de datos de localización de la tienda + Apagado + Si esta opción está activa, se dibujarán rayas de cebra en la pantalla que mostrarán dónde está sobreexpuesta la vista preliminar de la cámara. +\n%s + 80% + Ciclo de flash + BLE no está soportado + Bluetooth no soportado. + Si se muestra un icono para activar o desactivar los datos de localización (geoetiquetado) + Almacenar datos de ubicación + Intensidad (Media) + Apagado + Pico de enfoque + Apagado + Qué color utilizar para resaltar los bordes enfocados +\n%s + Resto + Previsualización de cámara… + Si se muestra un icono para ver las opciones de flash, en lugar de mostrar las opciones de flash en el menú emergente. Ten en cuenta que la linterna no está disponible si se utiliza este icono. + Permitir RAW para el horquillado de exposición + ft + Muestra el diálogo de Novedades + Algoritmo de modo borde + Algoritmo que el controlador de la cámara debe utilizar para aplicar la mejora de bordes. Esta función mejora la nitidez y los detalles de la imagen capturada. (Este ajuste se ignora en el modo de fotografía NR.) +\n %s + Procesando ajustes… + Algoritmo de reducción de ruido + Algoritmo que el controlador de la cámara debe utilizar para aplicar la reducción de ruido. Esta función intenta mejorar la calidad de la imagen eliminando el ruido excesivo añadido por el proceso de captura, especialmente en condiciones de oscuridad. (Tenga en cuenta que esto no está relacionado con el modo de foto con reducción de ruido, y de hecho este ajuste se ignora en el modo de foto NR). +\n%s + Estándar + Rápido + Asistente de enfoque + Si se debe hacer zoom al ajustar la distancia de enfoque manual +\n%s + Apagado + Aumentar o disminuir la compensación de exposición + Previo + 0.5s + 2GB + 5GB + 9GB + Mejora de contraste HDR + Cuándo utilizar un algoritmo de mejora de contraste para HDR. Esto puede mejorar la apariencia en casos en que haya un rango dinámico muy alto en la escena, y también da un aspecto HDR a los resultados. +\n%s + Apagado + Inteligente + Siempre + Formato de video + Formato de archivo de vídeo, audio y códecs +\n%s + Estándar + Mostrar ícono de flash + Encendido + Colores RGB + Preferir dirección a coordenadas GPS + Conectado a distancia + Dispositivo desconocido + Tipo de dispositivo remoto + Mínimo + Siguiente + Desactivar detección de rostro + Detección de rostro activada + Panorama + Mostrar dirección si es posible, además de las coordenadas GPS + Apagado + Alta calidád + Dejar de almacenar datos de localización + Mostrar un histograma + 2x + Administrador de ajustes + Error al guardar la configuración + Desbloquear exposición + Atenuar la pantalla si el mando se desconecta + Para carcasas subacuáticas, mejora la precisión si se selecciona el tipo de agua correcto. + Usar direcciones + No mostrar dirección + 4x + 2 (2:1) + MPEG4 H264 + MPEG4 HEVC + 3GPP + JPEG + PNG + Normal + Mostrar icono de timbre en foto + 70% + 90% + 93% + 98% + Permitir RAW para el horquillado de enfoque + Si la opción RAW debe aplicarse también para el modo fotográfico de horquillado de exposición (o para el modo HDR cuando \"Guardar todas las imágenes para el modo HDR\" está activado). Si esta opción está desactivada, sólo se guardarán JPEG en esos modos de foto. + Si la opción RAW debe aplicarse también al modo de foto de horquillado de enfoque. Si esta opción está desactivada, sólo se guardarán JPEG en modos de horquillado de enfoque. + Si se muestra un icono en la pantalla para ver los modos RAW + Guardando imágenes… + Mando actual: + Terminar panorama + Panorama cancelado + Panorama de auto-recorte + Guardar imágenes originales + Para modo panorámico, si se eliminan los límites ondulados +\n%s + Para tomar una imagen panorámica, mantén tu dispositivo en posición vertical y pulsa tomar foto para iniciar la panorámica. A continuación, gira el dispositivo hacia la izquierda o la derecha para mover el círculo blanco centrado sobre el punto azul. Después de capturar cada nueva imagen, sigue girando el dispositivo para cubrir cada nuevo punto azul que aparezca. +\n +\nPulsa tomar foto al final para guardar la panorámica, o en el icono de la cruz para cancelar. +\n +\nTen en cuenta que las fotos panorámicas tardan en procesarse y guardarse. + Imágenes panorama originales + Si se guardan las imágenes originales en modo panorámico. Ten en cuenta que guardar las fotos panorámicas es más lento. También permite la opción de guardar un archivo XML que puede ser útil para reportar problemas con el modo panorama. +\n%s + ID + Selecciona el formato utilizado para guardar las fotos. Esto afecta las fotos \"estándar\" (no RAW). Sólo JPEG permite guardar metadatos Exif. Ten en cuenta que el formato PNG no es realmente sin pérdidas, sino que se convierte a partir de un JPEG con una calidad del 100%. +\n%s + No guardar imágenes originales + Error al crear imágen panorama + Cancelar panorama + Escanear + Mostrar ícono RAW + Ciclos de modos RAW + Texto con fondo sombreado + Guarda imágenes originales y el XML de depuración + Barra de búsqueda para cambiar la compensación de exposición + Cámara API + Activa esta opción si tu dispositivo tiene problemas al tomar fotos con los modos HDR o Expo (si las imágenes expo salen con las mismas exposiciones). Solo es relevante si la opción rápida HDR/expo de abajo también está activada. + Barra de búsqueda para cambiar el valor de preferencia actual + Activar captura ficticia HDR/expo fix + Los permisos de escaneo/conexión Bluetooth son necesarios para descubrir y conectarse a dispositivos de control remoto Bluetooth LE. + Cambiar cámara + Color de fondo de las rayas de cebra + Color a utilizar para la franja de fondo cuando se muestran las rayas de cebra. +\n%s + Negro + Naranja + Transparente + Blanco + Ultra-ancho + ícono de cámaras múltiples + Si está activado, utiliza botones separados para cambiar entre la cámara frontal y traseras, y para cambiar entre varias cámaras delanteras y traseras. Si está desactivado, el icono de cambio de cámara pasará por todas las cámaras. + Mostrar ID de la cámara + Mostrar número de identificación de la cámara actual en pantalla + Permitir acciones de pulsación larga + Permitir acciones de pulsación larga (por ejemplo, pulsación larga en galería para cambiar donde guardar). + Velocidad de cuadro + Guardar guiñada, cabeceo y balanceo del dispositivo en el comentario Exif de usuario de la foto (sólo en formato JPEG) + Guardar guiñada, cabeceo y balanceo + Tasa de bits + Cámara lenta + Apertura + Rojo + Cámara externa + Cambiar a cámara externa + Cambiar entre cámaras múltiples + 4K UHD + Selecciona Cámara a API para activar funciones adicionales como los modos manuales para la exposición, el enfoque y el balance de blancos, junto con RAW (si el dispositivo lo permite). El cambio de la API provocará un reinicio. +\n%s + Cámara API original + Cámara a API + Tomar fotos/vídeos cuando se detecta un ruido, o por orden de voz. Cuando está activado, utiliza el botón del micrófono en pantalla para iniciar/detener la escucha. +\n%s + Color usado para la franja de primer plano cuando se muestran rayas de cebra. +\n%s + Toca para enfocar y pulsa el botón blanco de la cámara para tomar fotos. +\n +\nPara desactivar el brillo máximo de la pantalla, consulta Ajustes/Guía en pantalla/\"Forzar brillo máximo\". Para guardar en tarjetas SD en Android 5+, consulta Ajustes/Más controles de la cámara/\"Marco de acceso al almacenamiento\". Para obtener más ayuda, haz clic en \"Ayuda en línea\" desde Ajustes. + 1.8 + 2.0 + 2.1 + 2.2 + 2.3 + 2.4 + 2.6 + Si es posible, obtener la dirección a partir del GPS. Ten en cuenta que si está activada, esta opción requiere que tu dispositivo transmita los datos de ubicación a través de Internet a terceros para convertir las coordenadas GPS en una dirección. Consulta https://developer.android.com/reference/android/location/Geocoder . Esta función no ofrece garantías de disponibilidad o precisión. Los resultados son aproximados y no se garantiza que sean significativos o correctos +\n%s + sRGB + Gamma + Valor gamma de vídeo + Valor gamma a utilizar para vídeo si el perfil de imagen de vídeo está configurado como Gamma +\n%s + 1.9 + Atenúar solamente los botones virtuales de navegación en pantalla + Opacidad de imagen Ghost + Valor alfa usado para imágenes Ghost. Un valor más bajo significa más transparente, más alto significa más opaco. +\n%s + Color de las rayas de cebra en primer plano + Seleccionar mando remoto + 2.8 + REC709 + 1.6 + Dispositivo desconocido (permiso de conexión a bluetooth no disponible) + Extensión: Auto + X-HDR + Extensión: HDR + Modo X-Night + Extensión: Noche + Modo X-Bokeh + Extensión: Bokeh + Modo X-Bty + Extensión: Belleza / Retoque facial + Licencias de código abierto + Cámara + Cámara es © 2013-2019 Mark Harman, publicada bajo la GPL v3 o posterior. Toca aquí para ver el texto completo de la licencia. + íconos Material Design de Google + Atrás + Cámara utiliza los iconos Material Design de Google (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , https://google.github.io/material-design-icons/) bajo la licencia Apache versión 2.0. Algunos iconos incluyen modificaciones. Toca aquí para ver el texto completo de la licencia. + Siguiente + Omitir + LENS + Modo X-Auto + No remover datos EXIF del dispositivo + Remover datos EXIF del dispositivo + Remover excepto fecha/hora + Mapeado tonal HDR + Algoritmo para el mapeado tonal en el modo de foto HDR +\n%s + Abrazadera simple + Exponencial + Estándar + Remover datos EXIF del dispositivo + Si deseas remover metadatos EXIF del dispositivo de las fotos JPEG. Esto no eliminará las etiquetas EXIF aplicadas por otros ajustes que aplican metadatos EXIF (por ejemplo, ubicación/etiquetado). Esas otras opciones son independientes y anularán este ajuste. RAW/DNG y los vídeos no son afectados. +\n %s + + DEBES ACTIVAR EL INTERRUPTOR DE PRIVACIDAD + YA QUE LA CÁMARA NO ESTÁ DISPONIBLE ;-) + + POR FAVOR ESPERA 5 SEGUNDOS PARA TU CÁMARA + PARA QUE SE CARGUE YA QUE ACABA DE SER HABILITADA + \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml new file mode 100644 index 000000000..98db80f9d --- /dev/null +++ b/app/src/main/res/values-eu/strings.xml @@ -0,0 +1,601 @@ + + + Auto-egonkortzea ez da +\nonartzen gailu honetan + Desblokeatuta + Pantaila blokeatuta dago +\npasatu hatza desblokeatzeko + Argazkia ezabatuta + GPS kokalekua ez dago erabilgarri + Argazkia ateratzeak huts egin du + Argazkia ateratzen + Kameraren aurrebista hasteak huts egin du + Auto-egonkortzeak huts egin du + RAW argazkia gordetzeak huts egin du + Argazkia gordetzeak huts egin du + Barkatu + Grabatzen + Bideoa grabatzeak huts egin du + Bideo-fitxategia gordetzeak huts egin du + Tenporizadorea hasi da + Tenporizadorea bertan behera utzi da + Esposizioa desblokeatuta + Esposizioa blokeatuta + Bideoa + Argazkia + Atzeko kamera + Aurreko kamera + Foku-distantzia + FPS + Bideoa gehienezko tamainara iritsi da + Bideoa gehienezko iraupenera iritsi da + Zerbitzaria hil da, bideoa geldituta + Errore ezezaguna, bideoa geldituta + ez da onartzen zure gailuan + Errorea, bideo-fitxategia hondatuta egon daiteke + Kamerara birkonektatzeak huts egin du + Bideoaren grabaketa eten da + Aukeratu beste karpeta bat + Garbitu karpetaren historia\? + Garbitu karpetaren historia + Gorde hemen: + Desaktibatuta + Aktibatuta + Ados (Mezu hau ez da gehiago erakutsiko) + Laster-menuaren ezarpenak + Ezarpenak + Kamera + Ez dago galeria aplikaziorik + Mugagabea + Auto-egonkortzea + Kamera-efektuak + m + Informazioa argazkian zigilatzeak huts egin du + Hatza pasa desblokeatzeko] + [BLOKEATUTA: + Libre + Zoom + ISO + BESTE APLIKAZIO BATEAN\? + KAMERA MARTXAN EGON DAITEKE + KAMERA IREKITZEAK HUTS EGIN DU. + Norabidea + Angelua + Zuri-balantzea + Eszena modua + Kolore-efektua + Gehienezko iraupena + Audioa desgaituta + Tenporizadorearen soinua + Tenporizadorea + Kamera-kontrolak + Aurpegi-hautematea + Hala ezartzen bada, gailuaren orientazioa ez da kontuan hartuko, eta argazkiaren/bideoaren orientazioa zehaztutako orientazioaren araberakoa izango da +\n%s + Blokeatu argazki/bideoaren orientazioa + Balio altuagoak argiarekiko sentikorragoa adierazten du (baliteke gailu batzuetan ez funtzionatzea) + Ezarri ISOa + Hautatu zuri-balantzea doitzeko ezarpena + Ezarri zuri-balantzea + Optimizatu argazkia eszena ezberdinentzat + Aplikatu eszena modua + Hautatuko kolore-efektua argazkian aplikatzen du + Aplikatu kolore-efektua + Irudiak biratuko dira automatikoki egonkortzeko (argazkiak soilik) (argazkiak motelago aterako dira, eta memoria gutxi duten gailuetan huts egin dezake) + Argazkiak/bideoak gordeko diren karpeta + Gordetzeko kokalekua + Zarata-mailaren sentikortasuna audioaren aukerarako (zarata handia) + Audio-kontrolaren sentikortasuna + Audio-kontrolaren aukerak + Bolumen-teklak + Erreproduzitu soinua argazkia ateratzean + Obturadorearen soinua + Gelditu pantaila argazkia atera ondoren, argazkia partekatzeko edo ezabatzeko aukerarekin + Gelditu argazkia atera ondoren + Atera argazkia aurrebista ukituz edo birritan sakatuz + Ukitu kapturatzeko + Kamera-kontrol gehiago… + Ahots bidezko tenporizadorearen atzerako kontakteta + Hasi bideoa grabatzen + Kokalekuaren baimena ez dago eskuragarri + Mikrofonoaren baimena ez dago eskuragarri + Karpeta hau gordetzeko ezgai + Hautatu gordetzeko kokalekua + Karpeta badago + Karpeta sortzeak huts egin du + Jarri izen berria karpetari + Ezin da karpeta honetan sartu + Egin dohaintza proiektua laguntzeko + Abiarazi Cameraren webgunea nabigatzailean + Bestelako ezaugarriak gaitzen ditu, hala nola eskuzko esposizio-moduak, fokatzea, zurien oreka, RAWekin batera (gailuarekin bateragarria bada), baina baliteke gailu guztietan behar bezala ez funtzionatzea (berrabiaraziko da) + Erabili Camera2 API + Berrezarri ezarpenak + Aplikazioaren eta arazketaren informazioa + Honi buruz + Ziur kameraren ezarpen guztiak lehenetsitako balioetara ezarri nahi dituzula\? + Camerako ezarpen guztiak lehenetsitako balioetara berrezartzen ditu + Kopiatu arbelera + Ez erabilgarri + Erabilgarri + Galeria + Atera argazkia + Fokatze modua + Blokeatu esposizioa + Esposizioa + Aldatu aurreko kamerara + Flash modua + Aldatu argazki modura + Aldatu bideo modura + Aldatu atzeko kamerara + Igo karpeta + Partekatu argazkia + Ezabatu azkeneko argazkia + Ezin da karpeta honetan idatzi + Bideoaren grabazioa gelditu edota berrabiarazi egingo da (ikus beheko aukera) fitxategiaren gehienezko tamaina iristen denean (gutxi gorabehera). Kontuan izan Android gailu askok bideoetarako gehienezko tamaina dutela (normalean 2 GB edo 4 GB inguru), baina aukera honek balio jakin bat ezartzeko aukera ematen du. Kontuan izan aukera hau ezin dela erabili gailu baten barneko gehienezko memoria handitzeko. +\n%s + Grabatu audioa bideoa grabatzean + Grabatu audioa + Audio-kanalak + Audioa grabatzeko erabiliko den mikrofonoa +\n%s + Audio-iturburua + Flasha grabatu bitartean + Zehaztu mono edo estereo audioa grabatzeko (estereo gailu batzuetan soilik onartzen da) + Lineako laguntza + Bestelakoak + Gaituta baldin badago, flasha piztuko/itzaliko da bideoa grabatzean (kamera urrunetik grabatzen ari den jakiteko erabilgarria) + Erabili beharreko estiloa argazkietan testua zigilatzerakoan +\n%s + Behartu 4K UHD bideoa (gailu batzuetan soilik funtzionatzen du) + Bideoaren bit-emaria (g.g.b) + Bideoaren gehienezko iraupena + Bideoaren fotograma-abiadura (g.g.b.) + Ezarri bideoen gutxi gorabeherako bit-emaria (emari altuagoak kalitate hobea esan nahi du, baina diskoan leku gehiago hartzen du; bideo-grabazioak huts egin dezake bit-emaria onartzen ez bada) +\n%s + Bideo-grabazioa zehaztutako iraupenaren ondoren geldituko da +\n%s + Bideoaren gehienezko tamaina + Bideoa gehienezko iraupenera iritsi ondoren gelditu bada (ezarri bada), aukera honen bidez bideoa berrabiaraziko da, adierazitako zenbakiraino. +\n%s + Berrabiarazi bideoa gehienezko iraupenaren ondoren + Berrabiarazi gehienezko tamainan + Sortu azpititulu-fitxategia (.SRT) data eta ordua gordez; eta GPS informazioa kokaleku- edo norabide-datuak gaituta badaude +\n%s + Bideoaren azpitituluak + Gaitu bideo-egonkortzea + Bideo-bereizmena + Gorde argazkiak atzeko planoko harian (eragiketa azkarragorako) + Erabili atzeko planoko haria + Erabili beharreko letra-tamaina argazkiaetan testua zigilatzerakoan + Letra-tamaina + Kapturatzen… + Bideoa pausatuta + Argazkiak ateratzeko eta bideoak grabatzeko ikonoa erakutsi. Desautatu argazkiak beste metodo batzuen bidez egin nahi badituzu (adibidez, zure gailuak hardwarea obturatzeko botoia badu edo bolumen-teklak erabiltzen baditu). + Erakutsi \"Atera argazkia\" ikonoa + ordubete + 45 minutu + 30 minutu + 25 minutu + 20 minutu + 15 minutu + 12 minutu + 11 minutu + 10 minutu + 9 minutu + 8 minutu + 7 minutu + 6 minutu + 5 minutu + 4 minutu + 3 minutu + 2 minutu + minutu 1 + 30 segundo + 15 segundo + 10 segundo + 5 segundo + 3 segundo + Mugagabea + Sepia + Posterizatu + Bat ere ez + Negatiboa + Mono + Arbel beltza + Ura + Antzerkia + Ilunabarra + Kirolak + Elurra + Erretratua + Festa + Gaueko erretratua + Gaua + Paisaia + Su artifizialak + Auto + Hondartza + Barra-kodea + Jarduera + Eskuz + Epela + Ilunabarra + Itzala + Fluoreszente + Egun-argia + Auto + HDR irudia sortzeak huts egin du + uuuu-hh-ee (ISO 8601) + Lehenetsita + DNG (RAW) soilik + Estandarra eta DNG (RAW) + Ez + Prozesatzen… + Copyright + Irudiaren artista-etiketaren metadatuetan gordeko den testua (JPEG formatua soilik). (Utzi hutsik ezer ez agertzeko.) + Artista + Lehenetsita + Abiadura azkarra + erdialdean + pantailaren behealdean + pantailaren goialdean + pantailaren eskuinaldean + pantailaren ezkerraldean + aurpegiak + aurpegia + Dohaintza egin + Zer berri: + Arbel zuria + Gordetzeko kokalekua hona aldatu da: + DNG fitxategiek kameraren konprimitu eta prozesatu gabeko informazio guztia dute. +\n +\nKontuan izan galeriako aplikazio batzuk ez dituztela DNG fitxategiak ezagutzen. DNG irudiak Snapseed edo Lightroom bezalako irudi-editore espezializatuekin erabil daitezke. +\n +\nKontuan izan zenbait prozesatze-aukera, hala nola Zigilatu argazkiak eta Auto-egonkortzea, DNG ez diren (JPEG/etab.) irudiei soilik aplikatuko zaizkiela, eta ez DNG irudiei. + Gaituta badago, kamera blokeatutako pantailaren gainetik agertuko da (oraindik desblokeatu beharko duzu Ezarpenak, Galeria, eta abarretara sartzeko) + Erakutsi kamera blokeatuta dagoenean + Fitxategi-izenerako ordu-formatua + Bideoen fitxategi-izenak gordetzeko erabiliko den aurrizkia + Burutu auto-fokatzea hasterakoan + Testu-estiloa + Erabili beharreko letra-kolorea argazkietan testua zigilatzerakoan + Letra-kolorea + Zigilatu argazkiak pertsonalizatutako testuarekin + Pertsonalizatutako testua + GPS zigilatze formatua + Ordu-zigilatze formatua + Data-zigilatze formatua + Zigilatu argazkiak data eta denborarekin; baita GPS informazioarekin ere, kokapen-datuak gaituta badaude +\n%s + Zigilatu argazkiak + HDR modua erabilgarria da distira asko aldatzen duten argazkietarako. Esposizio ezberdinetan argazkiak ateratzen ditu, eta azken irudia sortzeko hauek konbinatzen ditu. +\n +\nKontuan izan HDR ez dela egokia mugimendu azkarreko eszenetarako, eta kolore-erreprodukzioak zehaztasuna galdu dezakeela. +\n +\nHDR moduan argazkiak ateratzea motelagoa izango da. + Erabili aurpegiko detekzioa fokatze-eremuen ordez + Ezarri 0 gisa lehenetsitako esposizioaren konpentsaziorako + Ezarri esposizioaren konpentsazioa + Esposizioaren konpentsazioa + Lehenetsia + Ez gorde jatorrizko irudiak + s + Gorde jatorrizko irudi guztiak (motela) + Gorde jatorrizko irudi bakarra + Bideoa gelditu da +\nBateria-maila baxuegia da + Leku libre nahikorik ez bideoa grabatzeko + Iluna + Kameraren errore larria + Obturazio-abiadura + Argia + HDR/espo argazkiak azkarrago ateratzeko aukera ematen du. Desgaitu hau zure gailuak HDR edo Espo moduekin argazkiak ateratzean arazoak baditu. + Autoargazkia + Grabatu bideoa + Auto-egonkortzeak automatikoki biratuko ditu argazkiak, maila berean ager daitezen. +\n +\nKontuan izan honek irudiek bereizmen txikiagoa izango dutela esan nahi duela (behar den biraketaren eta ebakiduraren eraginez). + Egin soinu ozena + Esan \"cheese\" + Gelditu audio-entzutea + Hasi audio-entzutea + Baimendu argazkiak bideoa grabatzean + Irudi hau irekitzeko ezgai + Hautatutako irudia + Ateratako azkeneko argazkia + Desaktibatuta + Auto + Desaktibatuta + 60Hz + 50Hz + Bistaratu iparrorratzaren norabide-lerroak + Erakutsi iparrorratzaren norabide-lerroak + Egonkorgailuaren kalibrazioa berrezarri da + Egonkorgailua kalibratuta + Berrezarri + Kalibratu + DRO + Esposizio-urkila + Espo {} + HDR + Estandar + Est + Argazki modua + Ez erakutsi berriro + Argazkien fitxategi-izenak gordetzeko erabiliko den aurrizkia + Iturburu-kodea + Lizentzia + Erabilera baldintzak + Egileak + Bideoa grabatzean, interfazea blokeatuta egongo da grabazioa ustekabean ez gelditzeko. Pasatu hatza pantaila desblokeatzeko. Kontuan izan bideo-grabazioa beti geldituko dela aplikazioa bigarren mailan sartu edo pantaila ezabatzen bada. + Blokeatu pantaila bideoa grabatzean + Gorde bideo-aurrizkia + Pantailaren interfazea… + Aurrebista biratzeko aukera (ez du eraginik izango ateratako argazkietan/bideoetan) +\n%s + Biratu aurrebista + Interfazearen kokapena + Aurrebistaren tamaina + Uneko ISO maila erakusten du. Flash automatiko moduan, flash-ikur batek adieraziko du noiz abiaraziko den flasha. (Camera2 API behar du.) + Erakutsi ISOa + Erakutsi zoom-kontrolaren graduatzailea + Erakutsi zoom-graduatzailearen kontrola + Erakutsi zoom-kontrolaren -/+ botoiak + Erakutsi zoomaren -/+ kontrolak + Erakutsi zooma + Murgiltze modua + Bistaratu maila-horizontal lerroa + Erakutsi angelu-lerroa + Bistaratu gailuaren uneko orientazio-angelua pantailan + Erakutsi angelua + Erakutsi memoria librea + Angelua/altitudea nabarmentzeko kolorea + Kamera ia nibelatuta dagoenean nabarmentzeko kolorea + Ebakitzeko gida batek zehaztutako aspektu-erlazioak adierazten duen laukizuzena erakusten du. Argazkia/bideoa aspektu-erlazio ezberdinarekin ebakitzeko asmoa baduzu erabilgarria da. WYSIWYG argazki-moduan edo bideo-moduan egotea eskatzen du. +\n%s + Erakutsi mozketa-gida + Sareta + Erakutsi sareta + Bistaratu uneko bateria-maila pantailan + Erakutsi bateria + Bistaratu uneko ordua pantailan + Erakutsi ordua + Bistaratu gailuaren iparrorratzaren norabidea pantailan + Erakutsi iparrorratzaren norabidea + Gaituta badago, pantaila ez da itzaliko kameraren interfaze nagusia aktibo dagoen bitartean + Mantendu pantaila piztuta + Bistaratu ertza pantailan argazkia atera dela adierazteko + Erakutsi ertza argazkia ateratzean + Bistaratu mugitzen den miniatura-animazioa argazkia ateratzean + Erakutsi miniatura-animazioa + Ezarri gordetako JPEG edo WebP argazkien irudiaren kalitatea (lehenetsitako balioa 90%% da). Ez du eraginik PNG irudi-formatuan. +\n%s + Irudiaren kalitatea + Kamera-bereizmena + Kokapenaren ezarpenak… + Bideoen ezarpenak… + Argazkien ezarpenak… + Argazki eta bideoen ezarpenak + Behartu gehienezko distira + Gorde GPS kokapen-datuak argazkietan/bideoetan (argazkietan, kokapen-datuak JPEG eta DNG formatuetan soilik gorde daitezke) + Gorde kokapen-datuak (Geoetiketatzea) + RAW + Baimena behar da + BAIMENAK EZ ERABILGARRI + Gaituta badago, HDR argazki-modua erabiltzean, oinarrizko esposizioko hiru irudiak eta amaierako HDR argazkia gordeko dira. Kontuan izan horrek gordetzea motelduko duela, batez ere \"Zigilatu argazkiak\" edo Auto-egonkortzea bezalako aukerak erabiltzen badira. + Gorde HDR moduko argazki guztiak + Argazki-zigilatzea + GB + MB + Fitxategiaren gehienezko tamaina + Gelditu bideoaren grabaketa + Karpeta berria + Kokapen-datuak gaituta badaude, atera argazkia/bideoa kokapen-datuak erabilgarri badaude soilik + Eskatu kokapen-datuak + Gorde GPSaren iparrorratzaren norabidea argazkietan (JPEG formatua soilik) + Gorde iparrorratzaren norabidea + Esposizio-urkila moduaren irudi kopurua +\n%s + Esposizio-urkila + Arazketa aukerak + Arazketa aukerak + Kokapen-baimena behar da geoetiketatzerako (kokapen-datuak argazkietan eta bideoetan gordetzeko). Bluetooth LE urruneko kontroleko gailuetara konektatzeko ere kokapen-baimena behar da. + Mikrofonoaren baimena beharrezkoa da bideoa audioarekin grabatzeko, baita \"Audio-kontrola\" aukerak erabiltzeko ere + Biltegiratzearen irakurketa/idazketa baimena beharrezkoa da argazkiak gordetzeko + Kameraren baimena beharrezkoa da kamera gaitzeko + Bat ere ez + hh/ee/uuuu + ee/hh/uuuu + Argazki kopurua + Kamera + Arrunta + Argazki kopurua + Gehitu distantzia mugagabea + 200Mb/s + 150Mb/s + 100Mb/s + 90Mb/s + 80Mb/s + 70Mb/s + 60Mb/s + 50Mb/s + 40Mb/s + 30Mb/s + 20Mb/s + 15Mb/s + 10Mb/s + 9Mb/s + 8Mb/s + 7Mb/s + 6Mb/s + 5Mb/s + 4Mb/s + 3Mb/s + 2Mb/s + 1Mb/s + 500kb/s + 200kb/s + 100kb/s + Lehenetsita + Prozesatu gabea + Kanpoko mikrofonoa (baldin badago) + Begi gorriak + Flasha aktibatuta + Flash auto + Flasha desaktibatuta + Abiadura + 200 + 150 + 100 + 50 + 40 + 30 + 25 + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + Zure gailuko iparrorratzak kalibratu egin behar du zehaztasuna hobetzeko. Horretarako, 8 mugimenduko irudi batean mugi daiteke gailua. +\n +\nUneko zehaztasuna: + Iparrorratzaren norabidea + Handia + Ertaina + Baxua + Ez fidagarria + Konpilazio-bertsioa + Desaktibatuta + Lehenetsia + 4x + 2x + Desaktibatuta + Bizkorra + Ezarpenak prozesatzen… + Zer Berri elkarrizketa-koadroa erakusten du + ft + Oinak + Metroak + Distantzia-unitatea + Ezezaguna + Linterna + segidarik ez + Aktibatuta + Desaktibatuta + %100 + %99 + %98 + %97 + %95 + %93 + %90 + %80 + %70 + Desaktibatuta + Desaktibatuta + RGB koloreak + Irekidura + Bideoari berrekin zaio + Gori + Hodeitsua + Argazki-zigilatzea desgaituta + Argazki-zigilatzea gaituta + Desgaitu argazki-zigilatzea + Gaitu argazki-zigilatzea + Desgaitu auto-egonkortzea + Gaitu auto-egonkortzea + Aurpegi-hautematea desgaituta + Aurpegi-hautematea gaituta + Desgaitu aurpegi-hautematea + Gaitu aurpegi-hautematea + Erakutsi aurpegi-hautematearen ikonoa + Eskuinentzako erabiltzaile-interfazea + Ezkerrentzako erabiltzaile-interfazea + Gelditzen dena + Gailu ezezaguna + PNG + WebP + JPEG + Berrezarri ezarpenak + Kameraren ezarpen guztiak fitxategi batean gordetzen ditu + Gorde ezarpenak + WebM (audiorik ez da onartzen) + 3GPP + MPEG4 HEVC + MPEG4 H264 + Lehenetsita + Bideo-formatua + Beti + Azkarra + Desaktibatuta + -3 (sentikortasun txikia) + -2 + -1 + 0 (lehenetsita) + +1 + +2 + +3 (sentikortasun handia) + 2.4 (12:5) + 2.35 (47:20) + 2.33 (21:9) + 2 (2:1) + 1.85 (37:20) + 1.78 (16:9) + 1.5 (3:2) + 1.4 (7:4) + 1.33 (4:3) + 1.25 (5:4) + 1 (1:1) + Bat ere ez + 9GB + 5GB + 2GB + 1GB + 500MB + 300MB + 200MB + 100MB + Gailuak lehenetsita + 2h + 1h + 30m + 20m + 10m + 5m + 2m + 1m + 30s + 20s + 15s + 10s + 5s + 3s + 2s + 1s + 0,5s + 10x + Errepikatu + Hurrengoa + Camera kamera-sentsorearen eta mikrofonoaren datuetara sartzen da, kamera gisa duen asmoa betetzeko. Mikrofonoa aukerako \"audio-kontrolerako\" ere erabiltzen da. +\nFitxategietarako sarbidea sortutako fitxategiak (argazkiak eta bideoak) gailuan gordetzeko behar da. +\nKokapen-baimena aukerako geoetiketen ezaugarrietarako behar da (argazki eta bideoetarako, zigilu-aukerak eta azpitituluak barne). Dagozkion aukerak gaitzen direnean, gailuaren kokapena argazki-/bideo-/azpititulu-fitxategietan gordeko da. Bluetooth urruneko kontroleko gailuetara konektatzeko ere kokapen-baimena behar da. +\nCamerak sistema eragilearen API ere erabiltzen duenez, pribatutasun-politika garrantzitsuak berrikusi behar dituzu, hala nola zure gailuarentzat, fabrikatzailearentzat, sistema eragilearentzat edota beste kontuentzat. Adibidez: +\n*Ahotsa kontrolatzeko aukerako aukerak Android-en ahotsa ulertzeko zerbitzua erabiltzen du. Aktibatuta dagoenean, baliteke audio-datuak Android-ek urruneko zerbitzarietara bidaltzea ahotsa ezagutzeko. +\n*Argazki-zigilurako edo bideo-azpitituluetarako \"helbideak\" aukerak Android Geocoder-en APIa erabiltzen du. Gaituta dagoenean, gailuak kokapen-datuak Internet bidez hirugarren bati transmititu behar dizkio (zure gailuan instalatutako backend zerbitzuen arabera). +\n*Zure gailuan hodeiko zerbitzuak bezalako aplikazioek/zerbitzuek automatikoki kargatu ditzakete zure gailuan gordetzen diren argazkiak eta bideoak. + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4b44a7232..c680c6d2e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,40 +1,41 @@ - - Camera + Appareil photo Paramètres - Fenêtre de paramètres - OK (ce message ne s\'affichera plus) - - Actif - Inactif - + Paramètres des pop-ups + OK (Ce message ne s\'affichera plus) + Activé + + Désactivé + Sélectionnez le dossier d\'enregistrement\u00A0: Effacer l\'historique des dossiers Effacer l\'historique des dossiers\u00A0? Sélectionnez un autre dossier Nouvel emplacement d\'enregistrement\u00A0: Enregistrement vidéo arrêté - fois + fois + Impossible de se reconnecter à l\'appareil photo Erreur, le fichier vidéo peut être corrompu - non supporté par votre appareil + non supporté par votre appareil + Erreur inconnue, la vidéo est arrêtée Erreur serveur, la vidéo est arrêtée La vidéo a atteint la durée max La vidéo a atteint la taille max Compensation d\'exposition - Images/seconde - Distance de focus + i/s + Distance de mise au point Infinie Caméra frontale Caméra arrière Photo Vidéo - Exposition bloquée - Exposition débloquée + Exposition verrouillée + Exposition déverrouillée Retardateur annulé - Mode rafale annulé + Mode répétition annulé Retardateur démarré Impossible d\'enregistrer le fichier vidéo Impossible d\'enregistrer la vidéo @@ -47,16 +48,15 @@ Impossible de prendre une photo La position GPS n\'est pas disponible Photo supprimée - Application de galerie non disponible + Pas d\'application de galerie disponible L\'écran est verrouillé\nbalayez pour déverrouiller - Déverrouiller + Déverrouillé Désolé, l\'auto-stabilisateur n\'est pas supporté\nsur cet appareil Audio désactivé Durée max Effet de couleur Mode scène - Balance des blancs - + Balance blancs Angle Direction IMPOSSIBLE D\'OUVRIR LA CAMÉRA. @@ -65,41 +65,39 @@ ISO Zoom Libre - [VERROUILLÉE\u00A0: - balayez pour déverrouiller] - - Impossible d\'ajouter les informations dans la photo - m - + [VERROUILLÉ : + Balayez pour déverrouiller] + Impossible d\'insérer les informations dans la photo + m + Effets photo Auto-stabilisateur Les photos seront pivotées de sorte qu\'elles soient automatiquement de niveau (photos seulement) (plus lent pour prendre des photos, et peut échouer sur les appareils avec trop peu de mémoire) Appliquer un effet couleur - Applique un effet couleur sur la photo - Appliquer le mode scène + Applique l\'effet de couleur sélectionné à la photo + Appliquer un mode scène Optimise la photo pour différentes scènes - Réglage de la balance des blancs - Choisissez un réglage pour la balance des blancs - Choisir l\'ISO + Définir la balance des blancs + Choisissez un réglage pour ajuster la balance des blancs + Définir l\'ISO Une valeur plus élevée signifie plus sensible à la lumière (peut ne pas fonctionner sur certains appareils) - Régler la compensation d\'exposition - Mettre à 0 pour la compensation de l\'exposition par défaut - Bloquer l\'orientation de la photo/vidéo + Définir la compensation d\'exposition + Définir à 0 pour la compensation de l\'exposition par défaut + Bloquer l\'orientation photo/vidéo Si elle est définie, l\'orientation de l\'appareil sera ignorée, et l\'orientation de la photo/vidéo sera l\'orientation spécifiée\n%s Détection des visages - Utilise la détection des visages au lieu des zones de focus - - Commandes de la caméra + Utiliser la détection des visages au lieu des zones de focus + Options de l\'appareil photo Retardateur - Retardateur sonore - Émet des bips pour le retardateur ou le délai du mode rafale + Bip du retardateur + Émet des bips pour le retardateur ou le délai du mode répétition Retardateur à voix - Énonce le compte à rebours pour le retardateur ou le délai du mode rafale (à partir de 60s) - Mode rafale - Intervale du mode rafale - Plus de paramètres… - Toucher pour capturer - Prendre une photo en touchant 1 ou 2 fois l\'aperçu + Énonce le compte à rebours pour le retardateur ou le délai du mode répétition (à partir de 60s) + Mode répétition + Intervalle du mode répétition + Options supplémentaires de l\'appareil photo… + Toucher pour photographier + Prendre une photo en touchant ou en double-cliquant sur l\'aperçu Mettre en pause après la prise de photo Mettre en pause l\'écran après avoir pris une photo, avec la possibilité de partager ou supprimer la photo Son de l\'obturateur @@ -110,19 +108,20 @@ Niveau de la sensibilité sonore pour l\'option contrôle audio (bruit fort) Dossier de stockage Dossier où sont stockés les fichiers photo/vidéo - Utilise le Storage Access Framework pour enregistrer les photos et vidéos + Utilise la Structure d\'accès au stockage pour enregistrer les photos et vidéos. Cela devrait être activé pour permettre la sauvegarde sur des cartes SD externes. Sur Android 10+, cette option doit être activée si vous voulez sauvegarder vos prises dans un dossier différent de DCIM. Préfixe du nom de photo Le préfixe est utilisé pour le nom de fichier des photos Préfixe du nom de la vidéo Le préfixe est utilisé pour le nom de fichier des vidéos - Afficher l\'application appareil verrouillé - Si activé, Camera s\'affichera toujours au-dessus de l\'écran de verrouillage (vous devez déverrouiller pour accéder aux paramètres, galerie, etc.) - Faire un auto-focus au démarrage - Active l\'auto-focus au démarrage de Camera. Si vous avez un problème de flash qui s\'allume au démarrage, désactivez cette option - Verrouiller l\'écran lors de l\'enregistrement vidéo + Afficher l\'Appareil photo quand verrouillé + Si activé, l\'Appareil photo s\'affichera toujours au-dessus de l\'écran de verrouillage (vous devrez toujours déverrouiller pour accéder aux paramètres, galerie, etc.) + Faire un focus auto au démarrage + Activer ou non la mise au point automatique au démarrage de l\'Appareil photo. Si vous avez un problème de flash qui s\'allume au démarrage, désactivez cette option + Verr. l\'écran lors de l\'enregistrement vidéo Lors de l\'enregistrement vidéo, l\'interface graphique sera verrouillée pour éviter d\'arrêter accidentellement l\'enregistrement. Balayez l\'écran pour déverrouiller. Notez que l\'enregistrement vidéo sera toujours arrêté si l\'application passe en arrière-plan ou si l\'écran est occulté. Pivoter l\'aperçu - Option pour faire pivoter l\'aperçu (n\'affecte pas les photos/videos originales)\n%s + Option pour faire pivoter l\'aperçu (n\'affecte pas les photos/videos résultantes) +\n%s Interface à l\'écran… Taille de l\'aperçu Emplacement de l\'interface utilisateur @@ -134,110 +133,114 @@ Afficher le curseur de zoom Affiche le curseur pour modifier le niveau de zoom Afficher les ISO - Affiche le niveau actuel de l\'ISO (nécessite l\'API Camera2) - Afficher la mémoire disponible - Affiche l\'espace mémoire disponible à l\'écran + Affiche le niveau actuel de l\'ISO (Nécessite l\'API Camera2.) + Afficher le stockage disponible + Affiche à l\'écran l\'espace de stockage restant sur l\'appareil Afficher l\'angle Affiche l\'angle d\'orientation actuel de l\'appareil à l\'écran Montrer la ligne d\'angle - Affiche une ligne de niveau horizontal - Couleur de surbrillance de la ligne d\'angle - Met la ligne d\'angle en surbrillance lorsque l\'appareil est presque de niveau - Afficher la boussole de direction - Affiche la boussole de direction de l\'appareil à l\'écran + Affiche une ligne de niveau horizontale + Couleur de surbrillance de l\'angle/altitude + Couleur de surbrillance lorsque la caméra est presque à niveau + Afficher la direction de la boussole + Affiche la direction de la boussole de l\'appareil sur l\'écran Afficher l\'heure Affiche l\'heure actuelle à l\'écran Afficher la batterie Affiche le niveau actuel de la batterie à l\'écran Afficher une grille - Grille + Grille + Afficher un guide de recadrage - Un guide de recadrage affiche un rectangle montrant à quoi le rapport d\'aspect spécifié ressemble - utile si vous prévoyez de recadrer la photo/vidéo après un ratio d\'aspect différent. Nécessite le mode photo WYSIWYG, ou d\'être en mode vidéo\n%s - Afficher les messages d\'information - Affiche les messages d\'informations à l\'écran + Un guide de recadrage affiche un rectangle montrant à quoi ressemble le ratio spécifié - utile si vous prévoyez de recadrer la photo/vidéo par la suite à un ratio différent. Nécessite le mode photo WYSIWYG (Ce que Vous Voyez C\'est Ce que Vous Obtenez) ou être en mode vidéo. +\n%s + Afficher les messages d\'info + Afficher ou non les messages d\'info temporaires Voir l\'animation des vignettes - Affiche l\'animation des vignettes lorsque vous prenez une photo - Ajouter une bordure à la photo + Affiche une animation de vignette en mouvement lors de la prise d\'une photo + Afficher une bordure lors prise photo Affiche une bordure à l\'écran pour indiquer la prise d\'une photo Garder l\'écran allumé - Si activé, l\'appareil ne se mettra pas en veille tant qu\'Camera sera actif + Si activé, l\'appareil ne se mettra pas en veille tant que l\'interface utilisateur de l\'Appareil photo sera actif Forcer la luminosité maximale - Affichage de l\'écran avec une luminosité au maximum, plutôt que la valeur par défaut du périphérique - + Force l\'affichage de l\'écran à être au maximum de sa luminosité, plutôt qu\'à la valeur par défaut de l\'appareil Paramètres photo et vidéo Paramètres photo… Paramètres vidéo… - Paramètres de géocodage… - Résolution de l\'appareil photo + Paramètres de localisation… + Définition de la caméra Qualité de l\'image - Réglez la qualité des photos enregistrées (la valeur recommandée est 90 %%)\n%s - Stocker les données de position (Géocodage) - Enregistre la position GPS dans les photos/videos + Définir la qualité d\'image des photos JPEG ou WebP enregistrées (la valeur par défaut est de 90 %%). N\'a pas d\'effet pour le format d\'image PNG. +\n%s + Stocker données localisation + Enregistre les données de localisation GPS dans les photos/vidéos (pour les photos, les données de localisation ne peuvent être stockées que dans les formats JPEG et DNG) Stocker la direction de la boussole - Stocke la direction GPS de la boussole dans les photos - Données de position indispensables - Prendre des photos/vidéos uniquement si les données de position sont activées et disponibles - Incrustation photo - Incruste sur les photos la date, l\'heure et la position GPS si les informations de position/direction sont activées\n%s + Enregistre la direction GPS de la boussole dans les photos (format JPEG seulement) + Exiger des données de localisation + Si les données de localisation sont activées, ne prendre une photo/vidéo que si les données de localisation sont disponibles + Insérer des données dans les photos + Incruster des données sur les photos : date et heure ainsi que les coordonnées GPS si les données de localisation/direction sont activées +\n%s Format de la date Format de l\'heure - Format GPS + Format des données GPS Texte personnalisé - Incruste un texte personnalisé sur la photo + Incruster un texte personnalisé sur la photo Taille de la police - Taille de la utilisée lors de l\'incrustation de texte sur les photos\n%s + Taille de la police utilisée lors de l\'incrustation de texte sur les photos Couleur de la police - Couleur de la police utilisée pour l\'incrustation de texte sur les photos\n%s - Format du texte - Format du texte utilisé pour l\'incrustation de texte sur les photos\n%s - Résolution vidéo - Forcer le format vidéo 4K UHD (experimental) - Active la résolution 3840x2160 pour l\'enregistrement vidéo sur l\'appareil photo arrière - cela ne fonctionnera que si votre appareil le prend en charge (et peut se bloquer le cas échéant\u00A0!) - Activer la stabilisation vidéo - La stabilisation vidéo réduit les tremblements dûent aux mouvements de la caméra à la fois dans l\'aperçu et dans les vidéos enregistrées - Débit des vidéos (approx.) - Règle le débit approximatif des vidéos (plus élevé signifie une meilleure qualité, mais prend plus d\'espace disque, et peut entraîner un échec de l\'enregistrement vidéo s\'il n\'est pas pris en charge)\n%s - Nombre d\'image de la vidéo (approx.) - Définir le nombre d\'image par seconde (IPS) des vidéos (en fonction de votre appareil le nombre d\'IPS peut être aproximatif et pourrait ne pas atteindre le maximum. Un mauvais réglage peut entraîner l\'échec de l\'enregistrement vidéo s\'il n\'est pas pris en charge)\n%s + Couleur de la police utilisée pour l\'incrustation de texte sur les photos + Style du texte + Style du texte utilisé pour l\'incrustation de texte sur les photos +\n%s + Définition de la vidéo + Forcer la vidéo 4K UHD (ne fonctionne que sur certains appareils) + Activer la définition 3840x2160 pour l\'enregistrement vidéo avec la caméra arrière - cette option est un bidouillage qui peut permettre aux appareils 4K sur les caméras 4K qui n\'exposent pas l\'option à des applications de caméra tierces. Le fonctionnement de cette option n\'est pas garanti, veuillez la tester avant de travailler. + Activer la stabilisation vidéo numérique + La stabilisation vidéo réduit les tremblements dus aux mouvements de la caméra à la fois dans l\'aperçu et dans les vidéos enregistrées. Cela peut être inutile si votre appareil prend en charge la stabilisation optique de l\'image (OIS). + Débit des vidéos (environ) + Définir le débit approximatif des vidéos (plus élevé signifie une meilleure qualité, mais prend plus d\'espace disque ; et peut entraîner un échec de l\'enregistrement vidéo si le débit n\'est pas pris en charge) +\n%s + Fréquence d\'images vidéo (environ) + Définir la fréquence d\'images (FPS) des vidéos (peut être approximative, non garantie, et peut entraîner l\'échec de l\'enregistrement vidéo si la fréquence d\'images n\'est pas prise en charge). Veuillez vérifier les vidéos produites pour déterminer la bonne fréquence d\'images. Notez que ce paramètre est ignoré pour les vidéos au ralenti. +\n%s Durée maximale de la vidéo L\'enregistrement vidéo s\'arrêtera après la durée spécifiée\n%s - Nombre de vidéos après la durée maximale + Redémarrer vidéo après durée maximale Si la vidéo est stoppée après avoir atteint la durée maximale sélectionnée (si activé), alors l\'enregistrement va reprendre autant de fois que le nombre spécifié dans ce paramètre\n%s - Taille maximale d\'un fichier vidéo - L\'enregistrement vidéo va s\'arrêter/ou redémarrer (voir option ci-dessous) quand la taille maximale approximative du fichier est atteinte. Notez que la plupart des périphériques Android ont une taille maximale pour les vidéos (typiquement entre 2 et 4 Go), mais cette option permet de choisir une valeur\n%s - Redémarrer sur la taille maximale - Si activé, redémarrage automatique quand la taille maximale de fichier est atteinte (soit la valeur par défaut du périphérique, soit la valeur spécifiée) - Enregistrement audio - Enregistre aussi l\'audio lors de l\'enregistrement vidéo + L\'enregistrement vidéo va s\'arrêter et/ou redémarrer (voir option ci-dessous) quand la taille maximale (approximative) du fichier est atteinte. Notez que la plupart des périphériques Android ont une taille maximale pour les vidéos (généralement autour de 2 Go ou 4 Go), mais cette option permet de choisir une valeur spécifique. Notez que cette option ne peut pas être utilisée pour augmenter le maximum intégré à un appareil. +\n%s + Redémarrer à la taille maximale + Redémarrer automatiquement ou non lorsque la taille maximale du fichier est atteinte (que ce soit la taille maximale par défaut du dispositif ou celle spécifiée par l\'utilisateur) + Enregistrer l\'audio + Enregistre l\'audio lors de l\'enregistrement vidéo Source audio - Sélectionne l\'entrée audio pour l\'enregistrement\n%s - Format audio - Spécifiez mono ou stéréo pour l\'enregistrement audio (stéréo uniquement pris en charge sur certains appareils)\n%s - Clignoter pendant l\'enregistrement vidéo - Si activé, le flash se met en marche/arrêt lors de l\'enregistrement vidéo (peut être utile pour indiquer que l\'appareil est en train d\'enregistrer à distance) - + Microphone à utiliser pour l\'enregistrement audio. Notez que le comportement des options dépend de comment l\'option est implémentée sur votre appareil. +\n%s + Canaux audio + Spécifier mono ou stéréo pour l\'enregistrement audio (stéréo uniquement pris en charge sur certains appareils) + Flash pendant enregistrement vidéo + Si activé, le flash se mettra à clignoter lors de l\'enregistrement vidéo (peut être utile pour indiquer que l\'appareil est en train d\'enregistrer à distance) Divers Aide en ligne - Ouvre le site web de Camera dans votre navigateur - Faire un don pour soutenir le développement - Si vous aimez ce logiciel, n\'hésitez pas à faire un don. Vous pouvez le faire via l\'achat de mon «\u00A0application de don\u00A0» - Cliquer sur cette option va ouvrir la page de l\'application de don. Merci\u00A0! + Ouvre le site web de l\'application Appareil photo dans votre navigateur + Donner pour soutenir le développement + Si vous aimez cette application, n\'hésitez pas à faire un don. Vous pouvez le faire via l\'achat de mon « application de don » - Cliquer sur cette option va ouvrir la page de l\'application de don. Merci ! Utiliser l\'API Camera2 - Active l\'API Camera2 - permet d\'utiliser des fonctionnalités supplémentaires, mais reste encore expérimental (peut provoquer un redémarrage) + Active des fonctions supplémentaires telles que les modes manuels pour l\'exposition, la mise au point, la balance des blancs, ainsi que le mode RAW (s\'il est pris en charge par l\'appareil), mais peut ne pas fonctionner correctement sur tous les appareils (provoquera un redémarrage) À propos - Informations de l\'application et de debug + Infos sur l\'appli et de debogage Réinitialiser les paramètres - Réinitialise tout les paramètres aux valeurs par défaut d\'Camera - Êtes-vous sûr de vouloir réinitialiser tout les réglages d\'Camera par défaut\u00A0? - + Réinitialise tous les paramètres de l\'Appareil photo aux valeurs par défaut + Êtes-vous sûr de vouloir réinitialiser tous les réglages de l\'Appareil photo vers ceux par défaut ? Disponible Non disponible Copier dans le presse-papier - Prendre une photo - Gallerie + Galerie Exposition - Exposition bloquée + Exposition vérouillée Mode focus Mode flash Utiliser la caméra frontale @@ -246,70 +249,58 @@ Passer en mode photo Effacer la dernière photo Partager la photo - Dossier parent Nouveau dossier - Ne peux pas écrire dans ce dossier - Ne peux pas accèder à ce dossier - Nommer le nouveau dossier + Impossible d\'écrire dans ce dossier + Impossible d\'accèder à ce dossier + Entrez le nom du nouveau dossier Impossible de créer le dossier Dossier déjà existant - Sélectionnez un emplacement pour les enregistrements - Storage Access Framework annulé - + Structure d\'accès au stockage (SAF) annulée Permission «\u00A0Microphone\u00A0» non disponible Permission «\u00A0Position\u00A0» non disponible - - Démarrer l\'enregistrement de la vidéo - Arrêter l\'enregistrement de la vidéo - + Démarrer l\'enregistrement vidéo + Arrêter l\'enregistrement vidéo Taille de fichier max - Mo - Go - + Mo + + Go + Démarrer l\'écoute de l\'audio Arrêter l\'écoute de l\'audio Dire «\u00A0cheese\u00A0» Faire un bruit fort - L\'auto-stabilisateur va automatiquement faire pivoter les photos pour qu\'elles - apparaîssent de niveau.\n\nNotez que cela implique que les images apparaîtront avec une résolution légèrement - inférieure (en relation avec la rotation et le rognage qui est nécessaire). - - Ne plus montrer + L\'auto-stabilisateur va automatiquement faire pivoter les photos pour qu\'elles apparaîssent à niveau. +\n +\nNotez que cela implique que les images apparaîtront avec une définition légèrement inférieure (à cause de la rotation et du rognage nécessaire). + Ne plus afficher Impossible d\'enregistrer la photo RAW - Le mode HDR est utile pour les prises de vue avec une grande variation de luminosité. Il - fonctionne en prenant plusieurs prises avec des expositions différentes, puis en les combinant pour produire - l\'image finale\nNotez que HDR n\'est pas approprié pour les scènes de mouvements et peut réduire la précision - de la reproduction des couleurs.\n\nPrendre des photos en mode HDR - sera également plus lent. - + Le mode HDR est utile pour les prises de vue avec une grande variation de luminosité. Il fonctionne en prenant plusieurs prises avec des expositions différentes, puis en les combinant pour produire l\'image finale. +\n +\nNotez que HDR n\'est pas approprié pour les scènes avec des mouvements rapides et peut réduire la précision de la reproduction des couleurs. +\n +\nPrendre des photos en mode HDR sera également plus lent. Mode photo HDR - Std + Std + Standard Utiliser une tâche de fond Permettre d\'enregistrer les photos dans une tâche de fond (opération plus rapide) - Incrustations photo - Enregistrer toutes les images en mode HDR - Si vous l\'activez, en mode photo HDR les trois images utilisées - seront enregistrées en supplément de la photo finale HDR. Notez que ceci ralentira l\'enregistrement, plus - particulièrement si les options «\u00A0Incrustation photo\u00A0» ou «\u00A0Auto-stabilisateur\u00A0» sont - utilisées. - + Incrustation photo + Enregistrer images du mode HDR + Si activé, en mode photo HDR les trois images utilisées seront enregistrées en supplément de la photo finale HDR. Notez que ceci ralentira l\'enregistrement, plus particulièrement si les options « Incrustation photo » ou « Auto-stabilisateur » sont également activées. RAW Format de l\'heure pour le nom de fichier - Les fichiers DNG contiennent toutes les informations non compressées ni traitées de votre - caméra.\n\nLa plupart des applications d\'affichage d\'image ne reconnaissent pas le DNG. Vous devrez utiliser une app - spécialisée\n\nNotez que certaines options comme «\u00A0Incrustation photo\u00A0» ou - «\u00A0Auto-stabilisateur\u00A0» ne s\'appliquent que pour des images JPEG et pas DNG.\n\nLes fichiers DNG - utilisent beaucoup d\'espace disque, un explorateur de fichiers peut être utilise pour faire le ménage.\n\nLes - fichiers DNG ne sont enregistrés que dans le mode photo standard. - - + Les fichiers DNG contiennent toutes les informations non compressées et non traitées de votre appareil photo. +\n +\nN.B. : la plupart des applications d\'affichage d\'image ne reconnaissent pas le format DNG. Vous aurez besoin d\'un éditeur d\'images spécialisé pour exploiter les images dans ce format. +\n +\nCertaines options de traitement comme l\'« Incrustation photo » ou l\'« Auto-stabilisateur » ne s\'appliquent que pour les images qui sont dans un format différent de DNG (JPEG, etc.). Illimité 3 secondes 5 secondes @@ -334,51 +325,45 @@ 30 minutes 45 minutes 1 heure - Par défaut - Par défaut - aaaa-mm-jj + aaaa-mm-jj (ISO 8601) jj/mm/aaaa mm/jj/aaaa Aucun - - Flash éteint + Flash désactivé Flash auto - Flash forcé + Flash activé Torche Yeux rouges - Caméscope Micro externe (si présent) Source audio par défaut - Optimisé pour la voix - + Optimisé pour les appels vocaux Par défaut - 100kbps - 200kbps - 500kbps - 1Mbps - 2Mbps - 3Mbps - 4Mbps - 5Mbps - 6Mbps - 7Mbps - 8Mbps - 9Mbps - 10Mbps - 15Mbps - 20Mbps - 30Mbps - 40Mbps - 50Mbps - 60Mbps - 70Mbps - 80Mbps - 90Mbps - 100Mbps - + 100 kbit/s + 200 kbit/s + 500 kbit/s + 1 Mbit/s + 2 Mbit/s + 3 Mbit/s + 4 Mbit/s + 5 Mbit/s + 6 Mbit/s + 7 Mbit/s + 8 Mbit/s + 9 Mbit/s + 10 Mbit/s + 15 Mbit/s + 20 Mbit/s + 30 Mbit/s + 40 Mbit/s + 50 Mbit/s + 60 Mbit/s + 70 Mbit/s + 80 Mbit/s + 90 Mbit/s + 100 Mbit/s Désactivé 2x 3x @@ -393,32 +378,29 @@ 200x 500x Illimité - Pas de délai - 1s - 2s - 3s - 5s - 10s - 15s - 20s - 30s - 1m - 2m - 5m - 10m - 20m - 30m - 1h - 2h - - Par défaut - 100Mo - 200Mo - 300Mo - 500Mo - 1Go - + 1 s + 2 s + 3 s + 5 s + 10 s + 15 s + 20 s + 30 s + 1 min + 2 min + 5 min + 10 min + 20 min + 30 min + 1 h + 2 h + Par défaut de l\'appareil + 100 Mo + 200 Mo + 300 Mo + 500 Mo + 1 Go Aucun 1 (1:1) 1.25 (5:4) @@ -430,7 +412,6 @@ 2.33 (21:9) 2.35 (47:20) 2.4 (12:5) - +3 (très sensible) +2 +1 @@ -438,30 +419,519 @@ -1 -2 -3 (peu sensible) - Interface utilisateur pour gaucher Interface utilisateur pour droitier - - Texte ombré + Texte avec ombre Texte brut - - Off + Version + Camera est dérivée d\'Camera + Auteurs + Code source + Licence + Informations sur Caméra + Conditions d\'utilisation + (Votre voix peut être envoyée à des serveurs +\ndistants par Android pour effectuer +\nune reconnaissance vocale.) + Barre de réglage de la compensation de l\'exposition + Faire défiler les modes RAW + Modes du flash + Aperçu de l\'image… + Couleur à utiliser pour souligner les contours qui sont à la distance de mise au point +\n%s + Augmenter ou diminuer la compensation de l\'exposition + Luminance + Minimal + Selfie + Aqua + Log (Fin) + Camera utilise des icônes du Material Design de Google (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , https://google.github.io/material-design-icons/) qui sont sous licence Apache version 2.0. Certaines icônes ont été modifiées. Appuyez ici pour la licence complète. + whether a setting is turned on, e.g., \"Auto-stabilise: On\" + Touchez pour faire la mise au point, et appuyez sur le bouton d\'appareil photo blanc pour prendre des photos. +\n +\nPour désactiver la luminosité maximale de l\'écran, aller dans Paramètres/Interface à l\'écran/\"Forcer la luminosité maximale\". Pour enregistrer sur une carte SD sous Android 5+, aller dans Paramètres > Options supplémentaires de l\'appareil photo… > \"Structure d\'accès au stockage (SAF)\". Pour plus d\'aide, cliquez sur \"Aide en ligne\" dans les Paramètres. + Prendre une photo/vidéo lorsque un son est détecté. Quand cette option est activée, utilisez le bouton du microphone à l\'écran pour démarrer/arrêter l\'écoute. +\n%s + Sélectionner l\'API Camera2 pour activer des fonctions supplémentaires telles que les modes manuels d\'exposition, de mise au point, de balance des blancs, ainsi que le mode RAW (s\'il est pris en charge par l\'appareil). La modification de l\'API entraînera un redémarrage. +\n%s + Sélectionnez le format de fichier utilisé pour l\'enregistrement des photos. Cela concerne les photos \"standard\" (pas RAW). Seul le format JPEG permet de sauvegarder les métadonnées Exif. N.B : le format PNG ne permet pas d\'éviter véritablement les pertes, en effet il est converti à partir d\'un JPEG de qualité 100 %. +\n%s + Enregistrer les images d\'origine ainsi que le rapport XML + Enregistrer ou non les images originales en mode panoramique. Notez que cela ralentira l\'enregistrement des photos panoramiques. Permet aussi la possibilité d\'enregistrer un fichier XML qui peut être utile pour signaler des problèmes de panorama. +\n%s + Pour prendre une image panoramique, tenez votre appareil en orientation portrait, et cliquez pour prendre une photo afin de lancer le panorama. Ensuite, faites pivoter votre appareil vers la gauche ou vers la droite pour déplacer le cercle blanc centré sur le point bleu. Après la prise de chaque nouvelle image, continuez à faire tourner votre appareil pour couvrir chaque nouveau point bleu qui apparaît à son tour. +\n +\nCliquez sur l\'icône en forme de coche pour enregistrer le panorama, ou sur l\'icône en forme de croix pour l\'annuler. +\n +\nNotez que le traitement et l\'enregistrement des photos panoramiques peuvent prendre du temps. + Choisir si l\'option RAW doit ou non également s\'appliquer au mode bracketing de mise au point. Si cette option est désactivée, seuls les JPEG seront enregistrés en mode bracketing de mise au point. + Autorise RAW pour bracketing d\'expo + Autoriser RAW pour le bracketing de la mise au point + Choisir si l\'option RAW doit ou non également s\'appliquer au mode bracketing d\'exposition (ou au mode HDR lorsque \"Enregistrer toutes les images pour le mode HDR\" est activé). Si cette option est désactivée, seuls les JPEG seront enregistrés dans ces modes photo. + Afficher ou non une icône à l\'écran pour faire défiler les options flash, au lieu d\'afficher les options flash dans le menu contextuel. N.B. : la lampe torche ne fonctionne pas si cette icône est utilisée. + Couleur de soulignage de la mise au point + Si cette option est activée, des surbrillances seront affichées sur les bords (contours) au point. Cette option est principalement utile pour la mise au point manuelle, et peut être utilisée pour aider à déterminer quelles régions de l\'image sont au point. +\n%s + Soulignage de la mise au point + Afficher des zébrures + Si cette option est activée, des bandes zébrées seront dessinées à l\'écran, indiquant l\'endroit où l\'aperçu de la caméra est sur-exposé. +\n%s + Luminosité (Moyenne des min-max) + Kraken Smart Housing + Bracketing de la mise au point annulé + Algorithme mode amélioration bords + Algorithme que le pilote de la caméra doit utiliser pour appliquer l\'amélioration des bords. L\'amélioration des bords améliore la netteté et les détails de l\'image capturée. (Ce paramètre est ignoré en mode réduction de bruit (NR).) +\n%s + Afficher ou non le niveau sonore à l\'écran pendant l\'enregistrement vidéo + Afficher l\'indicateur niveau audio + Non traité + Profil logarithmique + Définir un profil d\'image standard ou plat pour le mode vidéo +\n%s + Profils d\'image vidéo + Permet une capture plus rapide des prises de vue du HDR/expo. Désactivez cette fonction si votre appareil a des problèmes pour prendre des photos en mode HDR ou Expo. + Activer la rafale rapide de HDR/expo + API Camera2 + Images d\'origine du panorama + En mode panoramique, suppression des bordures floues +\n%s + Rechercher + Télécommande actuelle : + Restant + Télécommande connectée + Baisser luminosité si télécommande se déconnecte + Recherche d\'appareils BLE + Type d\'appareil distant + Activer les télécommandes Bluetooth LE (BLE) + Activer le contrôle à distance par Bluetooth LE + Télécommande Bluetooth LE… + Afficher icône verr. expo. auto + Afficher icône verr. bal. blancs auto + Désactiver le stabilisateur automatique + Activer le stabilisateur automatique + Afficher ou non à l\'écran une icône permettant d\'activer ou de désactiver le stabilisateur automatique. Lorsque celui-ci est actif, les photos subiront une rotation pour être ajustées à une prise de vue horizontale. + Afficher icône stabilisateur auto + Mode réduct. bruit + WebM (audio non supporté) + Quand utiliser l\'algorithme d\'amélioration de contraste HDR. Celui-ci peut améliorer l\'image lorsque la scène contient une large gamme de contrastes, et donne au résultat une apparence spécifique de l\'HDR. +\n%s + Zoomer ou non lors du réglage de la distance de mise au point manuelle +\n%s + Ajouter une distance infinie + Bracketing de mise au point + Focus {} + Log (Très fort) + Log (Fort) + Log (Moyen) + Log (Faible) + Aucun fichier de dialogue trouvé sur cet appareil, l\'option d\'image rémanente n\'est pas prise en charge + Dernière photo prise + Superposer une image, pour aider à l\'alignement. +\n%s + Algorithmes pour aider avec le clignotement de la lumière. +\n%s + Suppression des bandes + Torche d\'écran + Étiquettes EXIF personnalisées + Grande vitesse + Sports + Sous-titres des vidéos + Afficher les lignes de direction de la boussole + Afficher les lignes de direction de la boussole + Afficher les lignes de niveau horizontales + Afficher les lignes de niveau + Étalonner le niveau d\'angle + Inverser en mirroir l\'image de l\'appareil photo frontal +\n%s + Effet miroir de l\'appareil photo frontal + Grave erreur de caméra + Vérification batterie critique + Nombre de pas à déduire/ajouter pour l\'image la plus sombre/brillante +\n%s + Nombre d\'images pour le mode bracketing d\'exposition +\n%s + Utiliser méthode de flash alternative + La permission d\'accès à la localisation est requise pour géolocaliser vos photos (stockage des données de localisation dans les photos et vidéos, incrustation et sous-titres inclus). Cette permission est également requise (du moins pour Android 11 et précédents) pour se connecter à des télécommandes Bluetooth LE. + NR + []]] + Veuillez cliquer ici pour obtenir des informations complètes sur les licences en ligne (s\'ouvre dans votre navigateur). + Licences en ligne + Icônes Material Design de Google + Camera est © 2013–2019 Mark Harman, diffusé sous la licence GPL v3 ou ultérieure. Appuyez ici pour voir le texte intégral de la licence. + Licences Open Source + Politique de confidentialité en ligne + Afficher la politique de confidentialité + Politique de confidentialité + API caméra d\'origine + API de la caméra + ID + Enregistrer les images d\'origine + Ne pas sauvegarder les images originales + Recadrage automatique du panorama + Échec de la création de l\'image panoramique + Panorama annulé + Annuler le panorama + Terminer le panorama + Enregistrement des images en cours… + Afficher à l\'écran une icône permettant de faire défiler les modes RAW + Afficher l\'icône RAW + Afficher l\'icône du flash + Activé + Désactivé + 100 % + 90 % + 80 % + 70 % + Désactivé + Intensité (Moyenne) + Valeur (Maximum) + Couleurs RGB + Désactivé + Afficher ou non à l\'écran l’histogramme des couleurs présentes +\n%s + Afficher un histogramme + Ne plus enregistrer la géolocalisation + Enregistrer la géolocalisation + Afficher ou non à l\'écran une icône permettant d\'activer ou de désactiver l\'insertion de la géolocalisation dans les métadonnées de l\'image + Afficher icône géolocalisation + Utiliser l\'eau salée pour les calculs de profondeur + Pour les boîtiers sous-marins, améliore la précision si le type d\'eau sélectionné est correct. + Astuce : ajustez le niveau de luminosité au minimum avant de lancer Camera. + Dispositif inconnu + Bluetooth non pris en charge. + BLE non pris en charge + Utiliser les adresses + Afficher ou non à l\'écran une icône permettant le verrouillage ou déverrouillage de l\'exposition automatique + Balance des blancs déverrouillée + Balance des blancs verrouillée + Déverrouiller la balance des blancs + Verrouiller la balance des blancs + Afficher ou non à l\'écran une icône permettant de verrouiller ou déverrouiller la balance des blancs automatique + Si possible, obtenir l\'adresse grâce à la localisation GPS (pour l\'incrustation sur les photos ou les sous-titres vidéo). N.B. : si cette option est activée, votre appareil transmettra les données de localisation à un tiers par Internet afin de convertir les coordonnées GPS en une adresse. Cf. https://developer.android.com/reference/android/location/Geocoder. Cette fonctionnalité ne garantit ni la disponibilité ni l\'exactitude. Les résultats obtenus sont des estimations, rien de garantit qu\'elles soient utiles ou correctes. +\n%s + Texte avec ombrage + Ne pas afficher l\'adresse + Préférer l\'adresse aux coordonnées GPS + Si possible, affiche l\'adresse en plus des coordonnées GPS + Afficher ou non une icône sur l\'écran permettant de définir un texte d\'incrustation personnalisé + Afficher l\'icône d\'incrustation de texte personnalisé + Incrustation désactivée + Incrustation activée + Désactiver l\'incrustation + Activer l\'incrustation + Afficher ou non à l\'écran une icône permettant d\'activer ou de désactiver l\'incrustation sur les photos + Afficher l\'icône d\'incrustation + Utilisé pour l\'altitude GPS lors de l\'incrustation sur les photos et dans les sous-titres vidéo +\n%s + Reconnaissance des visages désactivée + Reconnaissance des visages activée + Désactiver la reconnaissance des visages + Activer la reconnaissance des visages + Afficher ou non à l\'écran une icône permettant d\'activer ou de désactiver la reconnaissance des visages + Afficher l\'icône de détection des visages + Icônes en haut (portrait) + Faible luminosité + Normal + Format d\'image + Aucun fichier de dialogue trouvé, cette option n\'est pas disponible + Échec de la restauration des paramètres + Échec de la sauvegarde des paramètres + Paramètres sauvegardés + Cette option vous permet de sélectionner un des fichiers de paramètres que vous avez précédemment enregistrés. Soyez averti que la sélection d\'un fichier à charger écrasera tous les paramètres actuels ! + Restaure les paramètres précédemment enregistrés. Cela écrasera tous les paramètres actuels avec les paramètres sauvegardés ! + Restaurer les paramètres + Nom de la sauvegarde des paramètres + Enregistre tous les réglages de l\'Appareil photo dans un fichier + Enregistrer les paramètres + Gestionnaire des paramètres + Par défaut + Formats et codecs des fichiers audio et vidéo +\n%s + Format vidéo + Toujours + Intelligent + Désactivé + Amélioration du contraste HDR + 9 Go + 5 Go + 2 Go + 0,5 s + Précédent + 4x + 2x + Désactivé + Mise au point assistée + Haute qualité + Rapide + Désactivé + Par défaut + Algorithme que le pilote de la caméra doit utiliser pour appliquer la réduction du bruit. L\'algorithme de réduction du bruit tente d\'améliorer la qualité de l\'image en supprimant le bruit excessif ajouté par le processus de capture, en particulier dans des conditions d\'obscurité. (Notez que cela n\'est pas lié à la réduction du bruit du mode photo, et en fait ce paramètre est ignoré dans ce cas). +\n%s + Algorithme de réduction du bruit + Traitement des paramètres… + Afficher ou non des informations sur les nouvelles fonctionnalités et les améliorations lorsque l\'application a été mise à jour + Afficher les nouveautés + 150 + 100 + 50 + 40 + 30 + 25 + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + Nombre de photos + 20 + 15 + 12 + 10 + Pano + Panorama + Mode faible luminosité : veuillez maintenir l\'appareil immobile + Déverrouiller l\'exposition + 8 + 6 + 5 + 4 + 3 + 2 + Nombre de photos + DNG (RAW) seulement + Standard et DNG (RAW) + Non + Traitement… + Texte à enregistrer dans les métadonnées pour l\'étiquette droit d\'auteur (format JPEG uniquement). (Laisser vide pour aucune.) + Copyright + Texte à enregistrer dans les métadonnées pour l\'étiquette artiste (format JPEG uniquement). (Laisser vide pour aucune.) + Artiste + au centre + en bas de l\'écran + en haut de l\'écran + à droite de l\'écran + à gauche de l\'écran + visages + visage + Faire un don + Nouveautés : + Tableau blanc + Solariser + Sépia + Postériser + Aucun + Négatif + Mono + Tableau noir + Théâtre + Coucher de soleil + Photo stable + Neige + Portrait + Fête + Portrait de nuit + Nuit + Paysage + Feux d\'artifice + Auto + Lumière de bougie + Plage + Code barre + Action + Manuel + Chaud + Crépuscule + Ombrage + Incandescent + Fluorescent + Lumière du jour + Nuageux + Auto + Échec de la création d\'une image HDR + Échec de l\'initialisation de l\'écoute audio + Capture… + Reprendre l\'enregistrement vidéo + Mettre l\'enregistrement vidéo en pause + Reprise de la vidéo + Vidéo mise en pause + Affiche l\'icône pour prendre des photos et enregistrer des vidéos. Décochez si vous préférez prendre des photos avec une autre méthode (par ex., si votre appareil a un bouton déclencheur matériel, ou en utilisant les boutons de volume). + Afficher l\'icône « Prendre la photo » + Créer un fichier de sous-titres (.SRT) enregistrant la date et l\'heure, ainsi que les coordonnées GPS si la localisation/direction est activée (sur Android 11+, cette option nécessite que l\'option \"Options supplémentaires de l\'appareil photo > Structure d\'accès au stockage (SAF)\" soit activée). +\n%s + DRO + Étalonnage du niveau réinitialisé + Niveau étalonné + Réinitialiser + ft + Pieds + Mètres + Unité de distance + Inconnue + Haute + Moyenne + Faible + Non fiable + La boussole de votre appareil doit être calibrée pour améliorer sa précision. Ceci peut être fait en déplaçant votre appareil selon un mouvement en forme de 8. +\n +\nPrécision actuelle : + Direction de la boussole + Distance de la source du bracketing de la mise au point + Distance de la cible pour le bracketing de la mise au point + pas de rafale + 200 Mbps + 150 Mbps + Optimisé pour la reconnaissance vocale + Par défaut + Autorise la prise de photos pendant l\'enregistrement vidéo. À désactiver si des problèmes se manifestent lors de l\'enregistrement vidéo avec l\'API Camera2 activée. + Autoriser les photos pendant l\'enregistrement vidéo + Impossible d\'ouvrir cette image + Image sélectionnée + Désactivé + Image rémanente + Désactivé + 60 Hz + 50 Hz + Automatique + Flash écran activé + Flash écran auto + Ralenti désactivé + Ralenti activé + Normal + Vitesse + 200 + Étalonner + Veuillez placer votre appareil sur une surface horizontale de façon qu\'il soit à plat (en mode portrait ou paysage), puis sélectionnez Étalonner. +\n +\nAppuyez sur Réinitialiser pour supprimer l\'étalonnage de votre appareil. +\n +\nAppuyez sur le bouton retour pour annuler. + Cette option permet d\'étalonner l\'accéléromètre de votre appareil, de sorte que les options de niveau automatique et de niveau/angle à l\'écran fonctionnent correctement + Enregistrement vidéo + Appareil photo + Vitesse d\'obturation + Clair + Sombre + Interrompre l\'enregistrement vidéo si le niveau de la batterie est très faible. Cela aide à réduire le risque de corruption de vos vidéos si votre appareil s\'éteint brusquement à cause d\'un manque d\'énergie. + Vidéo arrêtée +\nNiveau de batterie critique + Pas assez d\'espace libre pour enregistrer des vidéos + s + Sauvegarder toutes les images originales (lent) + Sauvegarder une seule image originale + Images d\'origine pour la réduction du bruit + Sauvegarder ou non les images originales en mode réduction du bruit . Notez que ceci peut rendre l\'enregistrement des photos nettement plus lent. +\n%s + Bracketing d\'exposition + Bracketing d\'exposition + Camera + PNG + WebP + JPEG + 3GPP + MPEG4 HEVC + MPEG4 H264 + 2 (2:1) + Ne pas sauvegarder les images originales + Pas du bracketing d\'exposition + Activez ceci si votre appareil a un bogue de comportement du flash avec Camera2 API + Options de débogage + Options de débogage + La permission d\'utiliser le microphone est requise pour enregistrer des vidéos avec audio ainsi que pour utiliser les options de « Contrôle audio » + La permission de lire/écrire dans le stockage est requise pour sauvegarder les fichiers créés comme les photos et vidéos. + La permission d\'accès à l\'appareil photo est requise pour activer l\'appareil photo + Permission requise + PAS DE PERMISSIONS + Réduction de bruit (NR) + Rafale rapide + Expo {} + Impossible de sauvegarder dans ce dossier + Suivant + Désactivé Masquer uniquement les boutons de navigation virtuelle de l\'écran Masquer l\'interface graphique Tout masquer - Aucun Bruit fort - Commande vocale : « cheese » - - Créer une version - La caméra est dérivée d\'OpenCamera - Auteur - Code source - Licence - Informations sur la caméra - Conditions d\'utilisation - + Commande vocale : « cheese » + + 99% + 98% + 97% + 95% + 93% + Passer + Suivant + Extension : Nuit + X-Nuit + Extension : HDR + X-HDR + Extension : Auto + X-Auto + Appareil inconnu (permissions de connexion Bluetooth indisponibles) + Les permissions de scan/connexion Bluetooth sont nécessaires pour détecter les télécommandes Bluetooth LE et s\'y connecter. + Essayez d\'activer ce paramètre si votre appareil a du mal à prendre des photos en mode HDR ou Expo (si l\'image expo se révèle avoir la même exposition). Cela n\'est pertinent que si l\'option HDR/expo ci-dessous est également activée. + Activer la capture HDR/expo fix factice + Barre de progression pour modifier la valeur de préférence appliquée + Sauvegarder le lacet, le tangage et le roulis de l\'appareil dans le commentaire utilisateur Exif (format JPEG seulement) + Sauvegarder le lacet, le tangage et le roulis + Ralenti + Fréquence de trame + Bit par seconde + 4K UHD + Ouverture + Autoriser les actions par pression longue + Permettre ou non les actions déclenchées par pression longue (ex. : une pression longue sur la galerie pour changer le lieu de stockage). + Afficher l\'identifiant de la caméra actuelle sur l\'écran + Afficher l\'identifiant de la caméra/lentille + Si activé, utilise des boutons différents pour basculer entre les caméras arrière et avant, et pour basculer entre les différentes lentilles sur chaque façade. Si désactivé, l\'icône de basculement de caméra parcourra toutes les caméras. + Icône de caméras multiples + Basculer entre plusieurs caméras + Changer de caméra + Basculer sur la caméra externe + Grand-angle + Caméra externe + Blanc + Transparent + Orange + Rouge + Noir + Couleur à utiliser pour les rayures quand elles sont affichées. +\n%s + Couleur à utiliser en arrière plan des rayures quand elles sont affichées. +\n%s + Couleur d\'arrière plan des rayures + Couleur des rayures + Valeur Alpha des images fantômes. Plus la valeur est faible plus c\'est transparent, plus elle est élevée plus c\'est opaque. +\n%s + Opacité de l\'image fantôme + Atténuer seulement les boutons de navigation virtuelle à l\'écran + 2,8 + 2,6 + 2,4 + 2,3 + 2,2 + 2,1 + 2,0 + 1,9 + 1,8 + 1,6 + Valeur gamma à utiliser pour la vidéo si le profil d\'image vidéo est défini à Gamma +\n%s + Valeur du gamma vidéo + Gamma + sRGB + REC709 + Sélectionnez la télécommande + Retour + Extension : Beauté / Retouche faciale + X-Bty + Extension : Bokeh + X-Bokeh QR Code Ajouter un contact Ajouter un contact @@ -493,4 +963,10 @@ Manipuler ce code QR FIDO Utiliser le mot de passe Partager avec - + + VOTRE INTERRUPTEUR DE CONFIDENTIALITÉ DOIT ÊTRE ACTIVÉ + CAR LA CAMÉRA N\'EST PAS DISPONIBLE ;-) + + VEUILLEZ ATTENDRE 5 SECONDES POUR VOTRE CAMÉRA + POUR QU\'ELLE SE CHARGE, CAR ELLE VIEN DE ÊTRE ACTIVÉE + \ No newline at end of file diff --git a/app/src/main/res/values-gd/strings.xml b/app/src/main/res/values-gd/strings.xml new file mode 100644 index 000000000..f5520def8 --- /dev/null +++ b/app/src/main/res/values-gd/strings.xml @@ -0,0 +1,897 @@ + + + Dheth + Air adhart + Teirmichean na seirbheise + Ceadachas + Bun-tùs + Ùghdaran + Tionndadh na togail + Roghainnean + 4x + 3x + 2x + Air ais + 4x + 2x + Dheth + Taic fòcais + Càileachd àrd + Luath + Fìor-bheag + Dheth + Bun-roghainn + troigh + Troigh + Meatair + Aonad an astair + Chan eil fhios + Àrd + Meadhanach + Ìseal + Neo-earbsach + 500kb/s + 200kb/s + 100kb/s + Bun-roghainn + Camara video + Bun-roghainn + Dheth + Dheth + 60Hz + 50Hz + Fèin-obrachail + Sùil dhearg + Leus + Tha an solas-boillsgidh air + Solas-boillsgidh fèin-obrachail + Tha an solas-boillsgidh dheth + Àbhaisteach + Luaths + 200 + 150 + 100 + 50 + 40 + 30 + 25 + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + Chan eil gin + mm/ll/bbbb + ll/mm/bbbb + bbbb-mm-ll (ISO 8601) + Bun-roghainn + Chan eil + ’Ga phròiseasadh… + Còir-lethbhreac + Neach-ealain + Bun-roghainn + aodannan + aodann + Thoir tabhartas dhuinn + Na tha ùr: + Clàr-geal + Grianach + Sepia + Postairich + Chan eil gin + Ais-thionndaidh + Mono + Clàr-dubh + Aqua + Taigh-cluiche + Laighe na grèine + Dealbh seasmhach + Spòrs + Sneachd + Portraid + Cèilidh + Portraid air an oidhche + Oidhche + Cruth-tìre + Cleasan-teine + Fèin-obrachail + Solas-coinnle + Tràigh + Bàr-chòd + Gnìomh + A làimh + Blàth + Camhanaich + Solas-dealain + Fluaraiseach + Solas an latha + Neulach + Fèin-obrachail + ’Ga ghlacadh… + Tha a’ video ’na stad + Seall ìomhaigheag “Tog dealbh” + Uair a thìde + 45 mionaid + 30 mionaid + 25 mionaid + 20 mionaid + 15 mionaidean + 12 mhionaid + 11 mhionaid + 10 mionaidean + 9 mionaidean + 8 mionaidean + 7 mionaidean + 6 mionaidean + 5 mionaidean + 4 mionaidean + 3 mionaidean + 2 mhionaid + Mionaid + 30 diog + 15 diogan + 10 diogan + 5 diogan + 3 diogan + Gun chrìoch + Ath-shuidhich + Cailbhrich + Fèineag + Clàraich video + Camara + Luaiths an t-siutair + Soilleir + Dorcha + d + Roghainnean dì-bhugachaidh + Roghainnean dì-bhugachaidh + Tha feum air cead + Ma tha seo an comas, nuair a chleachdas tu modh HDR nan dealbhan, thèid trì dealbhan le bun-deisearas a shàbhaladh agus an dealbh HDR deireannach. Thoir an aire gun doir an sàbhaladh barrachd ùine le sin, gu h-àraidh ma tha “Cuir stampa air dealbhan” no an còmhnardachadh fèin-obrachail an comas. + Glanadh faraim + NR + HDR + Stannardach + Modh nan dealbhan + Na seall seo a-rithist + Tha am modh HDR feumail airson dealbhan le soilleireachd glè chaochlaideach. Togaidh am modh seo iomadh dealbh le deisearas eadar-dhealaichte is cuiridh e ri chèile iad airson an dealbh deireannach a chruthachadh. +\n +\nThoir an aire nach eil am modh HDR iomchaidh do sheallaidhean le gluasad luath annta is nach bi a dathan buileach fìrinneach ’s dòcha. +\n +\nBidh togail dhealbhan sa mhodh HDR nas slaodaiche. + Gabhaidh faidhlichean DNG a-staigh am fiosrachadh tùsail on chamara agad gun dùmhlachadh no pròiseasadh. +\n +\nThoir an aire nach aithnich a h-uile aplacaid gailearaidh faidhlichean DNG. ’S urrainn dhut dealbhan DNG a chleachdadh le deasaichean sònraichte, can Snapseed no Lightroom. +\n +\nThoir an aire nach dèid cuid a roghainnean pròiseasaidh mar stampa air dealbhan agus an còmhnardachadh fèin-obrachail a chur an sàs ach air dealbhan nach eil ’nan DNG (can JPEG) agus chan ann air na dealbhan DNG fhèin. + Nì an còmhnardachadh fèin-obrachail cuairteachadh air na dealbhan ach am bi coltas còmhnard orra. +\n +\nThoir an aire gur as ciall dha gum faigh thu dùmhlachd-bhreacaidh beagan nas lugha às (ri linn a’ chuairteachaidh ’s a bhearraidh a dh’adhbharaicheas sin). + Can caolas! + GB + MB + Cuir stad air a’ chlàradh a’ video + Tòisich air video a chlàradh + Tha am pasgan seo ann mu thràth + Dh’fhàillig cruthachadh a’ phasgain + Pasgan ùr + Pasgan pàrant + Co-roinn an dealbh + Geàrr leum gun chamara bheòil + Modh an t-solais-bhoillsgidh + Modh an fhòcais + Deisearas + Gailearaidh + Tog dealbh + Cuir lethbhreac dheth air an stòr-bhòrd + Chan eil seo ri fhaighinn + Ri fhaighinn + Ath-shuidhich na roghainnean + Mu dhèidhinn + Cobhair air loidhne + Measgaichte + Seanailean fuaime + Tùs fuaime + Clàraich fuaim + Reat fhrèaman a’ video (mu thuaiream) + Suidhich reat bhiodan mu thuaiream do videothan (is ciall do luach nas àirde gum faigh thu càileachd nas fheàrr ach bheir e barrachd àite air an diosg; dh’fhaoidte gum fàillig an clàradh video mur eil taic ris an reat bhiodan) +\n%s + Reat bhiodan a’ video (mu thuaiream) + Lùghdaichidh bunailteachadh video an crathadh a dh’adhbharaicheas gluasad a’ chamara an dà chuid san ro-shealladh is sna videothan air an clàradh. Cha leig thu leas a chleachdadh ma chuireas an t-uidheam agad taic ri bunailteachadh deilbh fradharcach (OIS). + Cuir an comas bunailteachadh video digiteach + Cuir an comas dùmhlachd-bhreacaidh de 3840x2160 dhan chlàradh video leis a’ chamara cùil – ’s e hack a tha san roghainn seo feuch an cuir thu taic ri camara 4K air uidheam 4K nach nochd an roghainn seo do dh’aplacaidean camara threas-phàrtaidhean. Cha chuir sinn geall gun obraich e; cuir fo dheuchainn e mus cleachd thu e. + Spàrr video 4K UHD air (chan obraich seo ach air cuid a dh’uidheaman) + Dùmhlachd-bhreacaidh a’ video + Co-dhiù an dèid dealbhan a shàbhaladh le snàithlean sa chùlaibh (airson obrachadh nas luaithe) + Cleachd snàithlean sa chùlaibh + An stoidhle a thèid a chleachdadh do stampaichean teacsa air dealbhan +\n%s + Stoidhle an teacsa + Dath a’ chrutha-chlò a thèid a chleachdadh do stampaichean teacsa air dealbhan + Dath a’ chrutha-chlò + Meud a’ chrutha-chlò a thèid a chleachdadh do stampaichean teacsa air dealbhan + Meud a’ chrutha-chlò + Cuir stampa le teacsa gnàthaichte air dealbhan + Teacsa gnàthaichte + Fòrmat an stampa GPS + Fòrmat an stampa-tìde + Fòrmat an stampa cinn-latha + Cuir stampa-tìde is -ama air dealbhan ’s cuir fiosrachadh GPS riutha cuideachd ma tha an dàta ionaid/comhair an comas +\n%s + Cuir stampa air dealbhan + Ma tha dàta an ionaid an comas, na tog dealbh no video ach ma tha dàta an ionaid ri fhaighinn + Iarr dàta an ionaid + Cuir comhair na combaiste GPS ris na dealbhan (san fhòrmat JPEG a-mhàin) + Glèidh comhair na combaiste + Tha sinn duilich ach cha chuir an t-uidheam +\nseo taic ri còmhnardachadh + Neo-ghlaiste + Tha an sgrìn glaiste +\ngrad-shlaighd an sgrìn gus a neo-ghlasadh + Chan eil aplacaid gailearaidh ri làimh + Chaidh an dealbh a sguabadh às + Chan eil ionad GPS ri fhaighinn + Dh’fhàillig le togail an deilbh + A’ togail dealbh + Cha deach leinn ro-shealladh a’ chamara a thòiseachadh + Cha deach leis a’ chòmhnardachadh fhèin-obrachail + Cha deach leinn an dealbh RAW a shàbhaladh + Cha deach leinn an dealbh a shàbhaladh + Tha sinn duilich + Chaidh clàradh a’ video a thòiseachadh + Cha deach leinn a’ video a chlàradh + Cha deach leinn faidhle a’ video a shàbhaladh + Chaidh an tìmear a thòiseachadh + Chaidh sgur de mhodh na h-ath-thogail + Chaidh sgur dhen tìmear + Chaidh an deisearas a neo-ghlasadh + Chaidh an deisearas a ghlasadh + Video + Dealbh + Camara cùil + Camara beòil + Neo-chrìochnach + Astar an fhòcais + FPS + Co-leasachadh an deisearais + Ràinig a’ video am meud faidhle as motha + Ràinig a’ video an fhaide as motha + Thuislich am frithealaiche, chaidh stad a chur air a’ video + Mearachd nach aithne dhuinn, chaidh stad a chur air a’ video + chan eil an t-uidheam agad a’ cur taic ris + Mearachd, dh’fhaoidte gu bheil am faidhle video coirbte + Cha b’ urrainn dhuinn ath-cheangal ris a’ chamara + ath-thogail fhathast + Chaidh stad a chur air clàradh a’ video + Atharraich ionad an t-sàbhalaidh gu: + Tagh pasgan eile + A bheil thu airson an eachdraidh nam pasgan fhalamhachadh\? + Falamhaich an eachdraidh nam pasgan + Tagh ionad sàbhalaidh: + Dheth + Air + Ceart ma-thà (Cha nochd an teachdaireachd seo a-rithist) + Roghainnean priob-uinneige + Camara + Camara + Gluasad slaodach + Reat fhrèaman + Reat bhiodan + Fosgladh + Geàrr leum gu camara eile + Geal + Trìd-shoilleir + Orains + Dearg + Dubh + Dheth + 2.8 + 2.6 + 2.4 + 2.3 + 2.2 + 2.1 + 2.0 + 1.9 + 1.8 + 1.6 + Gamma + sRGB + REC709 + ID + Teacsa lom + Teacsa sgàilichte + Sganaich + Ro-shealladh a’ chamara… + Air fhàgail + Air + Dheth + 100% + 99% + 98% + 97% + 95% + 93% + 90% + 80% + 70% + Dheth + Dheth + Uidheam nach aithne dhuinn + Cuairt-shealladh + Cuairt + Àbhaisteach + PNG + WebP + JPEG + Fòrmat an deilbh + Dh’fhàillig le sàbhaladh nan roghainnean + Aisig na roghainnean + Sàbhail na roghainnean + Bun-roghainn + Fòrmat video + An-còmhnaidh + Tapaidh + Dheth + -2 + -1 + 0 (bun-roghainn) + +1 + +2 + Chan eil gin + 9GB + 5GB + 2GB + 1GB + 500MB + 100MB + Bun-roghainn an uidheim + 2u + 1u + 30m + 20m + 10m + 5m + 2m + 1m + 30d + 20d + 15d + 10d + 5d + 3d + 2d + 1d + Gun dàil + Gun chrìoch + 500x + 200x + 100x + 50x + 40x + 30x + 20x + 10x + 5x + Cuir dàta an ionaid GPS ris na dealbhan/videothan (do dhealbhan, cha ghabh dàta an ionaid a chur ach ris an fhòrmat JPEG no DNG) + Glèidh dàta an ionaid (geò-tagadh) + RAW + Suidhich càileachd nan dealbhan JPEG no WebP a thèid a shàbhaladh (’s e 90%% a tha sa bhun-roghainn). Cha doir seo buaidh air dealbhan san fhòrmat PNG. +\n%s + Càileachd nan dealbh + Dùmhlachd-bhreacaidh a’ chamara + Roghainnean ionaid… + Roghainnean a’ video… + Roghainnean an deilbh… + Roghainnean an deilbh ’s a’ video + Spàrr air taisbeanadh na sgrìn gun cleachd e an t-soilleireachd as motha seach bun-roghainn an uidheim + Spàrr an t-soillearachd as motha air + Ma tha seo an comas, cha dèid an sgrìn a chur dheth fhad ’s a bhios prìomh eadar-aghaidh a’ chamara gnìomhach + Cùm an taisbeanadh air + Seall iomall air an uidheam-taisbeanaidh a dh’innseas dhut nuair a bhios dealbh ’ga thogail + Seall iomall nuair a bhios tu a’ togail dealbh + Seall beòthachadh le dealbhag a’ gluasad nuair a bhios tu a’ togail deilbh + Seall dealbhagan beòthaichte + Co-dhiù an dèid teachdaireachdan fiosrachaidh sealach a shealltainn dhut air an sgrìn gus nach dèid + Seall teachdaireachdan air an sgrìn + Seallaidh treòir bearraidh ceart-cheàrnach a riochdaicheas an coltas a bhios air a’ cho-mheas deilbh a shònraich thu – tha seo feumail ma tha fainear dhut an dealbh no video a bhearradh gu co-mheas deilbh eile an uairsin. Bidh feum air modh dealbh WYSIWYG no modh video. +\n%s + Seall treòir bearraidh + Griod + Seall griod + Seall ìre a’ bhataraidh air an sgrìn + Seall am bataraidh + Seall an t-àm làithreach air an sgrìn + Seall an t-àm + Seall comhair combaist an uidheim air an sgrìn + Seall comhair na combaiste + Dath soillseachaidh nuair a bhios an camara dha mhòr còmhnard + Dath soilleireachadh a’ cheàrna/na h-àirde + Seall loidhne còmhnardachaidh + Seall loidhne ceàrna + Seall ceàrn làithreach aig comhair an uidheim air an sgrìn + Seall an ceàrn + Seall air an sgrìn co mheud dhen stòras a tha air fhàgail air an uidheam + Seall a’ chuimhne shaor + Seall ìre làithreach an ISO. Ann am modh an t-solais-bhoillsgidh fhèin-obrachail, seallaidh samhla an t-solais bhoillsgidh an dèid a chleachdadh gus nach dèid. (Bidh feum air API Camera2.) + Seall ISO + Seall an sleamhnachan airson stiùireadh an t-sùm + Seall uidheam-smachd sleamhnachan sùm + Seall na putanan -/+ airson stiùireadh an t-sùm + Seall uidheaman-smachd -/+ an t-sùm + Seall an ìre làithreach air sùm a’ chamara air an sgrìn (nuair a chaidh a shùmadh a-steach) + Seall an sùm + Modh làn-tumaidh + Ionad air an eadar-aghaidh + Meud an ro-sheallaidh + Eadar-aghaidh air an sgrìn… + Roghainn airson an ro-shealladh a chuairteachadh (cha doir seo buaidh air na dealbhan no videothan a gheibh thu às +\n%s + Cuairtich an ro-shealladh + Rè clàradh video, thèid an eadar-aghaidh a ghlasadh ach nach sguir thu dhen chlàradh ri mearachd. Grad-shlaighd air an sgrìn gus a’ ghlas a thoirt fo a bàrr. Thoir an aire gun dèid stad a chur air a’ chlàradh co-dhiù ma thèid an aplacaid dhan chùlaibh no an sgrìn a bhànadh. + Roghainnean na sgrìn-ghlasaidh rè clàradh video + Co-dhiù an dèid fòcas a chur air a’ chamara gu fèin-obrachail nuair a thèid a chur gu dol gus nach dèid. Ma tha duilgheadas agad le cur air an t-solais-bhoillsgidh aig an toiseach, cuir an roghainn seo à comas + Dèan fòcasachadh fèin-obrachail air aig àm tòiseachaidh + Ma tha seo an comas, chì thu an camara air sgrìn-ghlasaidh sam bith (feumaidh tu a’ ghlas a thoirt fo bhàrr airson na roghainnean ’s an gailearaidh is msaa. inntrigeadh) + Seall an camara rè a’ ghlasaidh + Fòrmat an ama do dh’ainmean faidhle + An ro-leasachan a thèid a chur ri ainmean faidhle nam videothan + Ro-leasachan sàbhaladh nam videothan + An ro-leasachan a thèid a chur ri ainmean faidhle nan dealbhan + Ro-leasachan sàbhaladh nan dealbh + Co-dhiù an dèid frèam-obrach inntrigeadh an stòrais a chleachdadh airson dealbhan is videothan a shàbhaladh. Bu chòir dhut seo a chur an comas ma tha thu airson sàbhaladh gu cairt SD air an taobh a-muigh. + Cleachd frèam-obrach inntrigeadh an stòrais + A pasgan far an dèid faidhlichean deilbh/video a shàbhaladh + Ionad sàbhalaidh + Mothalachd faraim do roghainn na fuaime (faram àrd) + Mothalachd stiùireadh na fuaime + Roghainnean stiùireadh na fuaime + Iuchraichean àirde na fuaime + Cluich fuaim nuair a thèid dealbh a thogail + Fuaim an t-siutair + Cuir an sgrìn ’na stad às dèidh dealbh a thogail leis an roghainn gus an dealbh a cho-roinneadh no a sguabadh às + Cuir ’na stad às dèidh dealbh a thogail + Tog dealbh le suathadh no gnogag dhùbailte air an ro-shealladh + Suath ris gus a ghlacadh + Barrachd uidheaman-smachd a’ chamara… + Tricead na h-ath-thogail + Ath-thog + Can an cunntadh sìos dhan tìmear no do dhàil na h-ath-thogail (o 60 diog) + Cunntadh sìos an tìmeir le guth + Dèan bìog nuair a bhios an tìmear a’ cunntadh sìos no airson dàil na h-ath-thogail + Bìog an tìmeir + Tìmear + Stiùireadh a’ chamara + Cleachd modhachadh do dh’aodannan seach raointean fòcais + Mothaich do dh’aodannan + Nuair a bhios seo air, thèid comhair an uidheim a leigeil seachad agus bidh comhair an deilbh/a’ video a-rèir na comhair a shònraicheas tu +\n%s + Glais comhair an deilbh/a’ video + Suidhich air 0 airson co-leasachadh bunaiteach an deisearais + Suidhich co-leasachadh an deisearais + Is ciall do luach nas àirde gu bheil e nas mothachaile dhan t-solas (chan obraich seo air a h-uile uidheam) + Suidhich ISO + Tagh roghainn airson gleus a chur air a’ bhalans gheal + Suidhich am balans geal + Pisich an dealbh airson seallaidhean eadar-dhealaichte + Cuir modh seallaidh an sàs + Cuiridh seo an èifeachd datha a thagh thu an sàs air an dealbh + Cuir èifeachd datha an sàs + Thèid dealbhan a chuairteachadh gu fèin-obrachail gus am bi iad còmhnard (dealbhan-camara a-mhàin) (bidh togail dhealbhan nas slaodaiche agus dh’fhaoidte nach obraich e air uidheaman le cuimhne ghann) + Còmhnardaich gu fèin-obrachail + Èifeachdan a’ chamara + m + Cha deach leinn fiosrachadh stampa a chur ris an dealbh + Grad-shlaighd airson a’ ghlas a thoirt dheth] + [GLAISTE: + Saor + Sùm + ISO + A’ CLEACHDADH A’ CHAMARA AN-DRÀSTA. + DH’FHAOIDTE GU BHEIL APLACAID EILE + DH’FHÀILLIG LE FOSGLADH A’ CHAMARA. + Comhair + Ceàrn + Am balans geal + Modh seallaidh + Èifeachd dhathan + Air a char as fhaide + Tha an fhuaim à comas + 200Mb/s + 150Mb/s + 100Mb/s + 90Mb/s + 80Mb/s + 70Mb/s + 60Mb/s + 50Mb/s + 40Mb/s + 30Mb/s + 20Mb/s + 15Mb/s + 10Mb/s + 9Mb/s + 8Mb/s + 7Mb/s + 6Mb/s + 5Mb/s + 4Mb/s + 3Mb/s + 2Mb/s + 1Mb/s + An algairim a chleachdas draibhear a’ chamara airson faram a ghlanadh. Feuchaidh algairim glanadh an fharaim ri piseach a thoirt air càileachd an deilbh le toirt air falbh faraim anabarraich a chaidh a chur ris le pròiseas a’ ghlacaidh, gu h-àraidh nuair a bhios e dorcha. (Thoir an aire nach eil seo co-cheangailte ri modh glanadh faraim deilbh agus gun dèid an roghainn seo a chur dhan dàrna taobh an am modh NR deilbh.) +\n%s + Algairim glanadh faraim + Roghainnean pròiseasaidh… + An algairim a chleachdas draibhear a’ chamara airson piseach a thoirt air an oir. Bheir piseach na h-oire geurad is mion-fhiosrachadh nas fheàrr dhut san dealbh a chaidh a ghlacadh. (Cuiridh modh NR an deilbh an roghainn seo dhan dàrna taobh.) +\n%s + Algairim modh na h-oire + Gidheadh an dèid fiosrachadh mu ghleusan is pisich ùra a shealltainn dhut gus nach dèid nuair a bhios an aplacaid air a h-ùrachadh + Seall còmhradh mu na tha ùr + Thèid a chleachdadh airson àirde GPS do stampa an deilbh is fo-thiotalan video +\n%s + Tha combaist an uidheim agad feumach air cailbhreachadh gus a phongalachd a phiseachadh. ’S urrainn dhut seo a dèanamh a ghluasad an uidheim agad ann an cumadh 8. +\n +\nA’ phongalachd làithreach: + Comhair na combaiste + Cuir astar neo-chrìochnach ris + Astar-amais airson bracketing an fhòcais + Astar-tùis airson bracketing an fhòcais + Bracketing an fhòcais + {} an fhòcais + Co-dhiù an dèid ìre na fuaime a shealltainn air an sgrìn rè clàradh video gus nach dèid + Seall meidheadair fuaime + gun bhòrcadh + Gun phròiseasadh + Pisichte airson aithneachadh gutha + Pisichte airson gairmean gutha + Tùs bunaiteach na fuaime + Micreofon on taobh a-muigh (ma tha gin ann) + Pròifil an loga + Loga (glè làidir) + Loga (làidir) + Loga (meadhanach) + Loga (ìosal) + Loga (fìne) + Cruthaich faidhle fho-tiotalan (.SRT) a ghlèidheas an ceann-là ’s an t-àm; agus fiosrachadh GPS cuideachd ma tha dàta an ionaid/na comhair an comas +\n%s + Fo-thiotalan video + Seall loidhnichean comhair na combaiste + Seall loidhnichean comhair na combaiste + Seall loidhnichean pids còmhnard + Seall loidhnichean pids + DRO + Chaidh cailbhreachadh a’ chòmhnaird ath-shuidheachadh + Chaidh an còmhnard a chailbhreachadh + Cuir an t-uidheam agad air uachdar rèidh còmhnard far am bi e còmhnard (air comhair portraid no dreach-tìre) agus tagh “Cailbhrich” an uairsin. +\n +\nBrùth air “Ath-shuidhich” airson an cailbhreachadh a thoirt air falbh on uidheam agad. +\n +\nBrùth air a’ phutan “Air ais” airson sgur dheth. + Nì an roghainn seo cailbhreachadh air meidheadair-luathachaidh an uidheim agad ach an obraich an còmhnardachadh fèin-obrachail agus roghainnean a’ chòmhnardachaidh/a’ cheàrna air an sgrìn + Glais an deisearas + A bheil thu cinnteach gu bheil thu airson roghainnean uile a’ chamara ath-shuidheachadh air na bun-roghainnean\? + Aisig gach bun-roghainn a’ chamara + Fiosrachadh dì-bhugachaidh ’s na h-aplacaid + Cuiridh seo an comas barrachd roghainnean mar modhan a làimh dhan deisearas, dhan fhòcas is dhan bhalans gheal agus modh RAW (ma chuireas an t-uidheam taic ris) ach dh’fhaoidte nach obraich e mar bu chòir air a h-uile uidheam (bidh feum air ath-thòiseachadh) + Cleachd API Camera2 + Mas toigh leat an aplacaid seo, saoil an doir thu tabhartas dhuinn airson taic a chur ris an obair-leasachaidh\? ’S urrainn dhut an aplacaid tabhartais againn a cheannach airson seo a dhèanamh – briog air an roghainn seo airson duilleag na h-aplacaid tabhartais againn fhosgladh. Mòran taing! + Thoir tabhartas dhuinn a chuireas taic ris an obair-leasachaidh + Suidhich pròifil stannardach no rèidh dhan mhodh video +\n%s + Pròifil dealbh nam videothan + Ceadaich togail dhealbhan nuair ’s a bhios video ’ga chlàradh. Cuir seo à comas ma tha duilgheadas ann le clàradh videothan nuair a bhios API Camera2 an comas air an uidheam agad. + Ceadaich togail dhealbhan rè clàradh video + Cha ghabh an dealbh seo fhosgladh + Cha do lorg sinn còmhradh faidhle air an uidheam seo, chan eil taic ri gleus an deilbh taibhse + Dealbh air a thaghadh + An dealbh mu dheireadh a chaidh a thogail + Tar-chòmhdaich dealbh a chuidicheas leis a’ cho-thaobhadh. +\n%s + Dealbh taibhse + Algairimean a chuidicheas le priobadh an t-solais. +\n%s + Mùchadh a’ bhannachaidh + Leus na sgrìn + Tha boillsgeadh na sgrìn air + Boillsgeadh fèin-obrachail na sgrìn + Tha an gluasad slaodach à comas + Tha an gluasad slaodach an comas + Àireamh de dhealbhan + Àireamh de dhealbhan + DNG (RAW) a-mhàin + Stannardach agus DNG (RAW) + An teacsa a thèid a ghlèidheadh ann am meata-dàta an deilbh airson taga na còrach-lethbhreac (san fhòrmat JPEG a-mhàin). (Fàg bàn e mur eil thu ’ga iarraidh.) + An teacsa a thèid a ghlèidheadh ann am meata-dàta an deilbh airson taga an neach-ealain (san fhòrmat JPEG a-mhàin). (Fàg bàn e mur eil thu ’ga iarraidh.) + Tagaichean EXIF gnàthaichte + Fìor-luath + sa mheadhan + aig bonn na sgrìn + aig bàrr na sgrìn + taobh deas na sgrìn + taobh clì na sgrìn + Dubhar + Dh’fhàillig cruthachadh an deilbh HDR + Cha deach leinn tòiseachadh air èisteachd ris an fuaim + Lean air clàradh a’ video + Cuir clàradh a’ video ’na stad + A’ leantainn air a’ video + Seall an ìomhaigheag airson dealbhan a thogail ’s videothan a chlàradh. Thoir a’ chromag air falbh nam b’ fheàrr leat dealbhan a thogail air dòigh eile (m.e. ma tha putan siutair bathair-chruaidh aig an uidheam agad no ma bhios tu a’ cleachdadh iuchraichean àirde na fuaime). + Cuir làrach-lìn a’ chamara gu dol sa bhrabhsair agad + Ma tha seo an comas, thèid an solas-boillsgidh a chur air/dheth le clàradh video (agus chì thu aig astar a bheil an camara a’ clàradh fhathast gus nach eil) + Solas-boillsgidh rè clàradh video + Sònraich mono no stereo dhan chlàradh fuaime (cha chuir ach cuir a dh’uidheaman taic ri stereo) + Am micreofon a thèid a chleachdadh airson clàradh fuaime. Thoir an aire gu bheil giùlan nan roghainnean a-rèir an dòigh air an deach an roghainn seo a phrògramachadh dhan uidheam agad. +\n%s + Clàraich an fhuaim nuair a thèid video a chlàradh + Co-dhiù an dèid clàradh video ath-thòiseachadh gu fèin-obrachail nuair a ruigeas e am meud faidhle as motha gus nach dèid (ge b’ e a bheil meud faidhle as motha a uidheim ’ga chleachdadh no an deach a shònrachadh le cleachdaiche) + Ath-thòisich às dèidh meud as motha an fhaidhle + Thèid stad a chur air clàradh videothan agus/no an ath-thòiseachadh (faic an roghainn gu h-ìosal) nuair a thèid meud as motha an fhaidhle a ruigsinn (mu thuaiream). Thoir an aire gu bheil meud as motha air iomadh uidheam Android a thaobh videothan (mu 2GB no 4GB mar as trice) ach leigidh an roghainn seo leat luach sònraichte a shuidheachadh. Thoir an aire nach urrainn dhut an roghainn seo a chleachdadh airson am meud as motha tùsail aig uidheam a mheudachadh. +\n%s + Meud as motha nam faidhlichean video + Ma chaidh stad a chur air video às dèidh an fhaide as motha a ruigsinn (ma chaidh sin a shuidheachadh), bheir an roghainn seo ath-thòiseachadh air a’ video an àireamh de thursan a shònraich thu +\n%s + Ath-thòisich a’ video às dèidh na faide as motha + Thèid stad a chur air clàradh videothan às dèidh na faide a shònraich thu +\n%s + Faid as motha nam videothan + Suidhich reat fhrèaman (FPS) nam videothan (mu thuaiream, cha chuir sinn geall gun gabh a ruigsinn agus dh’fhaoidte gum fàillig le clàradh video mur eil taic ris an reat fhrèaman). Thoir sùil air na videothan a gheibh thu às airson an reat fhrèaman a chaidh a chleachdadh dha-rìribh fhaicinn. Thoir an aire gum fàg videothan le gluasad slaodach an roghainn seo air an dàrna taobh. +\n%s + Cailbhrich ceàrn a’ chòmhnardachaidh + Co-dhiù an dèid na dealbhan a gheibh thu on chamara bheòil a sgàthanachadh gus nach dèid +\n%s + Sgàthanaich an camara beòil + Gabhaidh togail HDR/deisearais a dhèanamh nas luaithe leis. Cuir seo à comas ma tha duilgheadas aig an uidheam agad nuair a bhios tu a’ togail dealbhan sa mhodh HDR no deisearais. + Cuir an comas HDR luath/bòrcadh an deisearais + Mearachd èiginneach a’ chamara + Cuir stad air clàradh video nuair a bhios am bataraidh èiginneach fann. Cuidichidh seo ach nach biodh na videothan coirbte nuair a thèid an t-uidheam agad a chur dheth gu h-obann air sàilleibh dìth cumhachd. + Sgrùd ìre èiginneach a’ bhataraidh + Chaidh stad a chur air a’ video +\nTha am bataraidh èiginneach fann + Chan eil àite saor gu leòr ann gus a’ video a chlàradh + Sàbhail gach dealbh tùsail (slaodach) + Sàbhail aon dealbh tùsail + Na sàbhail na dealbhan tùsail + Co-dhiù an dèid na dealbhan tùsail a shàbhaladh sa modh glanadh faraim gus nach dèid. Thoir an aire gun doir sàbhaladh nan dealbhan mòran nas fhaide leis. +\n%s + Dealbhan tùsail dhan ghlanadh faraim + Co mheud stadan a thèid a chur ris/a thoirt air falbh on dealbh as duirche/soilleire +\n%s + Stadan bracketing an deisearais + An àireamh de dhealbhan do mhodh bracketing an deisearais +\n%s + Bracketing an deisearais + Cuir seo an comas ma tha giùlan briste aig solas-boillsgidh an uidheim agad le API Camera2 + Cleachd dòigh solais-bhoillsgidh eile + Tha feum air cead ionaid airson geò-tagadh (glèidheadh dàta mun ionad ann an dealbhan is videothan). Tha feum air cead ionaid cuideachd airson ceangal ri uidheaman-smachd cèine Bluetooth LE. + Tha feum air cead a’ mhicreofoin airson videothan le fuaim a chlàradh agus roghainnean stiùireadh na fuaime a chleachdadh + Tha feum air cead leughaidh/sgrìobhaidh gus dealbhan a shàbhaladh + Tha feum air cead air a’ chamara gus an camara a chur an comas + CHAN EIL NA CEADAN RI FHAIGHINN + Sàbhail gach dealbh airson modh HDR + Stampa deilbh + Bòrcadh luath + Bracketing an deisearais + {} deis + Std + Dèan fuaim àrd + Cuir stad air èisteachd ris an fhuaim + Tòisich air èisteachd ris an fhuaim + Meud as motha nam faidhlichean + Chan eil cead dhan ionad ri fhaighinn + Chan eil cead dhan mhicreofon ri fhaighinn + Chan urrainn dhuinn sàbhaladh dhan phasgan seo + Chaidh sgur de fhrèam-obrach inntrigeadh an stòrais + Tagh ionad sàbhalaidh + Cuir a-steach ainm pasgain ùir + Cha ghabh am pasgan seo inntrigeadh + Cha ghabh sgrìobhadh dhan phasgan seo + Sguab às an dealbh mu dheireadh + Geàrr leum gun mhodh deilbh + Geàrr leum gun mhodh video + Geàrr leum gun chamara chùil + Cuairteachadh an t-solais-bhoillsgidh + An dath a thèid a chleachdadh airson na h-iomallan mun fhòcas a shoilleireachadh. +\n%s + Dath mullaichean an fhòcais + Ma tha an roghainn seo an comas, thèid iomallan mun fhòcas air an dealbh a shoilleireachadh. Tha seo feumail gu h-àraidh dhan fhòcas a làimh agus ’s urrainn dhut a chleachdadh airson faighinn a-mach dè na badan far a bheil fòcas air an dealbh. +\n%s + Mullaichean an fhòcais + Ma tha an roghainn seo an comas, thèid stiallan sìobra a tharraing air an sgrìn a sheallas dhut far a bheil deisearas ro àrd air ro-shealladh a’ chamara. +\n%s + Seall stiallan sìobra + Soilleireachd (cuibheas on tè as lugha/as motha) + Dèine (chuibheasach) + Luach (as otha) + Lùmanas + Dathan RGB + Co-dhiù an dèid hiostogram dhe na dealbhan a shealltainn air an sgrìn gus nach dèid +\n%s + Seall hiostogram + Sguir de ghlèidheadh dàta an ionaid + Glèidh dàta an ionaid + Co-dhiù an dèid ìomhaigheag a shealltainn air an sgrìn gus nach dèid gus dàta an ionaid (geò-tagadh) a chur an comas no à comas + Seall ìomhaigheag airson dàta an ionaid a ghlèidheadh + Na seall an seòladh + ’S fheàrr leam seòladh na co-chomharran GPS + Cuir an seòladh ris na co-chomharran GPS ma ghabhas seo a dhèanamh + Cleachd seòlaidhean + Kraken Smart Housing + Chaidh uidheam-smachd cèin a cheangal ris + Airson còmhdachaidhean fon uisge, bheir seo barrachd phongalachd dhut ma thaghas tu an seòrsa de dh’uisge ceart. + Cleachd sàl airson àireamhachadh na doimhne + Leth-fhacal: suidhich an t-soilleireachd bhunaiteach air an ìre as lugha mus tòisich thu an camara. + Doilleirich an sgrìn nuair a thèid an uidheam-smachd cèin a dhì-cheangal + Chan eil taic ri Bluetooth. + Sganadh uidheaman BLE + Chan eil taic ri BLE + Seòrsa an uidheim-smachd chèin + Cuir an comas uidheaman-smachd cèin Bluetooth LE (BLE) + Cuir an comas uidheam-smachd cèin Bluetooth LE + Uidheam-smachd cèin Bluetooth LE… + Modh solais fhainn: cùm an camara seasmhach + Thoir a’ ghlas far an deisearais + Co-dhiù an dèid ìomhaigheag a shealltainn air an sgrìn gus nach dèid gus an deisearas a ghlasadh no neo-ghlasadh + Seall ìomhaigheag glaise dhan deisearas fhèin-obrachail + Tha am balans geal neo-ghlaiste + Tha am balans geal glaiste + Thoir a’ ghlas far a’ bhalans ghil + Glais am balans geal + Co-dhiù an dèid ìomhaigheag a shealltainn air an sgrìn gus nach dèid gus am balans geal fèin-obrachail a ghlasadh no neo-ghlasadh + Seall ìomhaigheag glaise dhan bhalans gheal fhèin-obrachail + Co-dhiù an dèid ìomhaigheag a shealltainn air an sgrìn gus nach dèid gus teacsa gnàthaichte ri stampadh air an dealbh a shònrachadh + Seall ìomhaigheag teacsa gnàthaichte dhan stampa deilbh + Tha stampa deilbh à comas + Tha stampa deilbh an comas + Cuir stampa deilbh à comas + Cuir stampa deilbh an comas + Co-dhiù an dèid ìomhaigheag a shealltainn air an sgrìn gus nach dèid gus stampa deilbh a chur an comas no à comas + Seall ìomhaigheag stampa deilbh + Cuir an còmhnardachadh fèin-obrachail à comas + Cuir an còmhnardachadh fèin-obrachail an comas + Co-dhiù an dèid ìomhaigheag a shealltainn air an sgrìn gus nach dèid gus an còmhnardachadh fèin-obrachail a chur an comas no à comas. Nuair a bhios an còmhnardachadh fèin-obrachail an comas, thèid dealbhan a chuairteachadh gu fèin-obrachail ach am bi iad a-rèir na fàire. + Seall ìomhaigheag a’ chòmhnardachaidh fhèin-obrachail + Tha am mothachadh do dh’aodannan à comas + Tha am mothachadh do dh’aodannan an comas + Cuir à comas am mothachadh do dh’aodannan + Cuir an comas am mothachadh do dh’aodannan + Co-dhiù an dèid ìomhaigheag a shealltainn air an sgrìn gus nach dèid gus am mothachadh do dh’aodannan a chur an comas no à comas + Seall ìomhaigheag mothachadh do dh’aodannan + Ìomhaigheagan ris a’ bhàrr (portraid) + Eadar-aghaidh deas-làmhach + Eadar-aghaidh clì-làmhach + Solas fann + Modh NR + Cha do lorg sinn còmhradh faidhle air an uidheam seo, chan eil taic ris an roghainn + Dh’fhàillig le aiseag nan roghainnean + Roghainnean air an sàbhaladh + Leigidh an roghainn seo leat faidhle a thaghadh le roghainnean a shàbhail thu roimhe. Thoir an aire gun dèid sgrìobhadh thairis air gach roghainn làithreach nuair a thaghas tu faidhle! + Aisigidh seo roghainnean a shàbhail thu roimhe. Sgrìobhaidh seo na roghainnean on t-sàbhaladh thairis air gach roghainn làithreach! + Ainm nan roghainnean air an sàbhaladh + Sàbhail gach roghainn a’ chamara gu faidhle + Manaidsear nan roghainnean + WebM (gun taic ri fuaim) + 3GPP + MPEG4 HEVC + MPEG4 H264 + Fòrmat is codecs nam faidhlichean video is fuaime +\n%s + Cuin a thèid algairim leasachadh an iomsgaraidh a chleachdadh airson HDR. ’S urrainn dha piseach a thoirt air a’ choltas nuair a bhios rainse dinimigeach glè àrd san t-sealladh agus bheir e coltas HDR air an toradh cuideachd. +\n%s + Leasachadh iomsgaradh HDR + -3 (mothalachd ìseal) + +3 (mothalachd àrd) + 2.4 (12:5) + 2.35 (47:20) + 2.33 (21:9) + 2 (2:1) + 1.85 (37:20) + 1.78 (16:9) + 1.5 (3:2) + 1.4 (7:4) + 1.33 (4:3) + 1.25 (5:4) + 1 (1:1) + Chaidh sgur de bhracketing an fhòcais + 300MB + 200MB + 0.5d + Meudaich no lùghdaich co-leasachadh an deisearais + Co-dhiù an dèid sùmadh a-steach gus ach dèid nuair a chuireas tu gleus air astar an fhòcais a làimh +\n%s + An luach gamma a thèid a chleachdadh dhan video ma chaidh pròifil dealbh a’ video a shuidheachadh air “Gamma” +\n%s + Luach gamma a’ video + Suath ris airson fòcas is brùth air putan gorm a’ chamara airson dealbhan a thogail. +\n +\nAirson an t-soilleireachd as motha a chur dheth dhan sgrìn, faic “Roghainnean”/”Eadar-aghaidh air an sgrìn”/”Spàrr an t-soillearachd as motha air”. Airson sàbhaladh gu cairt SD air Android 5+, faic “Roghainnean”/”Barrachd uidheaman-smachd a’ chamara”/”Cleachd frèam-obrach inntrigeadh an stòrais”. Airson barrachd cobharach, briog air “Cobhair air loidhne” o na roghainnean. + Ma ghabhas seo dèanamh, cleachd seòladh airson stampaidhean le ionad GPS. Feumaidh an roghainn seo ceangal dhan eadar-lìon. Thoir an aire nuair a bhios seo an comas gun tar-chuir an t-uidheam agad dàta mun ionaid dhan eadar-lìon gu treas-phàrtaidh airson seòladh fhaighinn às na co-chomharran GPS. Faic https://developer.android.com/reference/android/location/Geocoder . +\n%s + Togh dealbh/video nuair a thèid mothachadh do dh’fhuaim no le àithne gutha. Nuair a bhios seo an comas, cleachd putan a’ mhicreofoin air an sgrìn airson tòiseachadh air èisteachd no sguir dhith. Thoir an aire gun cleachd roghainn na h-àithne gutha seirbheis aithneachadh cainnt Android: nuair a chleachdas tu an roghainn sin, tha sinn an dùil gun dèid dàta fuaime a chur a-null gu frithealaichean cèine airson an t-aithneachadh gutha a thoirt gu buil. +\n%s + API Camera2 + API tùsail a’ chamara + Tagh API Camera2 airson barrachd roghainnean a chur an comas mar modhan a làimh dhan deisearas, dhan fhòcas is dhan bhalans gheal agus modh RAW (ma chuireas an t-uidheam taic ris). Bidh feum air ath-thòiseachadh nuair a dh’atharraicheas tu an API. +\n%s + API a’ chamara + Tagh fòrmat nam faidhlichean do shàbhaladh nan dealbhan. Bheir seo buaidh air dealbhan “stannardach” (seach RAW). Thoir an aire nach eil am fòrmat PNG gun chall gu tur ach gun dèid iompachadh o JPEG air càileachd de 100%%. +\n%s + Bàr-siridh airson co-leasachadh an deisearais atharrachadh + Sàbhail na dealbhan tùsail ’s XML dì-bhugachaidh + Sàbhail na dealbhan tùsail + Na sàbhail na dealbhan tùsail + Co-dhiù an dèid na dealbhan tùsail a shàbhaladh ann am modh a’ chuairt-sheallaidh gus nach dèid. Thoir an aire gun doir sàbhaladh nan cuairt-sheallaidhean nas fhaide le seo. Bheir seo an roghainn dhut cuideachd gun sàbhail thu faidhle XML a ghabhas cleachdadh airson aithris a dhèanamh air duilgheadasan leis a’ chuairt-shealladh. +\n%s + Dealbhan tùsail a’ chuairt-sheallaidh + Airson dealbh cuairt-sheallaidh a thogail, cuir comhair portraid air an uidheam agad is briog airson an dealbh a thòisicheas an cuairt-shealladh a thogail. An uairsin, cuairtich an t-uidheam agad gu clì no deas airson an cearcall geal sa mheadhan a ghluasad air an dotag ghorm. Gach turas a dhèid dealbh ùr a ghlacadh, cuairtich an t-uidheam a-rithist dhan dotag ghorm a nochdas. +\n +\nBriog air ìomhaigheag na cromaige airson an cuairt-shealladh a shàbhaladh no air ìomhaigheag na croise airson sgur dheth. +\n +\nThoir an aire gun doir dealbhan cuairt-sheallaidh ùine a phròiseasadh is a shàbhaladh. + Do mhodh a’ chuairt-sheallaidh, co-dhiù an dèid na h-iomallan lùbach a thoirt air falbh gus nach dèid +\n%s + Bearradh fèin-obrachail a’ chuairt-sheallaidh + Dh’fhàillig cruthachadh a’ chuairt-sheallaidh + Chaidh sgur dhen chuairt-shealladh + Sguir dhen chuairt-shealladh + Cuir crìoch air a’ chuairt-shealladh + A’ sàbhaladh nan dealbhan… + Teacsa le cùlaibh duibhrichte + An t-uidheam-smachd cèin làithreach: + Co-dhiù an dèid ìomhaigheag a shealltainn air an sgrìn gus nach dèid airson cuairteachadh tro na modhan RAW + Co-dhiù am bi roghainn HDR an sàs air modh bracketing an fhòcais gus nach bi. Ma tha an roghainn seo à comas, cha dèid ach faidhlichean JPEG a shàbhaladh ann am modhan deilbh bracketing an fhòcais. + Co-dhiù am bi roghainn HDR an sàs air modh bracketing an deisearais (no dhan mhodh HDR nuair a bhios “Sàbhail gach dealbh airson modh HDR” an comas) gus nach bi. Ma tha an roghainn seo à comas, cha dèid ach faidhlichean JPEG a shàbhaladh sna modhan deilbh sin. + Ceadachasan bun-tùis fhosgailte + Glèidh claonadh, pids is roiligeadh an uidheim ann am beachd cleachdaiche Exif an deilbh (fòrmat JPEG a-mhàin) + Glèidh an claonadh, a’ phids is an roiligeadh + 4K UHD + Co-dhiù am bi gnìomhan brùthaidh fhaide ceadaichte gus nach bi (m.e. brùthadh fada air a’ ghailearaidh airson ionad an t-sàbhalaidh atharrachadh). + Ceadaich gnìomhan brùthaidh fhaide + Seall àireamh ID a’ chamara làithrich air an sgrìn + Seall ID a’ chamara + Ma tha seo an comas, cleachdaidh tu putanan fa leth airson leum a ghearradh eadar camara cùil/beòil agus iomadh camara cùil/beòil. Ma tha seo à comas, cuairtichidh ìomhaigheag gearradh leum nan camarathan tro na camarathan uile. + Ìomhaigheag iomadh camara + Geàrr leum eadar camarathan + Geàrr leum gun chamara on taobh a-muigh + Glè leathann + Camara on taobh a-muigh + An dath a thèid a chleachdadh airson stiallan sa chùlaibh nuair a bhios stiallan sìobra ’gan sealltainn. +\n%s + Dath cùlaibh nan stiallan sìobra + An dath a thèid a chleachdadh airson stiallan sa bheulaibh nuair a bhios stiallan sìobra ’gan sealltainn. +\n%s + Dath beulaibh nan stiallan sìobra + An luach alpha a thèid a chleachdadh airson dealbhan taibhse. Is ciall do luach nas ìsle gu bheil e nas trìd-shoilleire agus do luach nas àirde gu bheil e nas trìd-dhoilleire. +\n%s + Trìd-dhoilleireachd an deilbh taibhse + Falaich a h-uile rud + Falaich an eadar-aghaidh + Falaich putanan biortail na seòladaireachd air an sgrìn + Doilleirich putanan biortail na seòladaireachd air an sgrìn + Mun chamara + ’S e fork de Camera a th’ ann an aplacaid a’ chamara + Tha an Camara a’ cleachdadh ìomhaigheagan o Material Design Google (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , https://google.github.io/material-design-icons/) fo cheadachas Apache tionndadh 2.0. Chaidh cuid dhe na h-ìomhaigheagan atharrachadh. Thoir gnogag an-seo airson teacsa slàn a’ cheadachais. + Ìomhaigheagan Material Design Google + Tha an Camara © 2013–2019 Mark Harman, ’ga fhoillseachadh fo GPL v3 no nas ùire. Thoir gnogag an-seo airson teacsa slàn a’ cheadachais. + Tagh uidheam-smachd cèin + Seall ìomhaigheag RAW + Cuairteachadh na modhan RAW + Ceadaich RAW airson bracketing an fhòcais + Ceadaich RAW airson bracketing an deisearais + Co-dhiù an dèid ìomhaigheag a shealltainn air an sgrìn gus nach dèid airson cuairteachadh tro roghainnean an t-solais-bhoillsgidh seach a bhith a’ sealltainn roghainnean an t-solais-bhoillsgidh air priob-chlàr-taice + Seall ìomhaigheag an t-solais-bhoillsgidh + \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml new file mode 100644 index 000000000..efbc6e524 --- /dev/null +++ b/app/src/main/res/values-gl/strings.xml @@ -0,0 +1,897 @@ + + + Elixir outro cartafol + Eliminar o historial do cartafol\? + Eliminar historial do cartafol + Elixir localización para gardar: + Apagado + Acendido + ACEPTAR (Esta mensaxe non se amosará de novo) + Configuración dos elementos emerxentes + Configuración + Cámara + NR + Amosa liñas de dirección do compás + Amosar liñas de dirección + Amosa liñas horizontais de paso + Amosar liñas de paso + DRO + Calibración de nivel reiniciada + Nivel calibrado + Reiniciar + Calibrar + Coloque o dispositivo sobre unha superficie horizontal plana de xeito que quede nivelado (en orientación vertical ou horizontal) e seleccione Calibrar. +\n +\nPrema Restablecer para eliminar a calibración do dispositivo. +\n +\nPreme o botón Atrás para cancelar. + Esta opción calibra o acelerómetro do dispositivo, polo que as opcións de nivel automático e de nivel/ángulo na pantalla funcionan correctamente + Calibrar nivel angular + Indica se é debido reflectir as fotos resultantes cando se usa a cámara frontal +\n%s + Reflexo en cámara frontal + Autoretrato + Gravar vídeo + Cámara + Permite a captura máis rápida das fotos HDR / expo. Desactívao se o teu dispositivo ten problemas ao sacar fotos cos modos de foto HDR ou Expo. + Habilitar ráfagas HDR / exposicións rápidas + Erro grave da cámara + Velocidade de obturador + Brillante + Escuro + Deter a gravación de vídeo se o nivel de batería é moi baixo. Isto axuda a reducir o risco de que os vídeos se corrompan se o dispositivo se apaga de súpeto debido a que queda sen enerxía. + Comprobar batería crítica + Vídeo detido. +\nNivel da batería demasiado baixo + Non hai suficiente espazo libre para gravar vídeo + s + Gardar todas as imaxes orixinais (lento) + Gardar unha soa imaxe orixinal + Non se gardaron as imaxes orixinais + Se se gardan as imaxes orixinais no modo de redución de ruído. Ten en conta que isto pode facer que gardar fotos sexa moito máis lento. +\n%s + Redución de ruído orixinal de imaxes + Cantas paradas hai que restar/sumar para a imaxe máis escura/brillante +\n%s + Pasos de soporte de exposición BKT + Número de imaxes para o modo de soporte de exposición +\n%s + Soporte de exposición + Habilitar se o seu dispositivo ten un comportamento erróneo do escintileo coa API Camera2 + Usar un método de escintileo alternativo + Opcións de depuración + Opcións de depuración + Requírese permiso de localización para o xeoetiquetado (almacenar datos de localización en fotos e vídeos). Tamén se require permiso de localización para conectarse a dispositivos de control remoto Bluetooth LE. + Requírese o permiso de micrófono para gravar vídeo con audio + Permiso de lectura/escritura de almacenamento para gardar foto + Requírese o permiso da cámara para habitala + Permiso requirido + PERMISOS NON DISPOÑIBLES + Se está activado, cando se use o modo de foto HDR, gardaranse as tres imaxes de exposición base, así como a foto HDR final. Ten en conta que isto fará que o aforro sexa máis lento, especialmente se tamén se utilizan opcións como \"Fotos de gravado\" ou Nivel automático. + Gardar todas as imaxes no modo HDR + Gravado en fotos + Reducción de ruído + Ráfaga rápida + Soporte de exposición + BKT {} + HDR + Estándar + Std + Modo de foto + Non amosar de novo + O modo HDR é útil para tiros cunha gran variación de brillo. Funciona tomando varias fotos en diferentes exposicións e combinándoas para crear a imaxe final. +\n +\nTeña en conta que HDR non é adecuado para escenas con movemento rápido e pode producir unha reprodución de cor menos precisa. +\n +\nTomar fotos en modo HDR será máis lento. + Os ficheiros DNG conteñen a información completa non comprimida e sen procesar da súa cámara. +\n +\nTen en conta que algunhas aplicacións de galería non recoñecen ficheiros DNG. As imaxes DNG pódense empregar con editores de imaxes especializados como Snapseed ou Lightroom. +\n +\nTen en conta que varias opcións de procesamento, como fotos de selos e nivel automático, só se aplicarán ás imaxes que non sexan DNG (JPEG/etc) e non ás imaxes DNG. + O nivel automático xirará automaticamente as fotos para que aparezan de nivel. +\n +\nTeña en conta que isto significa que as imaxes terán unha resolución lixeiramente inferior (debido á rotación e ao recorte que se requiren). + Introducir un ruído forte + Dicir \"cheese\" + Deter a escoita do audio + Comzar a escoitar o audio + GB + MB + Máximo tamaño de arquivo + Deter a gravación do vídeo + Iniciar a gravación do vídeo + O permiso de ubicación non está dispoñible + O permiso do micrófono non está dispoñible + Non se pode gardar neste cartafol + Framework de Almacenamento de Acceso cancelado + Selecciona o lugar de gardado + O cartafol xa existe + Fallo ao crear o cartafol + Inserir un novo nome ao cartafol + Usa Camera2 API + Non se pode acceder a este cartafol + Non se pode escribir neste cartafol + Novo cartafol + Cartafol superior + Compartir foto + Eliminar última foto + Cambiar ao modo de foto + Cambiar ao modo de vídeo + Cambiar á cámara traseira + Cambiar á cámara frontal + Modo escintileo + Modo Foco + Bloquear exposición + Exposición + Galería + Tomar foto + Copiar ao portapapeis + Non dispoñible + Dispoñible + Ten a certeza de que quere restaurar toda a configuración para patrón\? + Restaurar toda a configuración da Cámara por defecto + Restablecer axustes + Información do aplicativo e depuración + Sobre + Habilita funcións adicionais como os modos manuais de exposición, enfoque, balance de brancos, xunto con RAW (se o dispositivo o admite), pero é posible que non funcione correctamente en todos os dispositivos (provocará un reinicio) + Se che gusta este aplicativo, considera facer unha doazón para apoiar o desenvolvemento. Podes facelo mercando o meu aplicativo de doazón. Preme nesta opción para abrir a páxina do meu aplicativo de doazón. Grazas! + Doe para apoiar o proxecto + Inicie o sitio web de Cámara no seu navegador + Axuda en liña + Varios + Se está activado, o escintileo activarase/desactivarase ao gravar vídeo (pódese usar para indicar que a cámara segue gravando a distancia) + Escintileo durante a gravación de vídeo + Especique mono ou estéreo para gravar audio (estéreo só é admitido nalgúns dispositivos) + Canles de audio + O micrófono a usar para gravar audio +\n%s + Fonte do audio + Grave audio durante a gravación do vídeo + Gravar audio + A gravación de vídeo reiníciase de forma automática se o arquivo alcanza o tamaño máximo específicado polo dispositivo ou o definido polo usuario + Reiniciar tamaño máximo + A gravación de vídeo deterase e/ou reiniciarase (ver a opción máis abaixo) cando se alcanza o tamaño máximo (aproximado) do ficheiro. Teña en conta que moitos dispositivos Android teñen un tamaño máximo de ficheiro para os vídeos (normalmente ao redor de 2 GB ou 4 GB), pero esta opción permite establecer un valor específico. Ten en conta que esta opción non se pode usar para aumentar o máximo incorporado dun dispositivo. +\n% s + Máximo tamaño do arquivo de vídeo + Se o vídeo se detivo despois de acadar a duración máxima (se está definido), esta opción fará que o vídeo se reinicie ata o número de veces especificado +\n%s + Reiniciar o vídeo despois da duración máxima + A gravación do vídeo deterase despois da duración especificada +\n%s + Máxima duración dun vídeo + Estableza a velocidade de fotogramas (FPS) dos vídeos (pode ser aprox., non se garante que se alcance e pode causar un fallo na gravación de vídeo se a velocidade de fotogramas non é compatible). Comproba os vídeos resultantes para atopar a velocidade de fotogramas real empregada. Ten en conta que esta configuración ignórase para os vídeos en cámara lenta. +\n%s + Frecuencia de fotogramas do vídeo (aprox.) + Estableza a taxa de bits aproximada dos vídeos (maior significa mellor calidade, pero ocupa máis espazo no disco; pode causar un fallo na gravación de vídeo se a taxa de bits non é compatible) +\n%S + Taxa de bits do vídeo (aprox) + A estabilización do vídeo reduce a axitación debido ao movimento da cámara na previsualización e nos vídeos gravados. + Activar estabilización do vídeo + Activa a resolución 3840x2160 para a gravación de vídeos na cámara traseira - isto só funcionará se o teu dispositivo o soporta. + Forzar 4K UHD vídeo (experimental) + Resolución do vídeo + Garde fotos cun subproceso en segundo plano (para unha operación máis rápido) + Usar subproceso en segundo plano + Estilo a usar cando se grave texto nas fotos +\n%s + Estilo do texto + Cor da fonte a usar cando se grave texto nas fotos + Cor da fonte + Tamaño de fonte a usar cando se grave texto nas fotos + Tamaño de fonte + Grave fotos cun texto personalizado + Texto personalizado + Formato de gravado de GPS + Formato de gravado de hora + Formato de gravalo da data + Grave fotos con data e hora; tamén información do GPS se os datos da ubicación/dirección están activados +\n%s + Gravar fotos + Se os datos da ubicación están activados, só tome fotos/vídeos se hai datos de ubicación dispoñibles + Requerir datos da ubicación + Almacene a dirección do compás do GPS nas fotos + Almacenar a dirección do compás + Almacene os datos da ubicación do GPS nas fotos/vídeos + Almacenar datos da ubicación (Geotagging) + RAW + Establece a calidade JPEG das imaxes fotográficas gardadas (o valor predeterminado é 90%%). Non ten efecto no formato PNG da imaxe. +\n%s + Calidade da imaxe + Resolución + Configuración da ubicación… + Configuración dos vídeos… + Configuración das fotos… + Configuración das fotos e vídeos + Forzar a visualización da pantalla a ter o brillo máximo, no canto do valor predeterminado do dispositivo + Forzar brillo ao máximo + Se é activado, a pantalla non se apagará mentres a interface de usuario principal da Cámara estea activa + Manter pantalla acendida + Amosa unha contorna na pantalla para indicar a captura dunha foto + Amosar contorna cando se está tirando unha fotografia + Amosa a animación en miniatura en movemento ao tomar unha foto + Amosar animación en miniatura + Optar por amosar o elemento emerxente das mensaxes da pantalla + Amosar mensaxes na pantalla + Unha guía de recorte amosa un rectángulo que indica a relación de aspecto especificada, útil se planea rcortar a foto7vídeo posteriormente cunah relación de aspecto diferente. Require modo de foto WYSIWYG, ou estar en modo de vídeo +\n%s + Amosar guía de recorte + Cuadrícula + Amosar cuadrícula + Amosa o nivel actual da batería na pantalla + Amosar batería + AMosa a hora ctual na pantalla + Amosar hora + Amosa a dirección do compás do dispositivo na pantalla + Amosar a dirección do compás + Cor de subliñado cando a cámara está case nivelada + Cor de subliñado de ángulo/altitude + Amosa liña de nivel horizontal + Amosar a liña do ángulo + Amosa o ángulo de orientación actual do dispositivo na pantalla + Amosar ángulo + Amosa o espazo de almacenamento restante do dispositivo na pantalla + Amosar memoria libre + Amosa o nivel da ISO actual (require API de Camera2) + Amosar ISO + Amosa o control deslizante para controlar a ampliación + Amosar control deslizante da ampliación + Amose os botóns para o control da ampliación -/+ + Amosar controis ampliación -/+ + Amose o nivel de ampliación actual da cámara na pantalla (cando se amplía) + As imaxes serán rotadas automaticamente para que estean niveladas perfectamente (só as fotos) (máis lenta en tomar fotos e pode que falle en dispositivos con pouca memoria) + Amosar ampliación + Modo inmersivo + Ubicación da Interface de Usuario + Tamaño da vista previa + Interface de pantalla… + Opción para rotar a vista previa (non afectará ás fotos/vídeos resultantes) +\n%s + Rotar vista previa + Ao gravar o vídeo, a interface de pantalla vloquearase para evitar deter accidentalmente a gravación. Desliza a pantalla para desbloqueala. Teña en conta que a gravación de vídeo sempre se deterá se o aplicativo entra en segundo plano ou se a pantalla se borra. + Bloquear pantalla ao gravar o vídeo + Realice o auto-foco cando a Cámara se inicie. Se presenta o problema onde o escintileo se acende ao iniciar, desactive esta opción + Realizar auto-foco ao iniciar + Se está activado, o Camera continuará a ser mostrado enriba de calquera pantalla de bloqueo (seguirás tendo que desbloquear para acceder á Configuración, Galería, etc) + Amosar cámara aínda que o dispositivo estea bloqueado + Formato da hora para o nome do arquivo + O prefixo usado para o nome dos vídeos + Gardar o prefixo do vídeo + O prefixo usado para o nome das fotos + Gardar prefixo da foto + Utilice o Framework de Acceso do Almacenamento para gardar fotos e vídeos. Isto debe ser activado para permitir que se garde nunha tarxeta SD externa. + Usar o Framework de Acceso do Almacenamento + Cartafol para gardar os arquivos da foto/vídeo + Cartafol de almacenamento + Sensibilidade ao nivel de ruído para a opción de audio (ruído forte) + Sensibilidade do control do audio + Opcións de control do audio + Teclas do volume + Reproducir un son ao tomar unha foto + Son da captura + Deter a pantalla despois de toamr unha foto, coa opción de compartir ou eliminar a foto + Deter despois de tomar a foto + Toma unha foto simplemente premendo dúas veces a pantalla + Premer para capturar + Máis controis de cámara… + Intervalo do modo disparo continuo + Repetir + Activa a ocnta regresiva por voz para o temporizador ou do modo disparo continuo (a partir dos 60 segundos) + Conta regresiva do temporizador por voz + Soar cando o temporizador está contando regresivamente ou para o atraso do modo disparo continuo + Son do temporizador + Temporalizador + Controis de cámara + Use a detección de rostros no canto das áreas de foco + Detección de rostro + Se é establecido, a orientación do dispositivo será ignorada e a orientación da foto/vídeo será con respecto á orientación especificada +\n%s + Bloquear a orientación de fotos e vídeos + Establece a 0 para a compensación da Exposición por defecto + Establece a compensación da Exposición + A maior valor significa maior sensibilidade á luz (pode non funcionar nalgúns dispositivos) + Establecer ISO + Elixe un axuste de balances de brancos + Establece o balance de brancos + Optimiza a foto para distintas escenas + Aplicar modo de escena + Aplica o efecto de cor seleccionado á foto + Aplicar un efecto de cor + Nivel automático + Efectos da cámara + m + Erro no gravado da información + Desliza para desbloquear] + [BLOQUEADO: + Libre + AMPLIACIÓN + POR OUTRO APLICATIVO\? + PODE ESTAR A CÁMARA EN USO + ERRO AO ABRIR A CÁMARA. + Dirección + Ángulo + Modo de escena + Efecto de cor + Duración máxima + Audio deshabilitado + Sentímolo, auto-estabilizar non está +\nsoportado neste dispositivo + Desbloqueado + A pantalla está bloqueada +\ndeslice o dedo pola pantalla para desbloquear + Non hai un aplicativo de galería dispoñible + Foto eliminada + Ubicación GPS non está dispoñible + Erro ao tomar a foto + Tomando foto + Erro ao iniciar a vista previa da cámara + Erro do nivel automático + Fallou ao gardar a foto RAW + Erro ao gardar a foto + Sentímolo + Gravando + Erro ao gravar o vídeo + Erro ao gardar o vídeo + Temporizador iniciado + Disparo continuo cancelado + Temporizador cancelado + Exposición desbloqueada + Exposición bloqueada + Vídeo + Foto + Cámara traseira + Cámara frontal + Infinitivo + Distancia focal + FPS + Compensar exposición + O vídeo alcanzou o máximo tamaño + O vídeo alcanzou a máxima duración + O servidor parou, o vídeo foi detido + Erro descoñecido, vídeo detido + non soportado no teu dispositivo + Erro, o arquivo devídeo pode estar danado + Erro ao volver a conectar a cámara + repite para ir + Deteuse a gravación de vídeo + Cambiar a ruta de gardado a: + ISO + Balance de brancos + Apertura + Autores + Termos de servizo + Código fonte + Licenza + Versión de compilación + 80% + 70% + Desactivado + Se esta opción está habilitada, as raias de cebra debuxaranse na pantalla mostrando onde está demasiado exposta a vista previa da cámara. +\n%s + Amosar raias da cebra + Luminosidade (Media do mín-máx) + Intensidade (Media) + Valor (Máximo) + Luminosidade + Cores RGB + Desactivado + Deixar de almacenar datos de localización +\n%s + Activar gravado da foto + Indica se é amosada unha icona na pantalla para activar ou desactivar o gravado de fotos + Amosar icona gravado da foto + Desactivar auto-nivel + Activar auto-nivel + Indica se é amosada unha icona na pantalla para habilitar ou desactivar o nivel automático. Cando o nivel automático está activado, as fotos xiraranse de xeito que queden automaticamente ao nivel do horizonte. + Amosar icona de auto-nivel + Detección facial desactivada + Detección facial activada + Desactivar detección facial + Activar detección facial + Indica se é amosada unha icona na pantalla para activar ou desactivar a detección de rostros + Ensinar a icona de detección da cara + Iconas na parte superior (retrato) + Interface de usuario para destros + Interface de usuario para zurdos + Luz baixa + Normal + Modo NR + PNG + WebP + Formato da imaxe + Non se atopou ningún diálogo de ficheiro neste dispositivo, a opción non é compatible + Erro ao restaurar a configuración + Erro ao gardar a configuración + Restaura a configuración gardada previamente. Isto substituirá todas as opcións actuais coas opcións gardadas! + Configuración gardada + Esta opción permítelle seleccionar un dos ficheiros de configuración que xa gardou. Ten en conta que se seleccionas un ficheiro para cargar sobrescribirás todas as opcións actuais! + Restaurar configuración + Gardar nome da configuración + Gardar toda a configuración de Cámara nun ficheiro + Gardar configuración + Xestor de configuración + WebM (audio non compatible) + 3GPP + MPEG4 HEVC + MPEG4 H264 + Predeterminado + Formato de ficheiro de vídeo e audio e códecs +\n%s + Formato vídeo + Sempre + Intelixente + Desactivado + Cando se usa un algoritmo de mellora do contraste para HDR. Isto pode mellorar a aparencia nos casos en que hai un rango dinámico moi alto na escena e tamén dá un aspecto HDR aos resultados. +\n%s + Mellora do contraste HDR + -3 (sensiblidade baixa) + -2 + -1 + 0 (predeterminado) + +1 + +2 + +3 (sensiblidade alta) + 2,4 (12:5) + 2,35 (47:20) + 2,33 (21:9) + 2 (2:1) + 1,85 (37:20) + 1,78 (16:9) + 1,5 (3:2) + 1,4 (7:4) + 1,33 (4:3) + 1,25 (5:4) + 1 (1:1) + Ningún + Soprote do foco eliminado + 9GB + 5GB + 2GB + 1GB + 500MB + 300MB + 200MB + 100MB + Predeterminado polo dispositivo + 2h + 1h + 30m + 20m + 10m + 5m + 2m + 1m + 30s + 20s + 15s + 10s + 5s + ft + 3s + 2s + 1s + 0,5s + Sen atraso + Ilimitado + 500x + 200x + 100x + 50x + 40x + 30x + 20x + 10x + 5x + 4x + 3x + 2x + Desactivado + Anterior + Aumentar ou diminuír a compensación da exposición + 4x + 2x + Desactivado + Indica se está achegado ao axustar a distancia de enfoque manual +\n%s + Foco asistido + Alta calidade + Rápido + Mínima + Desactivado + Predeterminado + Algoritmo que o controlador da cámara debería usar para aplicar a redución de ruído. O algoritmo de redución de ruído intenta mellorar a calidade da imaxe eliminando o ruído excesivo engadido polo proceso de captura, especialmente en condicións escuras. (Teña en conta que isto non está relacionado co modo de foto de redución de ruído e, de feito, esta configuración ignórase no modo de foto NR). +\n%s + Algoritmo de redución do ruído + Configuración do proceso… + Algoritmo que o controlador da cámara debería empregar para mellorar o bordo. A mellora do bordo mellora a nitidez e os detalles da imaxe capturada. (Esta configuración ignórase no modo foto NR.) +\n%s + Algoritmo de modo Edge + Indica se é amosada a información sobre novas funcións e melloras cando o aplicativo se actualizou + Amosas o diálogo Novidades + + Metros + Utilízase para a altitude GPS para gravados de fotos e subtítulos de vídeo +\n%s + Unidade de distancia + Descoñecida + Alta + Media + Baixa + Non fiable + O compás do dispositivo precisa calibrarse para mellorar a súa precisión. Isto pódese facer movendo o dispositivo nun movemento de 8. +\n +\nPrecisión actual: + Dirección do compás + Engadir distancia infinita + Distancia de destino entre parénteses de foco + Distancia da fonte entre parénteses de foco + Soporte do foco + Foco {} + Indica se é amosado o nivel de audio na pantalla ao gravar vídeo + Mostrar medidor de nivel de audio + non explosivo + 200Mb/s + 150Mb/s + 100Mb/s + 90Mb/s + 80Mb/s + 70Mb/s + 60Mb/s + 50Mb/s + 40Mb/s + 30Mb/s + 20Mb/s + 15Mb/s + 10Mb/s + 9Mb/s + 8Mb/s + 7Mb/s + 6Mb/s + 5Mb/s + 4Mb/s + 3Mb/s + 2Mb/s + 1Mb/s + 500kb/s + 200kb/s + 100kb/s + Predeterminado + Non procesado + Optimizado para o recoñecemento de voz + Optimizada para voz + Entrada de audio predefinida + Micrófono externo (se existe) + Videocámara + Perfil de rexistro + Rexistro (Extra forte) + Rexistro (Forte) + Rexistro (Medio) + Rexistro (Baixo) + Rexistro (Fino) + Predeterminado + Establece o perfil de imaxe estándar ou plano para o modo de vídeo +\n%s + Perfís de imaxes de vídeo + Permite sacar fotos mentres gravas vídeos. Desactívao se hai problemas coa gravación de vídeo coa API Camera2 habilitada no teu dispositivo. + Permite fotos mentres gravas vídeo + Non se pode abrir esta imaxe + Non se atopou ningún diálogo de ficheiro neste dispositivo, a opción de imaxe fantasma non é compatible + Imaxe seleccionada + Última foto tomada + Desactivado + Superpoña unha imaxe para axudar ao aliñamento. +\n%s + Imaxe da fantasma + Apagado + 60Hz + 50Hz + Auto + Algoritmos para reducir o parpadeo da luz. +\n%s + Redutor de parpadeo + Pantalal da lanterna + Pantalla escintileo acendido + Pantalla escintileo automático + Ollos vermellos + Lanterna + Escintileo acendida + 7 minutos + 6 minutos + 5 minutos + 4 minutos + 3 minutos + 2 minutos + 1 minuto + 30 segundos + 15 segundos + 10 segundos + 5 segundos + 3 segundos + Ilimitado + Crea un ficheiro de subtítulos (.SRT) que almacena a data e a hora; e tamén información GPS se os datos de localización / dirección están habilitados +\n% s + Subtítulos no vídeo + Posterior + Amosar un histograma + Deixar de almacenar datos de localización + Datos da ubicación do almacenamento + Indica se é amosada unha icona na pantalla para habilitar ou desactivar os datos de localización (xeoetiquetado) + Amosar a icona de datos de localización da tenda + Non amosar o enderezo + Prefire o enderezo que os GPS + Amosar o enderezo se é posible, ademais das coordenadas GPS + Usar enderezos + Kraken Smart Housing + Telecomando conectado + Para vivendas subacuáticas, mellora a precisión se está seleccionada o tipo de auga correcto. + Use Saltwater para cálculos en profundidade + Consello: configura o brillo predeterminado ao nivel mínimo antes de iniciar a cámara. + Diminuír a pantalla se está desconectado o control remoto + Dispositivo descoñecido + Bluetooth non compatible. + Análise de dispositivos BLE + BLE non compatible + Tipo de dispositivo remoto + Activa os dispositivos de control remoto Bluetooth LE (BLE) + Habilitar telecomando Bluetooth LE + Mando a distancia Bluetooth LE… + Panorámica + Panorámica + Modo de pouca luz: manteña a cámara estable + Desbloquear exposición + Indica se é amosada unha icona na pantalla para bloquear ou desbloquear a exposición + JPEG + Amosar a icona de bloqueo de exposición automática + Balance branco desbloqueado + Balance branco bloqueado + Desbloquear balance branco + Bloquear balance branco + Indica se é amosada unha icona na pantalla para bloquear ou desbloquear o balance de branco automático + Amosar a icona de bloqueo automático do balance de brancos + Indica se é amosada unha icona na pantalla para especificar o texto personalizado que se gravará na foto + Amosar icona da foto co texto personalizado gravado + Gravado da foto desactivada + Gravado da foto activado + Desactivar gravado da foto + Escintileo automático + Escintileo apagado + Cámara lenta deshabilitada + Cámara lenta habilitada + Normal + Velocidade + 200 + 150 + 100 + 50 + 40 + 30 + 25 + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + Número de fotos + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + Número de fotos + Ningún + mm/dd/aaaa + dd/mm/aaaa + dd-mm-aaaa (ISO 8601) + Predeterminado + Só DNG (RAW) + Estándar e DNG (RAW) + Non + Procesando… + Texto para gardar nos metadatos da imaxe para a etiqueta de dereitos de autor (só en formato JPEG). (Deixar en branco para ningún.) + Dereitos de autor + Texto para gardar nos metadatos da imaxe para a etiqueta de artista (só en formato JPEG). (Deixar en branco para ningún.) + Artista + Personalizar etiquetas EXIF + Predeterminado + Alta velocidade + no centro da pantalla + abaixo da pantalla + enriba da pantalla + na dereita da pantalla + na esquerda da pantalla + caras detectadas + cara detectada + Doar + Novidades: + Pizarra branca + Solarizar + Sepia + Posterizar + Ningún + Negativo + Monocromo + Pizarra negra + Auga + Teatro + Posta do sol + Estabilizador + Deportes + Neve + Retrato + Festa + Retrato nocturno + Nocturno + Paisaxe + Fogos artificiais + Auto + Luz das velas + Praia + Código de barras + Acción + Manual + Luz cálida + Crepúsculo + Sombra + Incandescente + Fluorescente + Luz do día + Nuboso + Auto + Erro ao crear a imaxe HDR + Erro ao inicializar a escoita do audio + Capturando… + Reanudar a gravación de vídeo + Deter a gravación de vídeo + Vídeo reanudado + Vídeo en pausa + Amosa a icona para facer fotos e gravar vídeos. Desmarque se prefire facer fotos por outros métodos (por exemplo, se o seu dispositivo ten un botón de disparo de hardware ou se emprega as teclas de volume). + Amosa icona para tomar foto + 1 hora + 45 minutos + 30 minutos + 25 minutos + 20 minutos + 15 minutos + 12 minutos + 11 minutos + 10 minutos + 9 minutos + 8 minutos + Información da cámara + Cámara está bifurcada de OpenCamara + A cámara usa iconas das iconas de Material Design de Google (https://developer.android.com/design/downloads/index.html, https://design.google.com/icons/, https://github.com/google/ material-design-icons /, https://google.github.io/material-design-icons/) baixo a licenza Apache versión 2.0. Algúns iconas inclúen modificacións. Preme aquí para ver o texto completo da licenza. + Iconas de Material Design de Google + A cámara é © 2013–2019 Mark Harman, publicada baixo a GPL v3 ou posterior. Preme aquí para ver o texto completo da licenza. + Cámara + Licenza de Código Aberto + Almacene a guiñada, o cabeceo e o balanceo do dispositivo no comentario de usuario Exif da foto (só en formato JPEG) + Almacena a guiñada, cabeceo e balanceo + Movemento lento + Taxa de cadros + Taxa de bits + 4K UHD + Se son permitidas accións de premer longo (por exemplo, premer longo na galería para cambiar a situación de gardado). + Permitir accións de premer longo + Mostrar o número de identificación da cámara actual na pantalla + Amosar cámara ID + Se está activado, use botóns separados para cambiar entre cámaras dianteiras/traseiras e para cambiar entre varias cámaras fronte/atrás. Se está desactivada, a icona Cambiar cámara percorrerá todas as cámaras. + Icona de cámaras múltiples + Cambiar entre cámaras múltiples + Cambiar cámara + Cambiar á cámara externa + Ultra-ancho + Cámara externa + Branco + Transparente + Laranxa + Vermello + Negro + Cor para empregar na franxa de fondo cando se mostran raias de cebra. +\n%s + Cor de fondo de raias de cebra + Cor para empregar na raia de primeiro plano cando se mostran raias de cebra. +\n%s + Cor de raias de cebra en primeiro plano + Valor alfa para usar nas imaxes pantasmas. Un valor inferior significa máis transparente, maior significa máis opaco. +\n%s + Opacidade da imaxe pantasma + Agochar todo + Agochar GUI + Agochar os botóns de navegación virtual na pantalla + Só diminuír os botóns de navegación virtual na pantalla + Apagado + 2,8 + 2,6 + 2,4 + 2,3 + 2,2 + 2,1 + 2,0 + 1,9 + 1,8 + Que cor usar para resaltar os bordos enfocados +\n%s + 1,6 + Valor gamma que se usará no vídeo se o perfil da imaxe de vídeo está configurado en Gamma +\n%s + Valor gamma vídeo + Gamma + sRGB + REC709 + Seleccionar dispositivo remoto + Preme para focar e preme o botón azul da cámara para facer fotos. +\n +\nPara desactivar o brillo máximo da pantalla, consulte Configuración / GUI na pantalla / \"Forzar o brillo máximo\". Para gardar en tarxetas SD en Android 5+, consulte Configuración / Máis controis da cámara / \"Use Storage Access Framework\". Para obter máis axuda, preme en \"Axuda en liña\" en Configuración. + Se é posible, use un enderezo cando seleccione localizacións GPS. Esta opción require unha conexión a Internet. Teña en conta que, se está activado, é necesario que o dispositivo transmita datos de localización a través de Internet a un terceiro para converter as coordenadas GPS a un enderezo. Vexa https://developer.android.com/reference/android/location/Geocoder. +\n%s + Tire fotos/vídeos cando se detecte un ruído ou por comando de voz. Cando estea activado, use o botón de micrófono en pantalla para iniciar/deixar de escoitar. Teña en conta que a opción de comando de voz utiliza o servizo de recoñecemento de voz de Android: cando se usa esta opción, é probable que os datos de audio se envíen a servidores remotos para realizar o recoñecemento de voz. +\n%s + API Camera2 + Cámara API orixinal + Seleccione a API Camera2 para habilitar funcións adicionais, como modos manuais de exposición, enfoque, balance de branco, xunto con RAW (se o dispositivo o admite). Cambiar a API provocará un reinicio. +\n%s + Cámara API + Seleccione o formato de ficheiro usado para gardar fotos. Isto afecta ás fotos \"estándar\" (non RAW). Teña en conta que o formato PNG non é realmente sen perdas, senón que se converte desde un formato JPEG con calidade 100 %%. +\n%s + Barra de busca para cambiar a compensación de exposición + ID + Garda imaxes orixinais e depura XML + Gardar imaxes orixinais + Non gardar imaxes orixinais + Indica se se gardan as imaxes orixinais no modo panorámico. Teña en conta que isto gardará as fotos panorámicas máis lentamente. Permite tamén a opción de gardar un ficheiro XML que pode ser útil para informar de problemas con panorama. +\n%s + Imaxes orixinais panorámicas + Para facer unha imaxe panorámica, manteña o dispositivo en orientación vertical e preme para tirar unha foto para iniciar a panorámica. A continuación, xira o dispositivo á esquerda ou á dereita para mover o círculo branco centrado sobre o punto azul. Despois de capturar cada nova imaxe, siga xirando o dispositivo para cubrir cada novo punto azul que aparece á súa vez. +\n +\nPreme na icona de marca para gardar a panorámica ou na icona cruzada para cancelar. +\n +\nTen en conta que as fotos panorámicas poden levar tempo para procesarse e gardarse. + Para o modo panorámico, se están eliminados os límites ondulados +\n%s + Panorámica auto-recortada + Erro ao crear imaxe Panorámica + Panorámica cancelada + Cancelar panorámica + Finalizar panorámica + Gardando imaxes… + Texto con fondo sombreado + Texto plano + Texto sombreado + Buscar + Telecomando actual: + Indica se é amosada unha icona na pantalla para circular polos modos RAW + Amosar icona RAW + Cicla modos RAW + Indica se a opción RAW tamén se debe aplicar ao modo de foto entre parénteses de foco. Se esta opción está desactivada, só se gardarán os JPEG nos modos de foto entre parénteses de foco. + Permitir RAW para o focus bracketing + Indica se a opción RAW tamén se debe aplicar ao modo de foto de bracketing expo (ou ao modo HDR cando está activado \"Gardar todas as imaxes para o modo HDR\"). Se esta opción está desactivada, só se gardarán JPEG neses modos de foto. + Permitir RAW para o bracketing expo + Indica se é amosada unha icona na pantalla para circular polas opcións de escintileo no canto de mostrar as opcións de escintileo no menú emerxente + Amosar icona do escintileo + Escintileo circular + Previsualizar cámara… + Restante + Foco de cor máxima + Activado + Desactivado + Se esta opción está activada, os resaltados mostraranse nos bordos enfocados (contornos). Isto é principalmente útil para o foco manual e pode usarse para determinar que rexións da imaxe están focadas. +\n%s + Foco máximo + 100% + 99% + 98% + 97% + 95% + 93% + 90% + \ No newline at end of file diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index e7be78dbc..c63ba8ebd 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,24 +1,25 @@ - - Camera + Kamera Beállítások Felugró beállítások OK (Ez az üzenet nem jelenik meg újra) - - Be - Ki - + Be + + Ki + Válaszd ki a mentés helyét: Könyvtárelőzmények törlése - Törlöd a könyvtárelőzményeket? + Törlöd a könyvtárelőzményeket\? Válassz másik könyvtárat Mentés helye módosult erre: Videofelvétel megállítva - ismétlések az indításhoz + ismétlések az indításhoz + Nem sikerült újrakapcsolódni a kamerához Hiba történt, a videofájl sérülhetett - nem támogatott az eszközödön + nem támogatott az eszközödön + Ismeretlen hiba, a videó leállítva A kiszolgáló leállt, a videó megállítva A videó elérte a maximális hosszt @@ -36,7 +37,7 @@ Időzítő megszakítva Sorozatfelvétel megszakítva Időzítő elindult - Nem sikerült menteni a videofájlt + Nem sikerült menteni a videofájlt Nem sikerült videofelvételt készíteni Videofelvétel elindult Sajnálom @@ -49,15 +50,16 @@ A GPS helymeghatározás nem érhető el Fotó törölve Nincs elérhető galéria alkalmazás - Képernyő zárolva\nA feloldáshoz csúsztasd az ujjad a képernyőn + Képernyő zárolva +\nA feloldáshoz csúsztasd az ujjad a képernyőn Feloldva - Sajnálom, az auto-stabilizálás\nnem támogatott ezen az eszközön + Sajnálom, az auto-stabilizálás +\nnem támogatott ezen az eszközön Hang letiltva Max időtartam Színhatás Fotó üzemmód Fehéregyensúly - Szög Irány NEM SIKERÜLT MEGNYITNI A KAMERÁT. @@ -68,10 +70,9 @@ Szabad [Zárolva: Csúsztasd a feloldáshoz] - Nem sikerült információkat írni a fotóba - m - + m + Kamera hatások Auto-stabilizálás A képek elforgatásra kerülnek, így automatikusan jó irányba fognak állni (csak fotók) (a fotózás kicsit lassabb, és kevés memóriájú eszközön sikertelen is lehet) @@ -86,10 +87,10 @@ Expozíció kompenzáció beállítása Az alapértelmezett kompenzációhoz állítsd 0-ra Fotó/videó tájolás zárolása - Ha be van állítva, a készülék tájolása figyelmen kívül lesz hagyva, és a fotó/videó a megadott tájolás szerint fog állni\n%s + Ha be van állítva, a készülék tájolása figyelmen kívül lesz hagyva, és a fotó/videó a megadott tájolás szerint fog működni +\n%s Arcfelismerés Arcfelismerés használata fókuszterületek helyett - Kamera kezelés Időzítő Időzítő hangjelzés @@ -97,7 +98,7 @@ Hangos visszaszámlálás Az időzítő és sorozatfelvétel visszaszámlálás késleltetésének bemondása (60 másodperctől) Sorozatfelvétel - Sorozatfelvétel intervallum + Sorozatfelvétel időköz További kamera beállítások… Exponálás érintéssel Fénykép készítése az előnézet érintésével, vagy dupla koppintással @@ -152,7 +153,8 @@ Akkumulátor megjelenítése Az aktuális akkumulátortöltöttség megjelenítése a képernyőn Rács megjelenítése - Rács + Rács + Vágási segédvonal megjelenítése A vágási segéd egy négyzetet jelenít meg, mutatva, hogy nézne ki a megadott oldalarány – hasznos, ha a fotót/videót később más oldalarányúra tervezed vágni. WYSIWYG fényképmód, vagy videózás mód szükséges hozzá\n%s \"toast\" üzenetek megjelenítése @@ -165,14 +167,14 @@ Ha engedélyezve van, akkor a képernyő nem kapcsol ki, míg az Camera főképernyője aktív Maximális fényerő kényszerítése A kijelző mindenképpen maximális fényerővel üzemel, az eszköz alapértelmezése helyett - Fotó és videó beállítások Fotó beállítások… Videó beállítások… Helymeghatározás beállítások… Kamera felbontása Képminőség - Beállítja, hogy a képek milyen JPEG minőséggel legyenek elmentve (ajánlott érték 90%%)\n%s + Beállítja, hogy a képek milyen JPEG minőséggel legyenek elmentve (ajánlott érték 90%%)\n%s + RAW Helyadatok eltárolása (geotaggelés) Eltárolja a GPS helyadatot a fotóban/videóban @@ -217,10 +219,9 @@ Hangforrás Hangrögzítésre használandó mikrofon\n%s Hangcsatornák - Monó vagy sztereó hangfelvétel készítése (sztereó felvételre nem minden eszköz képes)\n%s + Monó vagy sztereó hangfelvétel készítése (sztereó felvételre nem minden eszköz képes) Villogás felvétel alatt Ha engedélyezve van, a vaku ki-be kapcsol a felvétel alatt (ezzel jelezhető, hogy egy kamera épp rögzít a távolban) - Egyéb Online súgó Camera weboldal megnyitása böngészőben @@ -233,11 +234,9 @@ Beállítások visszaállítása Az Camera összes beállítását alaphelyzetbe állítja Biztosan vissza szeretnéd állítani az Camera összes beállítását az alapértelmezettre? - Elérhető Nem elérhető Vágólapra másolás - Fotózás Galéria Expozíció @@ -250,7 +249,6 @@ Váltás fotó módba Utolsó kép törlése Fénykép megosztása - Szülő könyvtár Új könyvtár Nem lehet írni ebbe a könyvtárba @@ -258,42 +256,37 @@ Add meg az új könyvtár nevét Nem sikerült létrehozni a könyvtárat A könyvtár már létezik - Válaszd ki a mentés helyét Storage Access Framework visszavonva - Mikrofon engedély nem érhető el Hely engedély nem érhető el - Videofelvétel indítása Videofelvétel leállítása - Maximális fájlméret - MB - GB - + MB + + GB + Hangfigyelés indítása Hangfigyelés leállítása Mondd, hogy „csíííz” Csinálj hangos zajt - Az auto-stabilizálás automatikusan elforgatja a fotókat, hogy szintben legyenek.\n\nNe felejtsd el, hogy a képek így kicsit kisebb felbontásúak lesznek (a forgatás és vágás miatt). A DNG fájlok a kamera teljes, tömörítetlen és feldolgozatlan adatait tartalmazzák.\n\nA legtöbb galéria alkalmazás nem ismeri a DNG formátumot, érdemes helyette specializált alkalmazást használni.\n\nMegjegyzendő, hogy az utófeldolgozó beállítások, mint a „Fotók feliratozása” és „Auto-stabilizálás” csak a JPEG képekre kerülnek rá, a DNG-re nem.\n\nA DNG fájlok sokkal több helyet foglalnak; egy fájlkezelő alkalmazás hasznos lehet a másolásukhoz, törlésükhöz.\n\nDNG fájlok csak Normál és DRO fotómódban mentődnek. A HDR mód változó fényerejű felvételek készítésénél hasznos. Úgy működik, hogy több felvételt kész különböző expozíciós idővel, és ezeket összekombinálva hozza létre a végleges képet.\n\nMegjegyzendő, hogy a HDR nem alkalmas gyorsan mozgó tárgyak fotózására, mert kevésbé pontos színvisszaadást eredményez.\n\nA HDR fotók készítése lassabb. - Ne jelenjen meg újra - Fotómód - Norma + Norma + Normál HDR - Expo {} + Expo {} + Expozíció sorozat Fotó feliratozás Az összes kép mentése HDR módban Ha engedélyezve van, HDR mód használatakor a három eltérő expozíciójú alapkép is el lesz mentve a végleges HDR fotó mellett. Megjegyzendő, hogy a mentés így lassabb lesz, főleg ha a „Fotók feliratozása” vagy az „Auto-stabilizálás” is be van kapcsolva. - ENGEDÉLY NEM ELÉRHETŐ Engedély szükséges A kamera eléréséhez „kamera engedély” szükséges @@ -302,35 +295,29 @@ Hibakeresési lehetőségek Alternatív vakukezelés használata Engedélyezd, ha a készülék vakuja hibásan működik Camera2 API-val - Expozíciósorozat Képek száma az expozíciósorozat módban\n%s Expozíciósorozat lépésköz Az egyes képek készítése ennyi fényérték eltéréssel\n%s - - mp - + mp + Nincs elég szabad hely videofelvétel készítéséhez Felvétel leállítva\nAz akkumulátorszint kritikusan alacsony Kritikus akkumulátorszint ellenőrzés Leállítja a videofelvételt, ha az akkumulátor kritikusan alacsony szintre merül. Segít csökkenteni annak a kockázatát, hogy a felvétel hibás lesz, amikor az eszköz váratlanul lemerül és kikapcsol. - - Sötét - Világos + Sötét + + Világos + Zársebesség - Súlyos kamerahiba - Gyors HDR/expozíciósorozat engedélyezése Lehetővé teszi HDR képek / expozíciósorozatok gyorsabb rögzítését. Tiltsd le, ha problémákat tapasztalsz a készülékeden HDR vagy expozíciósorozat készítése közben (például a kamera leáll, vagy az expozíciósorozat rossz sorrendben készül) - Kamera Videofelvétel Szelfi - Előlapi kamera tükrözés Az előlapi kamera használatakor a kép tükrözése\n%s - Vízszint kalibrálása Ez a beállítás kalibrálja a készülék gyorsulásmérőjét, így az auto-stabilizálás és a képernyőn megjelenő vízszintező jól fog működni Helyezd a készüléket sík, vízszintes felületre (fekvő vagy álló helyzetben), majd nyomj a Kalibrálás gombra.\n\nA kalibrálás visszavonásához kattints a Visszaállításra.\n\nA megszakításhoz nyomd meg a vissza gombot. @@ -338,16 +325,13 @@ Visszaállítás Vízszint kalibrálva Vízszint kalibrálás visszaállítása - DRO - Osztóvonalak megjelenítése Vízszintes osztóköz megjelenítése Iránytű irányvonalak megjelenítése Irányvonalakat jelenít meg az iránytű alapján Videó feliratok Felirat (.srt) fájl létrehozása dátummal, idővel és GPS szélesség/hosszúság adatokkal\n%s - Korlátlan 3 másodperc 5 másodperc @@ -372,30 +356,22 @@ 30 perc 45 perc 1 óra - Fénykép készítése ikon megjelenítése A fénykép és videó készítése gombok megjelenítése. Hasznos, ha a készüléknek van saját fényképezés gombja, ezért a képernyőn lévőt nem használod. - Videó szünetel Videó folytatása Videofelvétel szüneteltetése Videofelvétel folytatása - Rögzítés… - Nem sikerült elindítani a hangfigyelést - Alapértelmezett - Csak JPEG JPEG és DNG (RAW) - Alapértelmezett éééé-hh-nn nn/hh/éééé hh/nn/éééé Nincs - Vaku ki Vaku automata Vaku be @@ -403,12 +379,10 @@ Vörös szem Képernyő vaku automata Képernyő vaku ki - Kamkorder Külső mikrofon (ha van) Alapértelmezett hangforrás Hangra optimalizált - Alapértelmezett 100kbps 200kbps @@ -433,7 +407,6 @@ 80Mbps 90Mbps 100Mbps - Ki 2x 3x @@ -448,7 +421,6 @@ 200x 500x Korlátlan - Nincs késleltetés 1mp 2mp @@ -466,14 +438,12 @@ 30p - Készülék alapértelmezett 100MB 200MB 300MB 500MB 1GB - Nincs 1 (1:1) 1.25 (5:4) @@ -485,7 +455,6 @@ 2.33 (21:9) 2.35 (47:20) 2.4 (12:5) - +3 (nagy érzékenység) +2 +1 @@ -493,13 +462,18 @@ -1 -2 -3 (alacsony érzékenység) - Balkezes felhasználói felület Jobbkezes felhasználói felület - Árnyékos szöveg Sima szöveg - + About + Összeállított verzió + A fényképezőgép villás az Camera-tól + Szerzők + Forráskód + Engedély + Kamera információ + Szolgáltatás feltételei Ki Csak a virtuális navigációs gombok elrejtése Kezelőfelület elrejtése @@ -509,11 +483,4 @@ Hangos zaj Hangutasítás: \"csíííz\" - Összeállított verzió - A fényképezőgép villás az OpenCamera-tól - szerző - Forráskód - engedély - Kamera információk - Szolgáltatási feltételek - + \ No newline at end of file diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml new file mode 100644 index 000000000..e01e44d82 --- /dev/null +++ b/app/src/main/res/values-is/strings.xml @@ -0,0 +1,967 @@ + + + Ofurvítt + Skipta um myndavél + 40 mínútur + 25 mínútur + 30 mínútur + 45 mínútur + 1 klukkustund + Sjálfvirkt + Skýjað + Dagsbirta + Flúrljós + Skuggi + Hlý + Handvirkt + Aðgerð + Strikamerki + Strönd + Sjálfvirkt + Flugeldar + Landslag + Nótt + Partí + Andlitsmynd + Snjór + Íþróttir + Sólsetur + Leikhús + Sægrænt + Einóma + Negatíva + Ekkert + Þrykkja + Sepía + Nýtt á döfinni: + andlit + Sjálfgefið + Höfundarréttur + Í vinnslu… + Nei + DNG (RAW) einungis + áááá-mm-dd (ISO 8601) + dd/mm/áááá + mm/dd/áááá + Fjöldi mynda + 2 + 3 + 4 + 5 + 6 + 8 + 10 + 12 + 15 + 20 + Fjöldi mynda + 2 + 3 + 4 + 5 + 6 + 8 + 10 + 12 + 15 + 20 + 25 + 30 + 40 + 50 + 100 + 150 + 200 + Leifturljós af + Leifturljós sjálfvirkt + Leifturljós á + Ljóskastari + Rauð augu + 50Hz + 60Hz + 100kbps + 200kbps + 500kbps + 1Mbps + 2Mbps + 3Mbps + 4Mbps + 5Mbps + 6Mbps + 7Mbps + 8Mbps + 9Mbps + 10Mbps + 15Mbps + 20Mbps + 30Mbps + 40Mbps + 50Mbps + 60Mbps + 70Mbps + 80Mbps + 90Mbps + 100Mbps + 150Mbps + 200Mbps + Skerpa {} + Stefna áttavita + Eining fyrir vegalengdir + ft + Hratt + Hágæða + 2x + 4x + 2x + 3x + 4x + 5x + 10x + 20x + 30x + 40x + 50x + 100x + 200x + 500x + Ótakmarkað + Engin töf + 0.5s + 1s + 2s + 3s + 5s + 10s + 15s + 20s + 30s + 1m + 2m + 5m + 10m + 20m + 30m + 1klst + 2klst + Sjálfgefin stilling tækis + 100MB + 200MB + 300MB + 500MB + 1GB + 2GB + 5GB + 9GB + 1 (1:1) + 1.25 (5:4) + 1.33 (4:3) + 1.4 (7:4) + 1.5 (3:2) + 1.78 (16:9) + 1.85 (37:20) + 2 (2:1) + 2.33 (21:9) + 2.35 (47:20) + 2.4 (12:5) + +3 (mikil næmni) + +2 + +1 + 0 (sjálfgefið) + -1 + -2 + -3 (lítil næmni) + Snjallt + Snið myndmerkis + MPEG4 H264 + Sleppa + LINSA + ISO + Upplausn myndskeiðs + Vista staðsetningu + Stærð forskoðunar + Birta tíma + Myndavél + Stillingar + Á + Af + RSEK + Óendanlegt + Frammyndavél + Bakmyndavél + Ljósmynd + Myndskeið + Því miður + Ólæst + Hvítvægi + Horn + Stefna + Aðdráttur + [LÆST: + Strjúktu til að aflæsa] + m + Stilltu ISO-ljósnæmni + Greining andlita + Niðurteljari + Endurtaka + Hljóð lokara + Hljóðstyrkshnappar + Stillingar ljósmynda… + Stillingar myndskeiða… + Stillingar staðsetningar… + Myndgæði + RAW + Leturstærð + Litur á letri + Taka upp hljóð + Uppruni hljóðmerkis + Ýmislegt + Hjálp á netinu + Endurstilla + Virknihamur + Yfirmappa + Ný mappa + Ekki tókst að búa til möppu + MB + GB + Segðu \"SÍS\" + Ekki birta þetta aftur + Ljósmyndahamur + HDR + Truflanasía + Krafist er heimildar + s + Dökkt + Bjart + Myndavél + Taka upp myndskeið + Kvarða + Frumstilla + Skjátextar myndskeiðs + Ótakmarkað + 3 sekúndur + 5 sekúndur + 10 sekúndur + 15 sekúndur + 30 sekúndur + 1 mínúta + 2 mínútur + 3 mínútur + 4 mínútur + 5 mínútur + 6 mínútur + 7 mínútur + 8 mínútur + 9 mínútur + 10 mínútur + 11 mínútur + 12 mínútur + 15 mínútur + MPEG4 HEVC + 3GPP + WebM (ekki stuðningur við hljóð) + Vista stillingar + Myndsnið + JPEG + WebP + PNG + Víðmynd + Víðmynd + Óþekkt tæki + 70% + 80% + 90% + 93% + 95% + 97% + 98% + 99% + 100% + Eftir + REC709 + sRGB + 1.6 + 1.8 + 1.9 + 2.0 + 2.1 + 2.2 + 2.3 + 2.4 + 2.6 + 2.8 + Fela viðmót + Ljósop + 4K UHD + X-Auto + X-HDR + X-Night + X-Bokeh + X-Bty + Myndavél + Byggingarútgáfa + Höfundar + Grunnkóði + Notkunarleyfi + Þjónustuskilmálar + Til baka + Næsta + Ofurlýsa + Styrkja + andlit + Háhraða + Sérsniðin EXIF-merki + Ljósmyndari + Staðlað og DNG (RAW) + Sjálfgefið + Ekkert + Hraði + Venjulegt + Sjálfvirkt + Af + Af + Sjálfgefið + Truflanaútreikningur + Sjálfgefið + Af + lágmarks + Af + Fyrra + Næsta + Af + Ekkert + HDR bæting birtuskila + Gildi (hámark) + Af + Litróf (gamma) + Litrófsgildi myndmerkis + Af + Svart + Rautt + Appelsínugult + Gegnsætt + Hvítt + Utanáliggjandi myndavél + Skipta á utanáliggjandi myndavél + Skiptu milli margra myndavéla + Í lagi (þessi skilaboð verða ekki birt aftur) + Laust + Sýna aðdrátt + Birta -/+ aðdráttarstýringar + Birta -/+ hnappa til að stýra aðdrætti + Sýna rafhlöðu + Birta reiti + Rúður + Upplausn myndavélar + Sérsniðinn texti + Textastíll + Um hugbúnaðinn + Tiltækt + Ekki tiltækt + Afrita á klippispjald + Taka mynd + Myndasafn + Lýsing + Staðlað + TS + Valkostir villukembingar + Valkostir villukembingar + Lokhraði + Myndskeið í bið + Haldið áfram með myndskeið + Setja upptöku myndskeiðs í bið + Halda áfram með upptöku myndskeiðs + Ómeðhöndlað + Sjálfgefið + Óáreiðanlegt + Lítil + Miðlungs + Mikil + Óþekkt + metrar + fet + Af + Alltaf + Sjálfgefið + Endurheimta stillingar + Vistaðar stillingar + Venjulegt + Lítið ljós + Bluetooth ekki stutt. + Af + Ljómi + Af + Á + Bitahraði + Rammatíðni + Ekkert + Táknmyndir frá Material-hönnun Google + Sýna ISO-ljósnæmni + Sýna laust minni + Std + Sjálfsmynd + Glóperur + Ljósaskipti + Kertaljós + Andlit að næturlagi + Stöðug mynd + Skanna + Skyggður texti + Ósniðinn texti + Vista myndir… + Auðkenni + Myndavél/Camera er kvíslað frá Camera + Upplýsingar um Myndavél + vinstra megin á skjánum + hægra megin á skjánum + efst á skjánum + neðst á skjánum + á miðjunni + Aðstoð við skerpu + Litstyrkur (meðaltal) + Ljósleiki (meðaltal lág-hámarks) + Birta litrendur + Fjarlægð skerpupunkts + Tek ljósmynd + Mistókst að taka mynd + Hljóðrásir + Truflanasíuhamur + Fletta í gegnum RAW-hami + Birta RAW-táknmynd + Texti með skyggðum bakgrunni + Ljúka við víðmynd + Hávaði + Raddskipun: \"sís\" + Aflæsa hvítvægi + Hvítvægi læst + Hvítvægi aflæst + Aflæsa lýsingu + Bluetooth LE fjarstýring… + Virkja Bluetooth LE fjarstýringu + Virkja Bluetooth LE (BLE) fjarstýringartæki + Gerð fjarstýringartækis + BLE ekki stutt + Leita að BLE-tækjum + Dimma skjá ef fjarstýring aftengist + Fjarstýring tengd + Nota heimilisföng + Geyma staðsetningargögn + Hætta að geyma staðsetningargögn + Birta litatíðnirit + RGB-litir + Hætta við víðmynd + Hætt við víðmynd + Sjálfvirkur utanskurður víðmyndar + GPS-staðsetning ekki tiltæk + Mynd var eytt + Læsa lýsingu + Gat ekki skrifað í þessa möppu + Gat ekki opnað þessa möppu + Settu inn heiti á nýrri möppu + Mappan er þegar til + Veldu staðsetningu til að vista + Hámarksstærð skráar + Læsa hvítvægi + Vista upprunalegar myndir + Fela allt + Viðauki: Auto + Viðauki: HDR + Viðauki: Night + Viðauki: Bokeh + Viðauki: Beauty / Face Retouch + Open Source notkunarleyfi + Stöðvaði upptöku myndskeiðs + ekki stutt á tækinu þínu + Jöfnun lýsingar + Mistókst að vista mynd + Mistókst að vista RAW-mynd + Tókst ekki að ræsa forskoðun myndavélar + Veldu staðsetningu vistunar: + Hreinsa feril möppu + Hreinsa feril möppu\? + Veldu aðra möppu + Breytti staðsetningu vistunar í: + Hámarkstímalengd + Skjárinn er læstur +\nstrjúktu eftir skjánum til að aflæsa + Hljóð óvirkt + Svart spjald + Hvítt spjald + Upplýsingar um höfund/ljósmyndara til að skrá í lýsigögn myndar (einungis JPEG-snið). (Skilja eftir autt til að sleppa) + Upplýsingar um höfundarrétt til að skrá í lýsigögn myndar (einungis JPEG-snið). (Skilja eftir autt til að sleppa) + Ljóskastari af skjá + Draugamynd + Síðasta mynd tekin + Valin mynd + Enginn skráagluggi fannst á þessu tæki, valkostur draugamyndar því ekki studdur + Get ekki opnað þessa mynd + Hvort renna eigi inn þegar verið er að aðlaga handvirkt fjarlægð skerpupunkts +\n%s + Misskerpt myndaröð sem hætt var við + Sýna auðkenni myndavélar + Leyfa aðgerðir þar sem ýtt er lengi + Litáhrif + MISTÓKST AÐ OPNA MYNDAVÉL. + Spila hljóð við myndatöku + Valkostir hljóðstýringar + Næmni hljóðstýringar + Birta ástand rafhlöðu á skjánum + Birta stoðlínur fyrir utanskurð + Birta skilaboð á skjá + Birta hreyfingar smámynda + Birta jaðar þegar ljósmynd er tekin + Bitahraði myndmerkis (áætlaður) + Ræsa vefsvæði myndavélarforritsins í vafranum þínum + Gefa til að styðja áframhaldandi þróun + Birta \"Taka mynd\" tákn + Mistókst að búa til HDR-mynd + Utanáliggjandi hljóðnemi (ef til staðar) + Sjálfgefinn uppruni hljóðmerkis + Bestað fyrir raddsímtöl + Bestað fyrir talgreiningu + engin runa + Sýna hljóðstyrksmæli + Misskerpt myndaröð + Fjarlægð myndavélar í misskerptri myndaröð + Fjarlægð viðfangsefnis í misskerptri myndaröð + Bæta við óendanlegri fjarlægð + Mistókst að vista stillingar + Mistókst að endurheimta stillingar + Enginn skráagluggi fannst á þessu tæki, valkostur því ekki studdur + Vinstri-handar notandaviðmót + Hægri-handar notandaviðmót + Táknmyndir efst (lóðrétt) + Birta tákn fyrir greiningu andlita + Hamur fyrir lítið ljós: haltu myndavélinni stöðugri + Nota Saltwater fyrir útreikninga dýptar + Velja frekar heimilisföng en GPS-hnit + Ekki birta heimilisfang + Hvort birta eigi litatíðnirit litanna sem sjást á skjánum +\n%s + Skerpumerking + Ef þessi valkostur er virkjaður, verður settur áherslulitur á brúnir sem eru skarpar (jaðrar). Þetta er fyrst og fremst notadrjúgt við handvirka stillingu skerpu, en er einnig ábending um hvaða svæði myndar séu skörp. +\n%s + Litur skerpumerkingar + Hvaða lit á að nota til að áherslulita brúnir sem eru skarpar +\n%s + Leyfa RAW í misskerptum myndaröðum + MYNDAVÉL GÆTI VERIÐ Í NOTKUN + AF ÖÐRU FORRITI\? + Mistókst að stimpla upplýsingar á mynd + Myndavélabrellur + Virkja litáhrif + Beitir völdum litáhrifum á myndina + Nota greiningu andlita í stað skerpusvæða + Hljóðmerki niðurteljara + Millibil í endurtekningarham + Fleiri myndavélarstýringar… + Snerta til að byrja upptöku + Í bið eftir að mynd er tekin + Mappa þar sem á að vista ljósmyndir/myndskeiðaskrár + Vista forskeyti ljósmynda + Forskeyti sem verður bætt framan við nöfn ljósmyndaskráa + Vista forskeyti myndskeiða + Forskeyti sem verður bætt framan við nöfn myndskeiðaskráa + Tímasnið skráarheita + Sýna myndavél þegar er læst + Framkvæma sjálfvirka skerpu í ræsingu + Hvort eigi að stilla skerpu sjálfvirkt þegar myndavélarforritið er gangsett. Ef þú átt í vandræðum með að kvikni á leifturljósi við gangsetningu, skaltu gera þetta óvirkt + Læsa skjá við upptöku myndskeiðs + Snúa forskoðun + Viðmót á skjánum… + Staðsetning viðmóts + Sýna horn + Sýna hornlínu + Halda skjánum gangandi + Þvinga hámarks birtustig + Stillingar ljósmynda og myndskeiða + Stilltu myndgæði JPEG eða WebP-ljósmynda (sjálfgefið gildi er 90%%). Hefur engin áhrif á PNG-myndsnið. +\n%s + Nota Camera2 API + Virkja greiningu andlita + Gera greiningu andlita óvirka + Greining andlita virk + Greining andlita óvirk + Myndbandstökuvél + Stillingar sprettglugga + endurtekningar eftir + Gat ekki endurtengst myndavél + Villa, myndskeiðsskráin gæti verið skemmd + Óþekkt villa, myndskeið stöðvaðist + Þjónninn dó, myndskeið stöðvaðist + Því miður, sjálfvirk aðlögun á halla +\ner ekki studd á þessu tæki + Sjálfvirk aðlögun halla + Birta fyrirliggjandi ISO-ljósnæmni. (Krefst notkunar Camera2 API.) + Birta lárétta jafnvægislínu + Litur á áherslulitun þegar myndavél er nálægt því lárétt + Stimpla ljósmyndir + Snið dagsetningarmerkis + Stimpla mynd + Myndskeið stöðvað +\nVarhugavert lág hleðsla rafhlöðu + Halli kvarðaður + Hallakvörðun endurstillt + Notað í GPS-hæðarmælingar fyrir stimplun í myndir og skjátexta myndskeiða +\n%s + Birta tákn fyrir sjálfvirka aðlögun halla + Virkja sjálfvirka aðlögun halla + Virkja myndstimpil + Gera myndstimpil óvirkan + Myndstimpill virkur + Myndstimpill óvirkur + Birta tákn fyrir stimplun sérsniðins texta á mynd + Nota heimilisföng ef mögulegt er auk GPS-hnita + Tímalengd myndskeiðs náði hámarki + Skráarstærð myndskeiðs náði hámarki + Lýsing læst + Lýsing ólæst + Hætt við niðurteljara + Hætt við endurtekningarham + Ræsti niðurteljara + Mistókst að vista myndskeiðsskrá + Mistókst að taka upp myndskeið + Byrjaði upptöku myndskeiðs + Mistókst að aðlaga halla sjálfvirkt + Stimplaðu ljósmyndir með dagsetningu og tíma og einnig GPS-upplýsingum ef staðsetning/stefnugögn eru virk +\n%s + Snið tímamerkis + Snið GPS-merkis + Stimplaðu ljósmyndir með sérsniðnum texta + Stærð leturs þegar texti er stimplaður á myndir +\n%s + Litur leturs þegar texti er stimplaður á myndir +\n%s + Stíll sem á að nota þegar texti er stimplaður á myndir +\n%s + Gera sjálfvirka aðlögun halla óvirka + Birta \"Stimpla mynd\" tákn + Sjálfvirkt leifturljós af skjá + Leifturljós af skjá virkt + Leggðu yfir aðra mynd, til aðstoðar við hliðrun. +\n%s + Læsa stefnu ljósmynda/myndskeiða + Myndavélarstýringar + Myndsviðshamur + Beita myndsviðsham + Bestaðu myndina miðað við ólík myndsvið (senur) + Stilltu hvítvægi + Stilltu jöfnun á lýsingu + Geyma staðsetningargögn + Geyma stefnu áttavita + Krefjast staðsetningargagna + Setja allar stillingar myndavélar á sjálfgefin gildi + Ertu viss um að þú viljir endursetja allar stillingar myndavélar á sjálfgefin gildi\? + Leifturljóshamur + Skipta yfir á frammyndavél + Skipta yfir á bakmyndavél + Skipta yfir í myndskeiðsham + Skipta yfir í ljósmyndaham + Eyða síðustu mynd + Deila mynd + Get ekki vistað í þessa möppu + Heimild fyrir staðsetningar er ekki tiltæk + Mislýs {} + Mislýst myndaröð + Tek upp… + Leyfa RAW í mislýstum myndaröðum + Mislýst myndaröð stöðvast + Hve mörg ljósop á að draga frá eða bæta við dekkstu/ljósustu mynd +\n%s + Ekki vista upprunalegar myndir + Vista staka upprunalega mynd + Vista allar upprunalegar myndir (hægvirkt) + Ekki nægilegt pláss til að taka upp myndskeið + Athugun á hættulega lágri hleðslu + Alvarleg villa í myndavél + Ekkert myndasafnsforrit er tiltækt + Heimild fyrir hljóðnema er ekki tiltæk + Hefja upptöku myndskeiðs + Stöðva upptöku myndskeiðs + Hröð runa + Vista allar myndir fyrir HDR-ham + HEIMILD EKKI TILTÆK + Mislýst myndaröð + Fjöldi mynda í mislýstum myndaröðum +\n%s + Sýna aðdráttarsleða + Birta sleða til að stýra aðdrætti + Birta stefnu áttavita + Birta núverandi tíma á skjánum + Nota bakgrunnsþráð + Þvinga 4K UHD myndmerki (virkar bara á sumum tækjum) + Virkja stafræna stöðugleikajöfnun myndmerkis + Rammatíðni myndmerkis (áætlaður) + Hámarks tímalengd myndskeiðs + Hámarks skráarstærð myndskeiðs + Endurræsa eftir að hámarksstærð er náð + Blikka á meðan upptöku myndskeiðs stendur + Endurræsa myndskeið eftir að hámarkslengd er náð + Camera API + Upprunalegt Camera API + Ógegnsæi draugamyndar + Forgrunnslitur litranda + Bakgrunnslitur litranda + Tákn fyrir margar myndavélar + Birta fyrirliggjandi aðdráttarstig á skjánum (þegar rennt er að) + Geyma stefnu áttavita í myndum (einungis JPEG-snið) + Hefja hlustun eftir hljóði + Hætta hlustun eftir hljóði + Gerðu hávaða + Sjálfvirk aðlögun halla mun snúa myndum svo þær virðist alveg láréttar. +\n +\nAthugaðu að þetta þýðir að myndirnar munu koma út með örlítið minni upplausn (vegna snúnings og utanskurðar sem þetta útheimtir). + Kvarða horn halla + Settu tækið þitt á flatann láréttan flöt svo það sé lárétt (annað hvort á langveg eða þverveginn), og veldu síðan Kvarða. +\n +\nÝttu á Frumstilla til að fjarlægja kvörðun úr tækinu þínu. +\n +\nÝttu á Til baka hnappinn til að hætta við. + Hvort birta skuli hljóðstyrk á skjá við upptöku myndskeiðs + Birta tákn fyrir að geyma staðsetningargögn + Forskoðun myndavélar… + Fletta í gegnum leifturljós + Birta tákn fyrir leifturljós + Fyrirliggjandi fjarstýring: + Mistókst að búa til víðmynd + Upprunalegar myndir víðmyndar + Ekki vista upprunalegar myndir + Leitarstika til að aðlaga jöfnun lýsingar + Vista upprunalegar myndir ásamt XML-aflúsun + Camera2 API + Veldu fjartengt tæki + Óþekkt tæki (heimild fyrir bluetooth-tengingar er ekki til staðar) + Myndavél/Camera er © 2013–2023 Mark Harman, gefið út með GPL útg.3 eða síðari. Ýttu hér til að sjá allan texta notkunarleyfisins. + Myndavél/Camera notar táknmyndir úr Material-hönnun Google (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , https://google.github.io/material-design-icons/) samkvæmt Apache notkunarleyfi útgáfu 2.0. Sumum táknmyndum hefur verið breytt. Ýttu hér til að sjá allan texta notkunarleyfisins. + Hægtaka virk + Hægtaka óvirk + Hvort eigi að sýna táknmynd á skjánum þar sem hægt er að virkja eða gera greiningu andlita óvirka + Hvort eigi að sýna táknmynd á skjánum þar sem hægt er að virkja eða gera stimplun mynda óvirka + Hvort eigi að sýna táknmynd á skjánum þar sem hægt er að tilgreina sérsniðinn texta til að stimpla á myndina + Hvort eigi að sýna táknmynd á skjánum þar sem hægt er að læsa eða aflæsa sjálfvirku hvítvægi + Hvort eigi að sýna táknmynd á skjánum þar sem hægt er að læsa eða aflæsa lýsingu + Hvort eigi að sýna táknmynd á skjánum þar sem hægt er að virkja eða gera staðsetningargögn óvirk (geotagging) + Hvort eigi að sýna táknmynd á skjánum þar sem hægt er að fletta í gegnum RAW-hami + Veldu skráasniðið sem notað verður til að vista myndir. Þetta hefur áhrif á \"venjulegar\" (ekki RAW) ljósmyndir. Einungis JPEG styður að vista með EXIF-lýsigögn. Athugaðu að PNG-snið er ekki fullkomlega taplaust, heldur er því umbreytt úr JPEG með 100%% myndgæðum. +\n%s + Hvort eigi að leyfa aðgerðir þar sem ýtt er lengi (t.d. ýta lengi á myndasafn til að breyta staðsetningu vistunar). + Hægtaka (slow-motion) + Geyma snúning, dýfu og veltu + Geyma snúning, dýfu og veltu (yaw, pitch, roll) í athugasemdum EXIF-lýsigagna mynda á tækinu (einungis JPEG-snið) + Leitarstika til að breyta kjörstillingu + Útrýming ráka + Leyfa ljósmyndir á meðan upptöku myndskeiðs stendur + Litasnið myndskeiða + Birta \'Nýtt á döfinni\' glugga + Reiknirit fyrir brúnir + Vinnslustillingar… + Hærra gildi þýðir meiri ljósnæmni (virkar mögulega ekki á sumum tækjum) + Settu á 0 fyrir sjálfgefna jöfnun á lýsingu + Veldu stillingu til að aðlaga hvítvægi (white balance) + Taktu ljósmynd eða myndskeið einfaldlega með því að snerta eða tvíbanka á forskoðunina + Setja skjáinn í bið eftir að mynd er tekin, með valkostum um að deila eða eyða myndinni + Valkostur varðandi næmi á styrk truflana í hljóði (hávaða) + Valkostur um að snúa forskoðuninni (hefur ekki áhrif á teknar myndir/myndskeið) +\n%s + Birta á skjánum plássið sem eftir er í geymslurými tækis + Birta núverandi stefnuhorn tækis á skjánum + Litur á áherslulitun horns/hæðar + Birta stefnu áttavitans í tækinu á skjánum + Hætt við aðgengi geymslukerfis + Krafist er heimilda til að nota myndavél svo hún virki + Heimild til aðgangs að gagnageymslu er nauðsynleg til að vista skrár sem verða til, eins og ljósmyndir eða myndskeið + Heimild þarf fyrir aðgang að hljóðnema til að taka upp myndskeið með hljóði, og eins ef nota á valkosti hljóðstýringar + Virkja hraðar runur við HDR/mislýsingu + Sýna línur fyrir dýfu + Birta lárétta dýfulínur + Birta stefnulínur áttavita + Birta stefnulínur í áttavita + Mistókst að setja af stað hlustun eftir hljóði + Heimildir þarf fyrir skönnun/tengingu á Bluetooth til að finna og tengja Bluetooth LE (BLE) fjarstýringartæki. + Sé þetta valið, verða litrendur teiknaðar á skjáinn sem sýna á forskoðuninni hvar myndin verði yfirlýst. +\n%s + Veldu Camera2 API til að virkja aukaeiginleika á borð við handvirka hami á lýsingu, skerpu, hvítvægi, auk RAW-mynda (ef tækið styður slíkt). Breyting á API-kerfisviðmóti hefur endurræsingu í för með sér. +\n%s + Litrófsgildi til notkunar fyrir myndskeið ef myndmerkissnið er stillt á Litróf +\n%s + Einungis dimma stjórnhnappa á skjá + Fela sýndarstjórnhnappa á skjá + Alfa-gegnsæisgildi fyrir draugamyndir. Lægra gildi þýðir meira gegnsæi, hærra þýðir meira ógegnsæi. +\n%s + Litur sem á að nota í forgrunnsrendur þegar litrendur eru birtar. +\n%s + Litur sem á að nota í bakgrunnsrendur þegar litrendur eru birtar. +\n%s + Birta auðkennisnúmer núverandi myndavélar á skjánum + Umlykjandi hamur (immersive) + Í víðmyndarham, hvort eigi að fjarlægja bylgjóttu jaðrana +\n%s + Taka ljósmynd/myndskeið þegar hávaði greinist. Þegar þetta er virkt, skaltu nota hljóðnematáknið á skjánum til að byrja/hætta hlustun. +\n%s + Auka eða minnka jöfnun lýsingar + Niðurtalning með rödd + Taka upp hljóð með upptöku myndskeiðs + Upprunalegar myndir truflanasíu + Vistar allar stillingar myndavélar í skrá + Heiti á vistuðum stillingum + Skráasnið og kóðunarlyklar mynda og hljóðs +\n%s + Stillingastjórnun + Birta tákn fyrir læsingu á hvítvægi + Birta tákn fyrir sjálfvirka lýsingu + Ábending: Settu sjálfgefin birtuskil á lágmarksgildi áður en myndavélarforritið er gangsett.. + Spegla frammyndavél + Birta jaðar á skjánum sem gefur til kynna hvenær mynd er tekin + Upptaka myndskeiðs mun hætta eftir tiltekinn tíma +\n%s + Tiltaktu einóma eða víðóma upptöku á hljóði (víðómur er aðeins studdur á sumum tækjum) + Virkjar aukaeiginleika á borð við handvirka hami á lýsingu, skerpu, hvítvægi, auk RAW-mynda (ef tækið styður slíkt), en er ekki víst að virki á öllum tækjum (hefur endurræsingu í för með sér) + Nota aðra aðferð fyrir leifturljós + Virkjaðu þetta ef leifturljós tækisins þín hegðar sér skringilega þegar notað er Camera2 API + Hvort eigi að spegla tekinni mynd þegar frammyndavélin er notuð +\n%s + Log (Lítið) + Log (Miðlungs) + Settu staðlað eða flatt litasnið fyrir myndskeiðsham +\n%s + Log (Fínt) + Log (Sterkt) + Log (Mjög sterkt) + Log-snið + Reiknirit sem hjálpa við að útrýma ljósflökti. +\n%s + Leyfir töku ljósmynda á meðan upptöku myndskeiðs stendur. Gerðu þetta óvirkt ef upp koma vandamál við upptöku myndskeiða þegar Camera2 API-kerfisviðmótið er virkt á tækinu. + Myndum verður snúið þannig að þær séu sjálfkrafa láréttar (aðeins ljósmyndir - myndataka verður hægvirkari og gæti misheppnast á tækjum með of lítið minni) + Ef þetta er virkt, mun skjárinn ekki slökkva á sér á meðan aðalviðmót myndavélarinnar er í gangi + Hvort eigi að birta tímabundin skilaboð með upplýsingum á skjánum + Birta hreyfandi smámynd þegar mynd er tekin + Upplýsingar um forrit og villuboð + Hvort vista eigi myndir í bakgrunnsþræði (til að hraða aðgerðum) + Ef þetta er stillt, verður halli tækisins hunsaður og stefna myndar/myndskeiðs mun miðast við tilgreinda stefnu +\n%s + Gefur hljóðmerki þegar niðurteljari telur niður eða við töf við endurtekna myndatöku + Talaðu inn niðurtalningu eða töf við endurtekna myndatöku (frá 60 sekúndum) + Hvort nota eigi aðgengi geymslukerfis (Storage Access Framework) til að vista ljósmyndir og myndskeið. Þetta ætti að virkja svo hægt sé að vista á utanáliggjandi SD-minniskort. Á Android 10+ verður að virkja þetta til að geta vistað í möppur utan DCIM-möppunnar. + Ef þetta er virkt, mun myndavélarviðmótið sjóst ofan á hverskyns læsiskjám (þú getur eftir sem áður komist í Stillingar, Myndasafn, o.s.frv.) + Þvinga skjáinn á hámarks birtustig, fremur en það sem sjálfgefið er í tækinu + Geyma staðsetningargögn í ljósmyndum/myndskeiðum (ljósmyndir gerta aðeins geymt staðsetningargögn í JPEG og DNG-sniðum) + Ef staðsetningargögn eru virkjuð, þá aðeins taka mynd ef staðsetningargögn eru tiltæk + Hvort eigi að vista upprunalegar myndir þegar verið er í truflanasíuham. Athugaðu að þetta getur gert vistun mynda mun hægvirkari. +\n%s + Stöðvar upptöku myndskeiða ef mjög lítil hleðsla er á rafhlöðu. Þetta minnkar hættuna á að myndskeið skemmist ef tækið þitt slekkur skyndilega á sér þegar hleðsla er við það að klárast. + Hvort eigi að vista upprunalegar myndir þegar verið er í víðmyndaham. Athugaðu að þetta getur gert vistun víðmynda mun hægvirkari. Býður einnig upp á að vista XML-skrá sem getur nýst við að tilkynna vandamál varðandi víðmyndatökur. +\n%s + Þessi valkostur kvarðar hreyfiskynjara tækisins, svo að sjálfvirkur halli og halla/hornmælingar á skjá virki rétt + Endurheimtir áður vistaðar stillingar. Þetta skrifar yfir allar fyrirliggjandi stillingar með vistuðu stillingunum! + Hvort eigi að sýna táknmynd á skjánum þar sem hægt er að virkja eða gera sjálfvirkan halla/stefnu mynda óvirka. Þegar sjálfvirkur halli er virkur, verður myndum snúið þannig að þær séu sjálfkrafa láréttar. + Hljóðneminn sem á að nota við hljóðupptökur. Athugaðu að nákvæm hegðun valkostanna fer eftir því hvernig viðkomandi eiginleikar eru útfærðir á tækinu þínu. +\n%s + Ef þetta er virkt, mun vera kveikt/slökkt á leifturljósinu þegar tekið er upp myndskeið (er hægt að nota til að sjá í fjarlægð hvort myndavél sé enn að taka upp) + Ef þér líkar þetta forrit, ættirðu að íhuga að styrkja þróun þess. Þú getur gert það með því að kaupa gjafaforritið mitt - smelltu á þennan tengil til að opna síðuna fyrir gjafaforritið. Kærar þakkir! + Þegar verið er að taka upp myndskeið, verður viðmótinu læst til að koma í veg fyrir að upptakan stöðvist fyrir slysni. Strjúktu yfir skjáinn til að aflæsa. Athugaðu að upptaka myndskeiða stðvast alltaf ef forritið hverfur í bakgrunn eða ef skjárinn tæmist. + Stoðlínur fyrir utanskurð birtast sem fehyrningur sem sýnir hvernig tilgreind stærðarhlutföll líti út - nýtist vel ef ætlunin er að sníða til ljósmynd/myndskeið eftirá yfir í önnur stærðarhlutföll. Krefst þess að vera í WYSIWYG raunljósmyndunarham, eða vera í myndskeiðstökuham. +\n%s + DNG-skrár innihalda fullar óþjappaðar og óunnar myndupplýsingar beint frá myndavélinni. +\n +\nAthugaðu að sum myndasafnaforrit þekkja ekki DNG-skrár. DNG-myndir er hægt að vinna með í ýmsum sérhæfðum myndvinnsluforritum. +\n +\nAthugaðu að ýmsar vinnsluaðferðir á borð við stimplun á myndir og sjálfvirkur halli virka ekki á DNG-myndir, heldur á önnur myndsnið (JPEG/PNG/o.s.frv.). + Virkjar 3840x2160 upplausn fyrir upptöku myndskeiða í bakmyndavél - þessi kostur er redding sem gæti nýst 4K tækjum í 4K myndavélum sem ekki bjóða þennan valkost til utanaðkomandi myndavélaforrita. Það er ekkert víst að þetta virki, endilega prófa áður en farið er að nota þetta. + Stafræn stöðugleikajöfnun myndmerkis minnkar óvæntar hreyfingar og titring bæði í forskoðun og upptöku myndskeiða. Þetta gæti verið óþarft ef tækið þitt styður optíska stöðugleikajöfnun (OIS). + Stillir áætlaðan bitahraða myndskeiða (hærra gildi þýðir betri gæði, en tekur líka meira geymslupláss; getur einnig valdið því að upptaka mistakist ef tækið styður ekki viðkomandi bitahraða) +\n%s + Stillir áætlaða rammatíðni (FPS) myndskeiða (má vera nálgun, er ekki víst að náist, og getur einnig valdið því að upptaka mistakist ef tækið styður ekki viðkomandi rammatíðni). Skoðaðu í raunverulegum myndskeiðum hvaða endanlega rammatíðni er notuð. Athugaðu að þessi stilling hefur engin áhrif í hægmyndatöku. +\n%s + Hvort eigi sjálfkrafa að endurræsa þegar hámarksstærð skráa er náð (hvort sem er skilgreindri af tækinu eða notandanum) + Ef myndskeið hefur stöðvast eftir að hámarkslengd er náð (ef það er stillt), lætur þessi kostur upptökuna byrja aftur, eins oft og skilgreint er +\n%s + Útbýr skjátextaskrá (.SRT) sem geymir dagsetningu og tíma ásamt GPS-upplýsingar ef staðsetningar/stefnugögn eru virkjuð. (Á Android 11+ krefst þessi kostur þess að heimildir séu veittar fyrir \'Fleiri myndavélastýringar\' og \'Aðgengi geymslukerfis\'.) +\n%s + Hvort birta eigi upplýsingar um nýja eiginleika og betrumbætur eftir að forritið hefur verið uppfært + Reikniritið sem myndavélarrekillinn ætti að nota við að bæta brúnir í myndum. Bæting brúna eykur skerpu og fínleg atriði í teknum myndum. (Þessi stilling er hunsuð í truflanasíuham.) +\n%s + Reikniritið sem myndavélarrekillinn ætti að nota við að minnka truflanir og suð. Truflanasíu-útreikningurinn leitast við að bæta myndgæði með því að fjarlægja umframsuð sem verður til við myndatöku, sérstaklega þar sem birta er lítil. (Athugaðu að þetta er ekki það sem er kallað truflanasíuhamur og í rauninni er þessi stilling hunsuð í truflanasíuham.) +\n%s + Birtir táknmynd til að taka ljósmyndir og myndskeið. Afmerktu þetta ef þú vilt frekar taka myndir með öðrum aðferðum, eins og t.d. ef tækið þitt er með sérstakan myndatökuhnapp, eða ef þú vilt frekar nota hljóðstyrkshnappana. + Kvarða þarf áttavita tækisins til að bæta nákvæmni hans. Þetta er hægt að gera með því að hreyfa tækið í feril sem líkist tölunni 8. +\n +\nFyrirliggjandi nákvæmni: + Ef þetta er virkt í HDR-tökuham, verða mislýstu grunnmyndirnar þrjár vistaðar samhliða HDR-lokamyndinni. Athugaðu að þetta gerir vistun hægvirkari, sérstaklega ef einnig er verið að nota \"Stimpla myndir\" eða sjálfvirka aðlögun halla. + Gerir kleift að taka hraðari HDR/mislýstar ljósmyndarunur. Gerðu þetta óvirkt ef tækið þitt á í vandræðum með að taka myndir í HDR- eða mislýsingarham (Expo). + Þessi valkostur gerir þér kleift að velja eina af stillingaskránum sem þú hefur vistað. Hafðu í huga að sé slík skrá valin mun hún skrifa yfir allar fyrirliggjandi stillingar! + Fyrir vatnsheldar myndavélahýsingar, bætir nákvæmni ef rétt gerð vatns er valin. + Til að taka víðmynd (panorama), skaltu halda tækinu þínu í lóðréttri stöðu (portrait) og taka mynd til að hefja víðmyndatökuna. Snúðu tækinu síðan til hægri eða vinstri þannig að hvíti hringur miðjunnar færist yfir á bláa punktinn. Eftir hverja nýja mynd er tækinu snúið áfram þar til blái punkturinn birtist aftur. +\n +\nÝttu á hakmerkið til að vista víðmyndina eða á krossinn til að hætta við. +\n +\nAthugaðu að það getur tekið nokkurn tíma að vinna víðmyndir og vista þær. + Upptaka myndskeiðs mun stöðvast og/eða endurræsast (sjá valkost fyrir neðan) þegar (um það bil) hámarksskráarstærð er nað. Athugaðu að mörg Android-tæki eru með hámarksstærð fyrir myndskeið (oft í kringum 2GB eða 4GB), en þessi valkostur gerir kleift að stilla tiltekið gildi. Athugaðu að þennan valkost er ekki hægt að nota til að auka innbyggða hámarksstærð tækisins. +\n%s + HDR-hamur nýtist vel fyrir myndir með miklum mun á birtustigi. Það virkar þannig að teknar eru margar myndir með mismunandi lýsingu, síðan eru þær sameinaðar til að útbúa lokamyndina. +\n +\nAthugaðu að HDR hentar ekki fyrir viðfangsefni sem hreyfast hratt og getur að auki leitt til ónákvæmni í litum. +\n +\nMyndataka í HDR-ham verður hægvirkari. + Heimild þarf fyrir aðgang að staðsetningu til að hnattstaðsetja myndir (geyma staðsetningargögn í ljósmyndum og myndskeiðum, þar með talið í stimplum og skjátextaskrám). Heimild fyrir aðgang að staðsetningu er einnig nauðsynleg (a.m.k. á Android 11 og eldri) til að tengjast Bluetooth LE fjarstýringum. + DRO + Hvenær eigi að nota reiknirit fyrir bætingu birtuskila í HDR (Dynamic Range Optimizer - DRO). Þetta getur bætt myndir þegar þær eru teknar við aðstæður með mjög miklum breytileika í ljósmagni og gefur líka lokamyndinni meira HDR-útlit. +\n%s + Hvort birta eigi táknmynd á skjánum þar sem flett er í gegnum valkosti fyrir leifturljós, í stað þess að valkostirnir birtist í valmynd. Athugaðu að ljóskastari er ekki tiltækur ef þessi valkostur er valinn. + Hvort RAW-valkosturinn eigi einnig að gilda við tökur á mislýstum myndaröðum (eða í HDR-ham þegar \"Vista allar myndir fyrir HDR-ham\" er virkt). Ef þetta er óvirkt, verða einungis JPEG-myndir vistaðar í þessum tökuhömum. + Hvort RAW-valkosturinn eigi einnig að gilda við tökur á misskerptum myndaröðum. Ef þetta er óvirkt, verða einungis JPEG-myndir vistaðar í þessum tökuham. + Snertu til að skerpa og ýttu á hvíta hnappinn til að taka myndir. +\n +\nTil að gera hámarksbirtustig skjás óvirkt, skaltu skoða Stillingar/Viðmót á skjánum/\"Þvinga hámarks birtustig\". Til að vista á SD-minniskort á Android 5+, skaltu skoða Stillingar/Fleiri myndavélarstýringar/\"Aðgengi geymslukerfis\". Til að sjá ítarlegri leiðbeiningar skaltu smella á \"Hjálp á netinu\" í stillingunum. + Ef þetta er virkt, skal nota aðskilda hnappa til að skipta á milli bak-/frammyndavéla og til að skipta á milli margra bak-/frammyndavéla. Ef þetta er óvirkt, mun táknið til að skipta milli myndavéla fletta í gegnum allar tiltækar myndavélar. + Ef slíkt er mögulegt, verður náð í heimilisfang eða staðarheiti út frá GPS-hnitum (fyrir myndastimpil eða skjátexta myndskeiðs). Athugaðu að ef þetta er virkt krefst það þess að staðsetning þín sé send um internetið yfir til utanaðkomandi aðila til að umbreyta GPS-hnitum yfir í staðarheiti/heimilisfang. Skoðaðu https://developer.android.com/reference/android/location/Geocoder . Þessi eiginleiki tryggir á engan hátt að slík gögn séu tiltæk eða nákvæm. Niðurstöðurnar eru bara bestu tiltækar ágiskanir, án ábyrgðar á því hvort þær séu marktækar. +\n%s + Virkja bráðabirgðaviðgerð á töku HDR/mislýsinga + Prófaðu að virkja þetta ef tækið þitt á í erfiðleikum með að taka myndir í HDR- eða mislýsingarham (t.d. ef mislýstu myndirnar koma út með sömu lýsingu). Hefur enga þýðingu nema kosturinn \"Virkja hraðar runur við HDR/mislýsingu\" sé einnig virkur. + HDR-litatónavörpun + Veldisvöxtur + Sjálfgefið + Fjarlægja EXIF-gögn tækis + Fjarlægja EXIF-gögn tækis + Fjarlægja nema dagsetningu/tíma + Ekki fjarlægja EXIF-gögn tækis + Reiknirit fyrir litatónavörpun í HDR-ljósmyndaham +\n%s + Einföld afmörkun (clamp) + Hvort eigi að fjarlægja EXIF-lýsigögn tækis úr JPEG-myndum. Þetta mun ekki fjarlægja EXIF-merki sem koma frá öðrum þeim stillingum sem nota EXIF-lýsigögn (t.d. staðsetning/hnit). Þær stillingar virka sjálfstætt og mynu taka yfir þessa stillingu. Hefur ekki áhrif á RAW/DNG og myndskeið. +\n%s + Haltu myndavélinni stöðugri til að taka betri myndir. + Bæta við tengilið + QR-kóði + Bæta við tengilið + Bæta atburði við dagatal + Bæta þessum atburði við dagatalið + Opna þessa staðsetningu + Opna þessa staðsetningu + Senda nýjan tölvupóst + Skrifa nýjan tölvupóst á tilgreind póstföng + Fletta upp þessu ISBN + Leita að þessu ISBN á isbnsearch.org + Fletta upp vöru + Leita að strikamerki þessarar vöru + Senda nýtt SMS + Senda nýtt SMS á tilgreinda viðtakendur + Hringja í símanúmer + Hringja í símanúmerið + Fletta upp VIN + Fletta upp auðkennisnúmeri þessa farartækis (Vehicle Identification Number - VIN) + Tengjast við þetta Wi-Fi netkerfi + Bæta þessu Wi-Fi netkerfi á listann yfir þekkt netkerfi og tengja tækið við það + Táknmynd + Deila + Afrita á klippispjald + Ekkert forrit fannst sem getur meðhöndlað þessa aðgerð + Texti + Stilla þetta tæki + Wi-Fi Easy Connect™ (DPP) + Meðhöndla þennan FIDO QR-kóða + Nota aðgangslykil + Deila með + FRIÐHELGISROFINN ÞINN VERÐUR AÐ VERA VIRKUR + ÞAR SEM MYNDAVÉLIN ER EKKI TILTÆK ;-) + BÍDDU Í 5 SEKÚNDUR EFTIR AÐ MYNDAVÉLIN + HLAÐIST ÞAR SEM VERIÐ VAR AÐ VIRKJA HANA + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 71a2740df..31e17718f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,28 +1,29 @@ - - Camera + Fotocamera Impostazioni Impostazioni Popup OK (Non mostrare più) - - Acceso - Spento - + Acceso + + Spento + Scegli la posizione di salvataggio: Pulisci la cronologia delle cartelle Pulire la cronologia delle cartelle? Scegli un\'altra cartella Posizione cambiata in: Registrazione video interrotta - riavvii restanti + riavvii restanti + Fallita la riconnessione alla fotocamera Errore, il video potrebbe essere danneggiato - non supportato sul tuo dispositivo + non supportato sul tuo dispositivo + Errore sconosciuto, video interrotto Server non raggiungibile, video interrotto Il video ha raggiunto la durata massima - Il video ha raggiunto la dimensione massima + Il file video ha raggiunto la dimensione massima Compensazione dell\'esposizione FPS Distanza focus @@ -47,31 +48,30 @@ Scatto della foto Lo scatto della foto è fallito Posizione GPS non disponibile - Foto cancellata - Nessuna app galleria disponibile + Foto eliminata + App galleria non disponibile Lo schermo è bloccato\nTrascina il dito sullo schermo per sbloccare Sbloccato - Spiacente, ma l\'auto-stabilizzazione non è supportata su questo dispositivo + Spiacente, auto-stabilizzazione non supportata +\nsu questo dispositivo Audio disabilitato Durata massima Effetto Colore Modalità di scena Bilanciamento bianco - Angolo Direzione - ERRORE NELL\'APRIRE LA FOTOCAMERA. - LA FOTOCAMERA POTREBBE GIÀ ESSERE IN USO + ERRORE APERTURA FOTOCAMERA. + LA FOTOCAMERA POTREBBE ESSERE GIA\' IN USO DA UN\'ALTRA APPLICAZIONE? ISO Zoom Libera [BLOCCATO: Trascina per sbloccare] - - Salvataggio timbro sulla foto fallito - m - + Non riesco a scrivere le informazioni sulla foto + m + Effetti fotocamera Auto-stabilizzazione Le immagini saranno ruotate in modo da raddrizzarle automaticamente (solo per le foto) (è più lento per fare foto e può fallire su dispositivi con poca memoria) @@ -89,7 +89,6 @@ Se impostato, l\'orientamento del dispositivo sarà ignorato e l\'orientamento di foto e video sarà quello impostato\n%s Riconoscimento volti Usa il riconoscimento volti invece dell\'area di messa a fuoco - Controlli fotocamera Timer Suono timer @@ -100,7 +99,7 @@ Intervallo foto a raffica Più controlli fotocamera… Tocca per acquisire - Scatta le foto semplicemente toccando l\'anteprima oppure toccando due volte + Scatta una foto o registra un video toccando l\'anteprima oppure toccando due volte Pausa dopo aver scattato la foto Mette in pausa lo schermo dopo aver scattato la foto, permettendo inoltre di condividere o cancellare la foto Suono otturatore @@ -112,7 +111,7 @@ Opzione per sensibilità del livello di rumore per il controllo audio (forte rumore) Posizione di salvataggio Cartella in cui salvare foto e video - Utilizza Storage Access Framework per il salvataggio di foto e video + Se utilizzare Storage Access Framework per il salvataggio di foto e video. Da abilitare per consentire di salvare su memorie SD esterne. A partire da Android 10, deve essere abilitato per consentire di salvare su cartelle diverse da DCIM. Salva prefisso per foto Prefisso da usare per il nome file di salvataggio delle foto Salva prefisso per video @@ -153,7 +152,8 @@ Mostra batteria Visualizza sul display il livello corrente di carica della batteria Mostra griglia - Griglia + Griglia + Mostra guida ritaglio La guida al ritaglio mostra sullo schermo un rettangolo che indica le proporzioni attuali - utile se in un secondo momento si ha intenzione di ritagliare la foto o il video ad un certo rapporto di proporzioni. Richiede la modalità foto WYSIWYG, o di essere in modalità video\n%s Visualizza messaggi su schermo @@ -166,14 +166,14 @@ Se abilitato, il display non viene spento fintanto che l\'interfaccia principale di Camera è attiva Forza luminosità massima Imposta lo schermo al massimo della luminosità, invece di usare le impostazioni predefinite - Impostazioni Foto e Video Impostazioni Foto… Impostazioni Video… - Impostazioni posizione… + Impostazioni localizzazione… Risoluzione fotocamera Qualità immagine - Imposta la qualità dell\'immmagine per le foto da salvare (il valore consigliato è 90%%)\n%s + Imposta la qualità delle foto salvate in JPEG o WebP (il valore standard è 90%%). Non ha effetto sul formato PNG. +\n%s RAW Salva dati località (Geotagging) Salva le coordinate GPS nelle foto e nei video @@ -200,10 +200,10 @@ Forza video a 4K UHD (disponibile solo su alcuni dispositivi) Abilita la risoluzione 3840x2160 per i video dalla fotocamera posteriore - funziona solo se il tuo dispositivo è tecnicamente in grado di registrare in 4K. In ogni caso potrebbe non funzionare, provalo prima di usarlo sul campo. Abilita stabilizzazione video - La stabilizzazione video riduce i tremolii durante il movimento della videocamera sia per l\'anteprima che per i video registrati. Potrebbe non essere necessario se il tuo dispositivo dispone della funzione di stabilizzazione ottica dell\'immagine (OIS) + La stabilizzazione video riduce i tremolii durante il movimento della videocamera sia per l\'anteprima che per i video registrati. Potrebbe non essere necessario se il tuo dispositivo dispone della funzione di stabilizzazione ottica dell\'immagine (OIS). Video bitrate Imposta il bitrate approssimativo per i video (più alto significa migliore qualità, ma file più grandi; inoltre la registrazione del video potrebbe fallire se un certo bitrate non è supportato dal dispositivo)\n%s - Video frame rate (approx) + Frame rate Video(circa) Imposta il frame rate (FPS) per i video (può essere approssimativo e non è garantito raggiungerlo, inoltre la registrazione potrebbe fallire se il frame rate non è supportato). Controlla i video risultanti per capire quale frame rate è stata utilizzata. Nota che questa impostazione viene ignorata per i video in slow motion.\n%s Durata massima dei video La registrazione del video sarà interrotta ad una durata specifica\n%s @@ -218,10 +218,9 @@ Sorgente audio Il microfono da usare per la registrazione dell\'audio\n%s Canali audio - Specifica modalità mono o stereo per la registrazione audio (modalità stereo supportata solo su alcuni modelli)\n%s + Specifica modalità mono o stereo per la registrazione audio (modalità stereo supportata solo su alcuni modelli) Flash durante la registrazione video Se abilitato, il flash sarà acceso/spento quando si registra il video (può essere usato per capire a distanza se la telecamera sta ancora registrando) - Varie Aiuto online Apre il sito web di Camera nel browser @@ -234,11 +233,9 @@ Reset impostazioni Reimposta tutti i settaggi di Camera ai valori predefiniti Sei sicuro di voler reimpostare tutti i settaggi di Camera ai valori predefiniti? - Disponibile Non disponibile Copia negli appunti - Scatta foto Galleria Esposizione @@ -247,11 +244,10 @@ Modalità flash Passa a camera frontale Passa a camera posteriore - Passa alla modalità video - Passa alla modalità foto + Passa in modalità video + Passa in modalità foto Cancella ultima immagine Condividi foto - Cartella superiore Nuova cartella Non puoi scrivere in questa cartella @@ -259,108 +255,95 @@ Inserisci il nome della nuova cartella Creazione della cartella fallita Questa cartella esiste già - Seleziona posizione di salvataggio Storage Access Framework annullato - Impossibile salvare in questa cartella - + Non posso salvare in questa cartella Permesso utilizzo Microfono non disponibile - Permesso utilizzo Posizione non disponibile - - Inizio registrazione video - Fine registrazione video - + Permesso utilizzo localizzazione non disponibile + Avvia registrazione video + Ferma registrazione video Dimensione massima file - MB - GB - + MB + + GB + Inizio registrazione audio Termina registrazione audio - Comando vocale \"cheese\" + Comando vocale \"cheese\" + Emetti un forte rumore - Livello automatico ruota automaticamente le foto per raddrizzarle.\n\nCiò comporta che le immagini risulteranno di risoluzione leggermente più bassa (a causa della rotazione e del taglio che si sono resi necessari). I file DNG contengono le informazioni complete (non compresse e senza alcuna rielaborazione) della fotocamera.\n\nAlcune app di galleria non sono in grado di riconoscere tale formato, che invece va utilizzato con app specifiche.\n\nLe opzioni di elaborazione come \"Timbro foto\" e \"Livello automatico\" si applicano unicamente alle immagini JPEG e simili, non al formato DNG. La modalità HDR è utile per scatti con un\'ampia variabilità nella luminosità. Funziona scattando diverse foto ciascuna con esposizione differente, e assemblandole per creare l\'immagine finale.\n\nSi noti che tale modalità non è indicata per scene che includono movimenti veloci, e possono proporre una riproduzione dei colori meno accurata.\n\nGli scatti di foto in modalità HDR potrebbe risultare più lenta. - Non mostrare più - Modalità foto - Std + Std + Standard - HDR - Expo {} + HDR + + {} Esposizione + Bracketing (esposizione) Scatto rapido - NR + NR + Riduzione rumore Timbro Foto Salva tutte le immagini in modalità HDR Se abilitata, quando si usa la modalità HDR, le tre foto con esposizione base verranno salvate, così come il risultato finale dell\'elaborazione HDR. Ciò renderà l\'attività di salvataggio più lenta, specialmente se sono attive anche opzioni come \"Timbro foto\" o \"Livello automatico\". - PERMESSO NON DISPONIBILE Richiesto permesso Il permesso di utilizzo della fotocamera è necessario per abilitare la fotocamera - Per utilizzare il geotagging è richiesto il permesso di rilevamento della posizione (Android 11 or earlier: necessario anche per collegarsi a dispositivi di controllo Bluetooth LE) - + Per utilizzare il geotagging (conservare dati su foto e video compresi timbri e sottotitoli) è richiesto il permesso a geolocalizzarti. Lo stesso permesso (su Android 11 o precedenti) è richiesto per collegare telecomandi Bluetooth LE. Opzioni di debugging Opzioni di debugging Usa metodo flash alternativo Abilita questa opzione se il tuo dispositivo mostra un comportamento anomalo del flash con le API Camera2 - Bracketing (esposizione) Numero di immagini per la modalità bracketing (nota anche come esposizione variata a forcella)\n%s Termina bracketing Quanti fermi si vogliono aggiungere/sottrarre per ottenere l\'immagine più/meno luminosa\n%s - Riduzione rumore su immagini originali Determina se salvare le immagini originali in modalità riduzione del rumore. Potrebbe rallentare di molto il salvataggio delle foto.\n%s - Non salvare le immagini originali Salva una singola immagine originale Salva tutte le immagini originali (lento) - - s - + s + Spazio insufficiente per registrare video Video terminato\nIl livello della batteria è eccessivamente basso Segnala batteria scarica Interrompe la registrazione video se il livello della batteria è eccessivamente basso. Ciò aiuta a ridurre il rischio di avere un file video corrotto se il dispositivo dovesse spegnersi improvvisamente a causa della batteria scarica. - - Scuro - Luminoso + Scuro + + Luminoso + Velocità otturatore - Errore critico della fotocamera - Abilita raffica veloce HDR/expo Permette acquisizione di scatti HDR/expo più veloce. Da disabilitare se il dispositivo presenta problemi nell\'acquisizione di foto in modalità HDR o Expo. - Fotocamera Registra video Selfie - Specchio camera frontale Determina se riflettere a specchio le immagini usando la fotocamera frontale\n%s - Calibra livello angolo - Questa opzione calibra l\'accelerometro del dispositivo, in modo che sia il livello automatico che le opzioni livello/angolo su schermo funzionino correttamente. + Questa scelta calibra l\'accelerometro del dispositivo, in modo che sia il livellamento automatico che le opzioni livello/angolo su schermo funzionino correttamente Sistema il tuo dispositivo su un piano orizzontale in modo che sia perfettamente a livello (è indifferente se con orientamento verticale o orizzontale), e poi seleziona Calibra.\n\nPremi Reset se vuoi rimuovere la calibrazione dal dispotivo.\n\nPremi il bottone Indietro per annullare. Calibra Reset Livello calibrato Reset livello calibrazione - - DRO - + DRO + Mostra linee inclinazione (pitch) Visualizza le linee di inclinazione orizzontale Visualizza le linee direzione bussola Visualizza le linee di direzione della bussola Sottotitoli video Crea un file con i sottotitoli (.SRT) contenente data e ora; ed anche le informazioni GPS se i dati di posizione/direzione sono abilitati\n%s - Illimitata 3 secondi 5 secondi @@ -385,36 +368,30 @@ 30 minuti 45 minuti 1 ora - Mostra icona Scatta Foto Mostra le icone Scatta Foto e Registra Video. Deseleziona se preferisci usare un altro metodo per scattare foto (ad es. se il tuo dispositivo ha un bottone specifico, o se vuoi usare i tasti volume per farlo). - Pausa video Riprendi video Pausa registrazione video Ripresa registrazione video - Acquisizione… - - Fallita inizializzazione ascolto audio - Fallita creazione immagine HDR - - Auto + Non sono riuscito a inizializzare l\'ascolto audio + Non sono riuscito a creare l\'immagine HDR + Automatico Nuvoloso Luce diurna Fluorescente - Incandescente + Incandescenza Ombra Crepuscolo Caldo Manuale - Azione Codice a barre Spiaggia Lume di candela - Auto - Fuochi artificio + Automatico + Fuochi d\'artificio Paesaggio Notte Ritratto notturno @@ -425,7 +402,6 @@ Stabilizzatore Tramonto Teatro - Acqua Lavagna nera Mono @@ -435,10 +411,8 @@ Seppia Solarizza Lavagna bianca - Novità: Donazioni - volto volti @@ -447,29 +421,23 @@ in alto sullo schermo alla base dello allo schermo al centro - - Alta velocità - + Alta velocità + Default - Tag EXIF personalizzati Artista Testo da inserire nei metadati della foto per il tag \"artista\" (solo JPEG). (Lasciare vuoto per eliminarlo.) Copyright Testo da inserire nei metadati della foto per il tag \"copyright\" (solo JPEG). (Lasciare vuoto per eliminarlo.) - Elaborazione… - No Standard e DNG (RAW) Solo DNG (RAW) - Default - yyyy-mm-dd (ISO 8601) - dd/mm/yyyy - mm/dd/yyyy + aaaa-mm-gg (ISO 8601) + gg/mm/aaaa + mm/gg/aaaa Nessuno - Numero di foto 2 3 @@ -481,7 +449,6 @@ 12 15 20 - Numero di foto 2 3 @@ -500,12 +467,10 @@ 100 150 200 - Velocità Normale Slow motion abilitato Slow motion disabilitato - Flash spento Flash auto Flash acceso @@ -514,26 +479,21 @@ Flash schermo Auto Flash schermo On Torcia schermo - Anti-banding Algoritmi che evitano lo sfarfallio della luce.\n%s Auto 50Hz 60Hz Spento - Immagine fantasma Sovrappone un\'immagine, per facilitare l\'allineamento.\n%s Spento Ultimo scatto Immagine selezionata - Scelta file non disponibile su questo dispositivo, opzione non supportata Impossibile aprire questa immagine - Consenti foto durante registrazione video Permette lo scatto di foto durante la registrazione dei video. Da disabilitare in caso di problemi con la registrazione dei video quando l\'API Camera2 è attiva. - Profili immagini video Imposta un profilo immagine normale oppure piatto (poco contrasto, molte informazioni) per la modalità video\n%s Default @@ -543,14 +503,12 @@ Log (Forte) Log (Extra forte) Profilo log - Videocamera Microfono esterno (se presente) Sorgente audio di default Ottimizzata per chiamate vocali Ottimizzata per riconoscimento vocale Inalterata - Default 100kbps 200kbps @@ -577,43 +535,34 @@ 100Mbps 150Mbps 200Mbps - - no raffica - + no raffica + Mostra indicatore livello audio Determina se mostrare l\'indicatore del livello audio sullo schermo durante la registrazione video - - Focus {} + {} Focus + Focus bracketing - Distanza origine focus bracketing Distanza destinazione focus bracketing - Aggiungi distanza infinita - Direzione bussola La bussola del tuo dispositivo deve essere calibrata per migliorarne l\'accuratezza. Per farlo, muovi il tuo dispositivo seguendo una forma ad 8.\n\nAccuratezza attuale: - Non affidabile Bassa Media Alta Sconosciuta - Unità di distanza Usata per l\'altitudine GPS nella marcatura delle foto e nei sottotitoli dei video\n%s Metri Piedi - ft - + ft + Mostra le ultime novità Determina se visualizzare informazioni sulle ultime caratteristiche e migliorie quando l\'app viene aggiornata - Algoritmo modalità bordi Algoritmo da usare per migliorare i bordi. Questa funzione migliora la nitidezza e i dettagli delle foto scattate. (Impostazione ignorata quando la modalità riduzione del rumore delle foto è attiva.)\n%s - Impostazioni di elaborazione… - Algoritmo di riduzione rumore Algoritmo da usare per applicare la riduzione del rumore. Questa funzione tenta di migliorare la qualità delle foto rimuovendo il rumore eccessivo catturato durante lo scatto, specialmente in condizioni di oscurità. (Nota che non si tratta della modalità \"Riduzione rumore\" delle foto, infatti in quella modalità questa impostazione viene disattivata.)\n%s Default @@ -621,18 +570,16 @@ Minimo Veloce Alta qualità - Assistenza focus Determina se ingrandire (zoom) quando si regola la distanza manuale di messa a fuoco\n%s Spento 2x 4x - Aumenta o diminuisci compensazione esposizione - - Precedente - Successivo - + Precedente + + Successivo + Spento 2x 3x @@ -647,7 +594,6 @@ 200x 500x Illimitato - Nessun ritardo 0.5s 1s @@ -666,8 +612,7 @@ 30m 1h 2h - - Default dispositivo + Standard del dispositivo 100MB 200MB 300MB @@ -676,9 +621,7 @@ 2GB 5GB 9GB - Annullato focus bracketing - Nessuno 1 (1:1) 1.25 (5:4) @@ -691,7 +634,6 @@ 2.33 (21:9) 2.35 (47:20) 2.4 (12:5) - +3 (alta sensibilità) +2 +1 @@ -699,94 +641,81 @@ -1 -2 -3 (bassa sensibilità) - Migliora contrasto HDR Determina quando usare un algoritmo di contrasto per HDR. Può migliorare l\'aspetto nei casi in cui c\'è un intervallo dinamico molto elevato nella scena, e dà anche un \"aspetto HDR\" all\'immagine risultante.\n%s Spento Intelligente Sempre - Formato video Formati file e codec per video e audio\n%s - Default MPEG4 H264 MPEG4 HEVC 3GPP WebM (audio non supportato) - Gestione impostazioni - Salva impostazioni Salva tutte le impostazioni di Camera in un file Nome per le impostazioni salvate - Ripristina impostazioni Ripristina le impostazioni salvate in precedenza. Tutte le impostazioni correnti verranno sostituite con quelle salvate! Questa opzione permette di scegliere un file di impostazioni precedentemente salvato. Attenzione, scegliendo un file tutte le impostazioni correnti verranno sostituite con quelle salvate! - Impostazioni salvate Salvataggio impostazioni fallito Ripristino impostazioni fallito Scelta file non disponibile su questo dispositivo, opzione non supportata - Formato immagine JPEG WebP PNG - Modo NR Normale Luce bassa - Interfaccia utente mancini Interfaccia utente destrorsi Icone in alto - Mostra icona riconoscimento volti Determina se mostrare sullo schermo l\'icona del riconoscimento volti - Abilita riconoscimento volti - Disabilita riconoscimento volti + Abilita riconoscimento volti + + Disabilita riconoscimento volti + Riconoscimento volti abilitato Riconoscimento volti disabilitato - Mostra icona livello automatico Determina se mostrare sullo schermo l\'icona per abilitare o disabilitare il livello automatico. Quanto il livello automatico è abilitato, le foto vengono ruotate in modo da essere automaticamente a livello con l\'orizzonte. - Abilita livello automatico - Disabilita livello automatico - + Abilita livello automatico + + Disabilita livello automatico + Mostra icona timbro foto Determina se mostrare sullo schermo l\'icona per abilitare o disabilitare il timbro sulle foto - Abilita timbro foto - Disabilita timbro foto + Abilita timbro foto + + Disabilita timbro foto + Timbro foto abilitato Timbro foto disabilitato - Mostra icona timbro personalizzato Determina se mostrare sullo schermo l\'icona per specificare il testo personalizzato da timbrare sulle foto - Mostra icona blocco bilanciamento Determina se mostrare sullo schermo l\'icona per bloccare o sbloccare il bianciamento automatico del bianco Blocca bilanciamento bianco Sblocca bilanciamento bianco Bilanciamento bianco bloccato Bilanciamento bianco sbloccato - Mostra icona blocco esposizione Determina se mostrare sullo schermo l\'icona per bloccare o sbloccare l\'esposizione Sblocca esposizione - Modalità luce bassa: tenere ferma la fotocamera - - Pano + Pano + Panorama - Controllo remoto Bluetooth LE… Abilita controllo remoto Bluetooth LE Abilita dispositivi di controllo remoto Bluetooth LE (BLE) Tipo di dispositivo remoto - BLE non supportato Scansione dispositivi BLE Bluetooth non supportato. @@ -796,18 +725,15 @@ Usa Saltwater per il calcolo della profondità Per gli alloggiamenti subacquei, improva l\'accuratezza se viene selezionato il tipo corretto di acqua. Dispositivo remoto collegato - Usa indirizzi Mostra l\'indirizzo se possibile, oltre alle coordinate GPS Preferisci l\'indirizzo alle coordinate GPS Non mostrare l\'indirizzo - Mostra icona salva dati posizione Determina se mostrare sullo schermo l\'icona per abilitare o disabilitare i dati di posizione (geotagging) Salva dati posizione Smetti di salvare i dati posizione - Mostra un istogramma Determina se mostrare sullo schermo un istogramma dei colori\n%s Spento @@ -816,101 +742,87 @@ Valore (Massimo) Intensità (Medio) Luminosità (Media di min-max) - Mostra strisce zebra Se questa opzione è abilitata, le strisce zebra verranno mostrate sullo schermo mostrando dove l\'anteprima dell\'immagine è sovraesposta.\n%s Spento - 70% - 80% - 90% - 93% - 95% - 97% - 98% - 99% - 100% - + 70% + + 80% + + 90% + + 93% + + 95% + + 97% + + 98% + + 99% + + 100% + Focus peaking Se questa opzione è abilitata, verranno evidenziate le aree a fuoco (contorni). Serve principalmente per la messa a fuoco manuale, e può essere usato per aiutare a determinare quali zoni dell\'immagine sono a fuoco.\n%s Spento Acceso Colore del focus peaking Quale colore usare per evidenziare i bordi a fuoco\n%s - - Restanti - + Restanti + Anteprima fotocamera… - Commuta flash Mostra icona flash Determina se mostrare su schermo l\'icona per commutare tra le opzioni del flash, invece di mostrare le opzioni sul menù popup. Nota che la torcia non è utilizzabile quando questa icona è attiva. - Consenti RAW per expo bracketing Determina se l\'opzione RAW va anche applicata alla modalità expo bracketing per le foto (o alla modalità HDR quando \"Salva tutte le immagini in HDR\" è attivo). Se questa opzione è disattivata, solo i formati JPEG saranno salvati in questa modalità. - Consenti RAW per focus bracketing Determina se l\'opzione RAW va anche applicata alla modalità focus bracketing per le foto. Se questa opzione è disattivata, solo i formati JPEG saranno salvati in questa modalità. - Commuta modalità RAW Mostra icona RAW - Determina se mostrare su schermo l\'icona per commutare tra le modalità RAW. - + Se mostrare o no sullo schermo l\'icona per commutare tra le modalità RAW Dispositivo remoto attuale: Scansione - Testo ombreggiato Testo semplice Testo con sfondo ombreggiato - Salvataggio immagini… - Termina panorama Annulla panorama Panorama annullato Creazione immagine panorama fallita - Auto-ritaglia panorama In modalità panorama, determina se rimuovere i bordi storti\n%s - Per scattare un\'immagine panoramica, tieni il dispositivo in orientamento verticale e clicca per scattare una foto per avviare il panorama. Poi ruota il dispositivo a sinistra o a destra per spostare il cerchio bianco centrale sul punto blu. Dopo che ogni nuova immagine è stata catturata, continua a ruotare il dispositivo per coprire ogni nuovo punto blu che appare successivamente.\n\nClicca sul segno di spunta per salvare il panorama, o sull\'icona a croce per annullare.\n\Nota che le foto panoramiche possono richiedere tempo per essere elaborate e salvate. - Immagini originali panorama Determina se salvare le immagini originali in modalità panorama. Nota che questo rallenterà il salvataggio delle foto panorama. Consente anche di salvare un file XML che può essere utile per segnalare problemi con la modalità panorama.\n%s - Non salvare le immagini originali Salva le immagini originali Salva le immagini originali più il debug XML - - ID - + ID + Barra per cambiare la compensazione dell\'esposizione - Scegli il formato file da usare per salvare le foto. Questo verrà usato per la scelta \"standard\" (non RAW). Solo JPEG supporta il salvataggio dei metadati Exif. Nota che il formato PNG non è realmente lossless, ma viene convertito da una JPEG al 100%% di qualità.\n%s - API fotocamera Scegli l\'API Camera2 per abilitare funzioni extra come la modalità manuale per esposizione, messa a fuoco, bilanciamento del bianco, e RAW (se supportato dal dispositivo). Cambiare l\'API provocherà un riavvio.\n%s API originale della fotocamera API Camera2 - Scatta foto/video quando viene rilevato un rumore. Quando è abilitato, usa il pulsante del microfono sullo schermo per avviare/interrompere l\'ascolto. \n%s - Se possibile, ottieni indirizzi dalle posizioni GPS (per timbro foto e sottotitoli video). Se abilitata, ciò richiede che il tuo dispositivo trasmetta i dati di posizione attraverso Internet a terze parti per convertire le coordinate GPS in indirizzi. Vedi https://developer.android.com/reference/android/location/Geocoder . Ciò non fornisce garanzie sulla disponibilità o sull\'accuratezza. Non è garantito che i risultati siano significativi o corretti. \n%s - Tocca per mettere a fuoco e premi il pulsante blu della fotocamera per scattare foto. \n\nPer disabilitare la massima luminosità dello schermo, vedi Impostazioni/Interfaccia schermo/\"Forza la massima luminosità\". Per salvare su schede SD su Android 5+, vedi Impostazioni/Altri controlli fotocamera/\"Storage Access Framework\". Per ulteriore aiuto, clicca su \"Aiuto online\" da Impostazioni. - Scegli dispositivo remoto - REC709 sRGB Gamma @@ -926,63 +838,93 @@ 2.4 2.6 2.8 - Spento Riduci solo la luminosità dei bottoni di navigazione Nascondi i bottoni di navigazione Nascondi l\'interfaccia Nascondi tutto - Opacità immagine fantasma Il valore alfada usare per le immagini fantasma. Un valore più basso significa più trasparente, più alto significa più opaco.\n%s - Colore primo piano strisce zebra Colore da usare per le strisce zebra in primo piano quando sono attive.\n%s Colore sfondo strisce zebra Colore da usare per le strisce zebra sullo sfondo quando sono attive.\n%s - Nero Rosso Arancione Trasparente Bianco - Fotocamera esterna - Ultra-wide - + Grandanolo Passa alla fotocamera esterna Commuta fotocamera Commuta tra fotocamere multiple Icona fotocamere multiple Se abilitato, usa pulsanti separati per passare dalla fotocamera anteriore a quella posteriore e per passare dalla fotocamere multiple anteriori o posteriori. Se disabilitato, l\'icona \"Commuta fotocamera\" commuta ciclicamente tra le telecamere disponibili. - Mostra ID fotocamera Visualizza sullo schermo il numero ID della fotocamera attualmente in uso - - Allow long press actions - Whether to allow long press actions (e.g., long press on gallery to change save location). - + Permetti long press actions + Se permettere o meno le long press actions (ad esempio, premi a lungo su Galleria per modificare dove salvare le foto). Apertura - 4K UHD Bitrate Frame rate - Slow motion - + Rallentatore Salva imbardata, beccheggio e rollio Salva imbardata, beccheggio e rollio del dispositivo nei commenti utente dei metadati Exif delle foto (solo formato JPEG) - Barra per cambiare il valore attuale di preferenza - Nessuno Rumore forte - Comando vocale: \"cheese\" - - Versione build - La telecamera è biforcuta da OpenCamera - autore + Comando vocale: \"cheese\" + + Salta + Avanti + Indietro + Termini di servizio + Informazioni su Camera + Licenza Codice sorgente - licenza - Informazioni sulla fotocamera - Termini del servizio - + Autori + Camera è un fork di Camera + Versione build + Camera utilizza le icone Material Design di Google (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , https://google.github.io/material-design-icons/) sotto la licenza Apache versione 2.0. Alcune icone includono modifiche. Tocca qui per il testo completo della licenza. + Icone Material Design di Google + Camera è © 2013-2019 Mark Harman, rilasciata sotto licenza GPL v3 o successiva. Tocca qui per il testo completo della licenza. + Camera + Licenze Open Source + Estensione: Bellezza / Ritocco viso + X-Bty + Estensione: Bokeh + X-Bokeh + Estensione: Notte + X-Night + Estensione: HDR + Estenzione: Auto + X-HDR + X-Auto + Dispositivo sconosciuto (il consenso alla connessione bluetooth non è disponibile) + Il consenso alla scansione/connessione Bluetooth è necessario per rilevare e connettersi ai dispositivi di controllo remoto Bluetooth LE. + Abilita la cattura fittizia per correggere HDR/expo + Prova ad attivarlo se il dispositivo ha problemi quando si scattano foto in modalità HDR o Expo (quando le immagini expo escono con le stesse esposizioni). Rilevante solo se è attivata anche l\'opzione HDR/expo veloce di cui sotto. + E\' richiesto il consenso all\'utilizzo del Microfono per registrare video con audio, così come anche per usare le scelte di \"controllo Audio\" + E\' richiesto il permesso di leggere/scrivere file per salvare i risultati come foto o video + LENTI + Per foto migliori, tieni ferma la fotocamera. + Rimuovi eccetto data/ora + Se rimuovere o no i metadati EXIF propri del dispositivo usato dalle foto JPEG. Non verranno rimossi i tag exif applicati da altre impostazioni che scrivono metadati EXIF (es. posizione/geotagging). Tutte le altre scelte sono indipendenti e sovrascriveranno questa impostazione. Non funziona su RAW/DNG e video. +\n%s + Non rimuovere i dati EXIF del dispositivo + Rimuovi i dati EXIF del dispositivo + Rimuovi i dati EXIF del dispositivo + Esponenziale + Predefinito + Algoritmo da utilizzare per la mappatura dei toni nelle foto con modalità HDR +\n%s + Mappatura dei toni HDR + + IL TUO INTERRUTTORE DELLA PRIVACY DEVE ESSERE ATTIVATO + POICHÉ LA TELECAMERA NON È DISPONIBILE ;-) + + PER FAVORE ATTENDI 5 SECONDI PER LA TUA TELECAMERA + PER CARICARLA, POICHÉ È STATA APPENA ATTIVATA + \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 8f2175de5..41df686f5 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,24 +1,26 @@ - - Camera + Camera 設定 ポップアップ設定 了解しました (この内容を再度表示しない) - - オン - オフ + オン + + オフ + - 保存場所を選択する: - フォルダの履歴を消去する + 保存場所を選択してください: + フォルダーの履歴を消去 履歴を消去しますか? - その他のフォルダを選択する + 他のフォルダーを選択してください 変更後の保存場所: 録画を停止しました - 繰り返します + 繰り返します + カメラへの接続に失敗しました ビデオファイルが壊れている可能性があります - が無効です + が無効です + 不明なエラーです、ビデオを停止します サーバーが反応しません、ビデオを停止します 最大撮影時間に達しました @@ -57,7 +59,6 @@ カラーエフェクト シーンモード ホワイトバランス - 角度 方角 カメラが開けません。 @@ -68,9 +69,9 @@ 空き [固定: スワイプで解除] - スタンプの貼り付けに失敗しました - m + m + カメラエフェクト 傾き補正 @@ -89,19 +90,19 @@ 設定すると端末の向きよりも設定された向きを優先して保存します\n%s 顔認識 フォーカスエリアの代わりに顔認識を利用します - カメラ制御 タイマー タイマー音 タイマー撮影やインターバル撮影のカウントダウンで音を鳴らします 音声タイマー タイマー撮影やインターバル撮影のカウントダウンで(残り1分から)音声を流します - 連続撮影 + 連続撮影 + インターバル カメラ制御の詳細設定… - 画面タッチで撮影する - 画面をタッチまたはダブルタップして写真を撮影します - 撮影の後に一時停止する + 画面タッチで撮影 + 画面をタッチまたはダブルタップすると、写真を撮影、または動画を録画します + 撮影の後に一時停止 一時停止した画面上で写真の共有もしくは削除ができます シャッター音 撮影時に音を再生します @@ -111,76 +112,78 @@ 音声コントロール感度 音に対する感度の設定 保存場所 - 写真/ビデオを保存するフォルダを決めます - 写真やビデオを保存する際にStorage Accessフレームワークを使用するかどうかを選択します。外付けのSDカードに保存する場合はこの設定が必要となります。 + 写真または動画を保存するフォルダー + 写真やビデオを保存する際にStorage Accessフレームワークを使用するかどうかを選択。外付けのSDカードに保存する場合はこの設定を有効にすべきです。また、Android 10以上でDCIMの外側のフォルダーーに保存したい場合は、この設定を有効にする必要があります。 保存する写真の命名ルール - 保存する写真のファイル名の手前につける内容を設定します + 保存する写真のファイル名の先頭に付ける文字列 保存するビデオの命名ルール - 保存するビデオのファイル名の手前につける内容を設定します + 保存する動画のファイル名の先頭に付ける文字列 ファイル名に使用する時刻フォーマット - ロック画面上でもカメラを表示する - 有効にするとCameraがロック画面上でも表示されます(ギャラリーを既定のアプリにしているなど、ロックの解除が必要になる場合もあります) + ロック画面でカメラを表示 + 有効にするとCameraがロック画面上でも表示されます(なお、設定やギャラリーなどにアクセスするにはロックを解除する必要があります) 起動時にオートフォーカスを行う - Camera の起動時にオートフォーカスを行います。もし起動時にライトが点灯する問題が起こる場合は設定をオフにしてください。 - 録画中は画面を固定する - 録画が停止しないように画面を固定します。固定は画面をスワイプすると解除されます。アプリをバックグラウンドに移すか画面を消灯しても録画は停止します。 + Cameraの起動時にオートフォーカスを行うかどうかの設定。起動時にライトが点灯する問題が起こる場合は、設定をオフにしてください。 + 録画中に画面を固定 + 録画を誤って停止しないように画面を固定します。固定は画面をスワイプすると解除されます。アプリがバックグラウンドに移るか画面が消灯した場合でも録画は停止します。 プレビューを回転 プレビューを180度回転して表示します(写真/ビデオの保存には影響しません)\n%s 画面表示設定… プレビューサイズ ボタン配置 全画面表示モード - ズーム倍率を表示する + ズーム倍率を表示 画面上にズーム倍率を表示します(ズームインする場合) - ズームボタンを表示する + ズーム倍率のコントロールを表示 画面上にズーム制御の -/+ ボタンを表示します - ズーム制御のスライダーを表示する + ズーム制御のスライダーを表示 画面上にズーム制御のスライダーを表示します - ISOを表示する - 画面上にISO感度を表示します。自動発光モードの場合は発光するかどうかも表示します。 (Camera2 APIが必要です) - 空きメモリを表示する + ISOを表示 + 画面上にISO感度を表示します(Camera2 APIが必要です)。 + 空きメモリーを表示 画面上に空きメモリを表示します - 角度を表示する + 角度を表示 画面上に角度を表示します - 角度を線で表示する + 角度を線で表示 画面上に線を表示します 角度のハイライトカラー カメラがほぼ水平になった時のハイライトカラーを指定します - 方角を表示する + 方角を表示 画面上に方角を表示します - 時間を表示する + 時間を表示 画面上に現在の時間を表示します - 電池残量を表示する + 電池残量を表示 画面上に電池残量を表示します - グリッドを表示する - グリッド - クロップを表示する - 画面上に切り取り用の線を表示します - 異なる比率に加工する場合に便利です。使用にはWYSIWYGでの写真モード、もしくはビデオモードを必要とします。\n%s - トーストを表示する + グリッドを表示 + グリッド + + クロップ用ガイドを表示 + 画面上に切り取り用の線を表示します - 異なる比率に加工する場合に便利です。使用にはWYSIWYGでの写真モード、もしくはビデオモードが必要となります。 +\n%s + 画面上にメッセージを表示 画面上のメッセージをトースト形式で表示します - サムネイルをアニメにする + サムネイルを動画で表示 撮影時のサムネイルをアニメにして表示します - 写真撮影中に枠線を表示する + 写真撮影中に枠線を表示 写真の撮影中に枠線を表示します - 表示を維持する - 有効にすると使用している間は画面が消えなくなります - 明るさを常に最大にする + 画面の表示を維持 + 有効にすると、Cameraを使用している間は画面が消灯しなくなります + 明るさを常に最大に設定 画面の明るさを常に最大にします - 写真とビデオの設定… 写真の設定… ビデオの設定… 位置情報の設定… 写真の解像度 写真の品質 - JPEG形式とWebP形式の保存品質を設定します(初期値は90%%)。PNG形式には影響しません。\n%s + JPEG形式とWebP形式の保存品質を設定します(初期値は90%%)。PNG形式には影響しません。\n%s + RAW - 位置情報を使用する + 位置情報を使用 写真/ビデオにジオタグを埋め込みます(写真の場合、JPEGまたはDNGの場合のみ埋め込み可能) - 方角情報を使用する + 方角情報を使用 写真にコンパスを埋め込みます(JPEG形式のみ) - 位置情報を要求する - 有効にすると位置情報を取得可能な場合のみ写真/ビデオの撮影が動作します + 位置情報を要求 + 有効にすると、位置情報を取得可能な場合のみ写真または動画を撮影できます スタンプを貼り付ける 写真に日付と時刻を貼り付けます。GPSが有効であれば位置情報も埋め込みます。\n%s 日付の形式 @@ -200,7 +203,8 @@ 手ぶれ補正を有効にする ビデオ撮影時の手ぶれ補正を設定します ビデオのビットレート(目安) - ビデオのビットレートを設定します(設定を高くすると品質は良くなりますが、より多くの保存スペースが必要になります。サポートしていないレートを設定すると録画に失敗する事があります)\n%s + ビデオのビットレートを設定(設定を高くすると品質は良くなりますが、より多くの保存スペースが必要になります。サポートしていないレートを設定すると録画に失敗する事があります) +\n%s ビデオのフレームレート ビデオのフレームレート(FPS)を設定します(あくまで目安のため、保証はされません。サポートしていないレートを設定すると録画に失敗する事があります。)\n%s ビデオの最大撮影時間 @@ -216,10 +220,9 @@ オーディオソース 録音に使用するマイク\n%s オーディオチャンネル - モノラルもしくはステレオを指定します (ステレオはサポートしている端末でのみ有効です)\n%s + モノラルもしくはステレオを指定します (ステレオはサポートしている端末でのみ有効です) 録画中にライトを点滅する 有効にすると撮影中にライトが点滅します (撮影中である事を相手に伝えることができます) - その他の内容 オンラインヘルプ Camera のWEBサイトをブラウザで開きます @@ -229,129 +232,120 @@ 有効にするとCamera2 APIを使用します。この設定は試験的に提供しています (再起動が必要です) このアプリについて アプリとデバッグの情報を表示します - 設定をリセットする - Cameraの設定をすべてリセットします - 本当にすべての設定をリセットしますか? - + 設定をリセット + Cameraの設定を全てリセット + 本当に全ての設定をリセットしますか? 利用可能 利用不可 - クリップボードにコピーする - - 写真を撮影する + クリップボードにコピー + 写真を撮影 ギャラリーを開く - 露出を設定する - 露出を固定する + 露出を設定 + 露出を固定 フォーカス切替 フラッシュ切替 フロントカメラ切替 リアカメラ切替 ビデオモードに切り替える 写真モードに切り替える - さっきの写真を削除する - この写真を共有する - - 親フォルダ - 新規フォルダを作る - このフォルダは使えません - フォルダにアクセスできません - 新規フォルダ名 - フォルダが作れません - 存在しているフォルダです - - 保存先を選択する + 直近の写真を削除 + 写真を共有 + 親フォルダー + 新規フォルダー + このフォルダーは使えません + フォルダーにアクセスできません + 新規フォルダー名 + フォルダーが作れません + フォルダーは既に存在しています + 保存先を選択してください ストレージへのアクセスがキャンセルされました - このフォルダには保存できません - + このフォルダーには保存できません マイクの使用が許可されていません 位置情報の使用が許可されていません - - ビデオ撮影を開始する - ビデオ撮影を停止する - - MB - GB - - 音声コントロールのリスニングを開始する - 音声コントロールのリスニングを停止する - \"チーズ\"と言ってください + 動画撮影を開始 + 動画撮影を停止 + MB + + GB + + + 音声コントロールのリスニングを開始 + 音声コントロールのリスニングを停止 + \"チーズ\"と言ってください + 何か大きな音を立ててください - 傾き補正は写真が水平になるよう自動的に角度を調整します。\n\n注意:これには回転と切り抜きの処理が必要になるため、解像度と画角(写る範囲)が小さくなります。 HDR(ハイダイナミックレンジ)は被写体の輝度差が大きな場面で役立ちます。異なる露出で複数の撮影を行い、それらを合成して画像を生成します。\n\n注意:HDRは動きの速い場面には適さないため、色が正しく表現されない可能性があります。\n\nHDRモードは通常の撮影と比べて時間がかかります。 - 再度表示しない - 撮影モード - 標準 + 標準 + 標準 - HDR - 露出BKT + HDR + + 露出BKT + 露出ブラケット ハイスピード連写 - NR + NR + ノイズリダクション撮影 スタンプ - HDR撮影時すべての写真を保存する + 全ての写真をHDRモードで保存 これを有効にするとHDR撮影時に3つの異なる露出の写真がHDR写真と共に保存されます。注意:スタンプや傾き補正のようなオプションを使用している場合は保存が遅くなります。 - カメラの権限がありません 権限が必要です カメラを有効にするにはカメラの権限が必要です 音声付き動画の撮影と音声コントロールを使用するにはマイクの権限が必要です ジオタギング(位置情報を写真やビデオに付加する)には位置情報の権限が必要です。 位置情報の権限はBluetooth LE リモートコントロールデバイスの接続にも必要です (Android 11 or earlier)。 - デバッグ用オプション デバッグ用オプション 代替のフラッシュ方式を使用 Camera2 API 使用中に端末のフラッシュの挙動が不安定な場合は有効にしてください。 - 露出ブラケット 露出ブラケットモードで撮影する枚数を指定します。\n%s 露出ブラケット幅 変化させる露出の幅を指定します\n%s - ノイズリダクション 元画像保存 ノイズリダクション撮影時、元の画像を保存します。注意:写真の保存には時間がかかります。\n%s - 元画像を保存しない - 単一の元画像を保存する - 全ての元画像を保存する(遅い) - - + 単一の元画像を保存 + 全ての元画像を保存(遅い) + + ビデオを記録するための充分な空きスペースがありません ビデオ撮影を停止しました\nバッテリー残量が非常に少なくなりました バッテリー残量チェック バッテリー残量が非常に少なくなった場合に録画を停止します。これにより、端末の電源が落ちてファイルが破損するリスクを軽減します。 - 高速なHDR/露出BKT撮影 高速なHDR/露出ブラケット撮影を行います。 もしHDR/露出ブラケット撮影で問題が起こる場合はこの設定を無効にしてください。 - ビデオ撮影 セルフィー - フロントカメラを反転 フロントカメラ撮影時に左右反転した画像を保存します。\n%s - 加速度センサーの校正 このオプションは端末の加速度センサーを校正します。これにより傾き補正と角度表示が正確に動作するようになります。 - 端末を縦向きまたは横向きに平らな場所へ置いて水平になった状態で校正を選択します。\n\n設定を初期値に戻すにはリセットを選択します。\n\nキャンセルするには戻るボタンを押します。 + 端末を縦向きまたは横向きに平らな場所へ置いて水平になった状態で校正を選択します。 +\n +\n設定を初期値に戻すにはリセットを選択してください。 +\n +\nキャンセルするには戻るボタンを押してください。 校正 リセット 加速度センサーを校正しました 加速度センサーを初期値に戻しました + DRO + - DRO - - 仰角/俯角を線で表示する + 仰角/俯角を線で表示 仰角/俯角を水平な線で表示します - 方角を線で表示する + 方角を線で表示 方角を線で表示します ビデオサブタイトル 日付情報と時刻情報、もしGPSが有効であればGPS情報も格納されたサブタイトル(.SRT)が作成されます。\n%s - 制限なし 3秒 5秒 @@ -376,15 +370,11 @@ 30分 45分 1時間 - - シャッターボタンを表示する - 撮影と録画のボタンを表示します。他の方法で撮影したい場合はチェックを外します(シャッター専用ボタンが付いている、音量ボタンを使用するなど) - - 撮影中… - + シャッターボタンを表示 + 撮影と録画のボタンを表示。他の方法(シャッター用ボタンが付いている場合、音量ボタンを使用するなど)で撮影したい場合はチェックを外してください。 + 撮影しています… リスニングの初期化に失敗しました HDR画像の作成に失敗しました - オート 曇り 太陽光 @@ -394,7 +384,6 @@ トワイライト 温白色 マニュアル - アクション バーコード 砂浜 @@ -410,7 +399,6 @@ スポーツ 夕焼け シアター - 水中 黒板 モノクロ @@ -420,10 +408,8 @@ セピア ソラリゼーション ホワイトボード - 新着情報: 寄付 - 人の顔 人の顔 @@ -432,23 +418,18 @@ が画面の上部にあります が画面の下部にあります が画面の中央にあります - デフォルト - - カスタムEXIFタグ + ユーザー定義のEXIFタグ アーティスト EXIFデータ内の\"Artist\"タグに記録されます。(JPEG形式のみ)(使用しない場合は空にします) 著作権表記 EXIFデータ内の\"Copyright\"タグに記録されます。(JPEG形式のみ)(使用しない場合は空にします) - 処理中…あと - デフォルト 年-月-日 日/月/年 月/日/年 なし - HS撮影枚数 2枚 3枚 @@ -460,7 +441,6 @@ 12枚 15枚 20枚 - BKT撮影枚数 2枚 3枚 @@ -479,10 +459,8 @@ 100枚 150枚 200枚 - タイムラプス なし - 発光禁止 自動発光 強制発光 @@ -491,26 +469,21 @@ 画面発光 自動 画面発光 オン 画面発光 常時 - フリッカー軽減 照明器具のフリッカー(ちらつき)を軽減します。\n%s 自動 50Hz(東日本) 60Hz(西日本) オフ - ゴーストを表示 撮影の位置合わせを容易にするために画像を重ねて表示します。\n%s 表示しない 最後に撮った写真を使用 選択された画像を使用 - この端末にはファイル選択ダイアログが無いため、ゴーストの表示には非対応です この画像は開けません - ビデオ撮影中の写真撮影 ビデオ撮影中の写真撮影を許可します。もし端末の Camera2 API の録画が不安定な場合はこの設定を無効にしてください。 - ビデオのフラットプロファイル(Log) ビデオのフラットプロファイル(Log)を有効にします\n%s オフ @@ -519,14 +492,12 @@ 最強 - ビデオカメラ 外部マイク(接続されている場合) デフォルトのオーディオソース 通話用に最適化 音声認識用に最適化 音声処理を行わない - デフォルト 100kbps 200kbps @@ -553,35 +524,29 @@ 100Mbps 150Mbps 200Mbps - - オーディオレベルを表示する + オーディオレベルを表示 動画撮影中にオーディオレベルを表示します - - フォーカスBKT + フォーカスBKT + フォーカスブラケット - フォーカスブラケット 手前側距離 フォーカスブラケット 奥側距離 - 無限遠を追加 - コンパスの向き 端末のコンパス精度を改善するためにキャリブレーションが必要です。これは端末を8の字に動かすことで実行できます。\n\n現在の精度: - 距離の単位 スタンプとビデオサブタイトルのGPS高度に使用されます。\n%s メートル フィート - ft - - お知らせを表示する - このアプリが更新された時に新機能や改良点のお知らせを表示する + ft + + お知らせを表示 + このアプリが更新された時に新機能や改良点のお知らせを表示 輪郭強調アルゴリズム - カメラが輪郭強調に使用するアルゴリズムを選択します。輪郭強調は写真の精細さを向上させます。(この設定はNR撮影時は無視されます)\n%s - + カメラが輪郭強調に使用するアルゴリズムを選択。輪郭強調は写真の精細さを向上させます。(この設定はNR撮影時は無視されます) +\n%s プロセッシング設定… - ノイズリダクションアルゴリズム カメラがノイズリダクションに使用するアルゴリズムを選択します。ノイズリダクションは特に暗い場所での撮影時に発生する多くのノイズを除去することで写真の品質を向上させます。(これはNR撮影モードとは独立しています。この設定はNR撮影モードでは無視されます。)\n%s デフォルト @@ -589,15 +554,15 @@ 最小限 高速 高品質 - フォーカス補助 マニュアルフォーカス操作中に画面を拡大表示します\n%s オフ 2倍 4倍 - - 前の値に変更 - 次の値に変更 + 前の値に変更 + + 次の値に変更 + なし 2枚 @@ -613,7 +578,6 @@ 200枚 500枚 無制限 - なし 0.5秒 1秒 @@ -632,7 +596,6 @@ 30分 1時間 2時間 - 端末のデフォルト 100MB 200MB @@ -642,7 +605,6 @@ 2GB 5GB 9GB - なし 1 (1:1) 1.25 (5:4) @@ -655,7 +617,6 @@ 2.33 (21:9) 2.35 (47:20) 2.4 (12:5) - +3 (高感度) +2 +1 @@ -663,113 +624,98 @@ -1 -2 -3 (低感度) - HDRコントラスト強調 HDR撮影時にコントラスト強調アルゴリズムを使用します。大きな輝度差があるようなシーンでの見た目を改善し、いわゆる「HDRルック」な写真が撮影されます。\n%s オフ スマート 常時 - ビデオの保存形式 ビデオとオーディオの形式\n%s - デフォルト MPEG4 H264 MPEG4 HEVC 3GPP WebM (オーディオには非対応) - 設定マネージャー - 設定を保存 Camera のすべての設定をファイルに保存します 保存する設定の名前 - 設定を復元 以前保存した設定を復元します。この操作を行うと現在の全ての設定が上書きされます! このオプションは以前保存した設定ファイルのうち1つを選択できます。復元するファイルを選択すると現在の設定は全て上書きされます! - 設定を保存しました 設定の保存に失敗しました 設定の復元に失敗しました - 写真の保存形式 JPEG WebP PNG - NRモード 標準 ローライト - 左利き用 右利き用 画面上部 (縦表示時) - - 顔認識アイコンを表示する + 顔認識アイコンを表示 顔認識のオンオフを切り替えるアイコンを表示します - 顔認識を有効にする - 顔認識を無効にする - 顔認識オン - 顔認識オフ - - 傾き補正アイコンを表示する - 傾き補正のオンオフを切り替えるアイコンを表示します。傾き補正を有効にすると写真は水平になるよう自動的に補正されます。 - 傾き補正オン - 傾き補正オフ - - スタンプアイコンを表示する + 顔認識を有効にする + + 顔認識を無効にする + + 顔認識が有効です + 顔認識が無効です + 傾き補正アイコンを表示 + 傾き補正のオンオフを切り替えるアイコンを表示。傾き補正を有効にすると写真は水平になるよう自動的に補正されます。 + 傾き補正オン + + 傾き補正オフ + + + スタンプアイコンを表示 スタンプのオンオフを切り替えるアイコンを表示します - スタンプを有効にする - スタンプを無効にする + スタンプを有効にする + + スタンプを無効にする + スタンプ オン スタンプ オフ - - カスタムテキストスタンプアイコンを表示する - カスタムテキストスタンプを入力するためのアイコンを表示します - - ホワイトバランス固定アイコンを表示する + ユーザー定義のテキストスタンプアイコンを表示 + ユーザー定義のテキストスタンプを入力するアイコンを表示するか否かについての設定 + ホワイトバランス固定アイコンを表示 ホワイトバランスを固定/固定解除するアイコンを表示します - ホワイトバランスを固定する - ホワイトバランスの固定を解除する + ホワイトバランスを固定 + ホワイトバランスの固定を解除 ホワイトバランスを固定しました ホワイトバランスの固定を解除しました - - 露出固定アイコンを表示する - 露出を固定/固定解除するアイコンを表示します - 露出の固定を解除する - + 露出固定アイコンを表示 + 露出を固定/固定解除するアイコンを表示 + 露出の固定を解除 ローライトモード: 端末をしっかりと押さえてください - - パノラマ + パノラマ + パノラマ - Bluetooth LE リモートコントロール… Bluetooth LE リモートコントロールを有効にする Bluetooth LE (BLE) リモートコントロールデバイスを有効にする リモートデバイスタイプ - BLE をサポートしていません。 BLE デバイススキャン Bluetooth をサポートしていません。 不明なデバイス 接続先から切断された場合は画面を暗くする ヒント: Camera の起動時にデフォルトの輝度を最小輝度に設定します。 - 深度計算のために海水を使用する + 深度計算のために海水を使用 水中ハウジングの場合、正しい水のタイプを選択すると精度が向上します。 接続されています - 住所の使用 - もし可能であればGPS座標だけでなく住所も表示する。 - 住所を優先して表示する(取得できない場合はGPS座標) + GPS座標に加えて、可能であれば住所も表示 + 住所を優先して表示(取得できない場合はGPS座標を使用) 住所を表示しない - - 位置情報記録アイコンを表示する + 位置情報記録アイコンを表示 位置情報記録のオンオフを切り替えるアイコンを表示します(ジオタギング) - 位置情報を記録する + 位置情報を記録 位置情報を記録しない - ヒストグラムを表示 色のヒストグラムを表示します。\n%s オフ @@ -778,14 +724,17 @@ Value(RGBのうち最大値) Intensity(RGBの平均) Lightness(RGBのうち最大値と最小値の平均) - ゼブラ模様を表示 このオプションを有効にすると、露出オーバーになっている部分に縞模様が表示されます。\n%s Off - 70% - 80% - 90% - 100% + 70% + + 80% + + 90% + + 100% + フォーカスピーキング このオプションを有効にするとピントの合った輪郭部分がハイライト表示されます。 これは主にマニュアルフォーカス時どこにピントが合っているのか判断するのに役立ちます。\n%s @@ -793,81 +742,68 @@ オン フォーカスピーキングの色 ピントの合った輪郭部分のハイライト色を設定します\n%s - - + + プレビュー画面設定… - フラッシュ切替 - フラッシュアイコンを表示する + フラッシュアイコンを表示 フラッシュの切り替えをするボタンをポップアップメニューの代わりに表示します - 現在の接続先: スキャン - 文字を縁取りする 普通の文字 + ビルドバージョン + CameraはCameraのフォークです + 作者 + ソースコード + 免許 + カメラ情報 + 利用規約 文字の背景を少し暗くする - - パノラマ撮影を終了する - パノラマ撮影をキャンセルする - + パノラマ撮影を終了 + パノラマ撮影をキャンセル パノラマ 自動切り抜き パノラマ撮影時、波打っている端の部分を切り落とします\n%s - - パノラマ撮影をする場合、端末を縦に構えて撮影ボタンを押します。そして白い円が青い点と重なるように端末を左または右に動かします。新しく撮影されるたび青い点と重なるよう端末を回転させ続けます。\n\n保存するにはチェックマーク、キャンセルするには×マークを押します。\n\n注意:パノラマ撮影は処理と保存に時間がかかります。 - + パノラマ撮影をする場合、端末を縦に構えて撮影ボタンを押してください。そして白い円が青い点と重なるように端末を左または右に動かし、新しく撮影されるたび青い点と重なるよう端末を回転させ続けてください。 +\n +\n保存するにはチェックマーク、キャンセルするには×マークを押してください。 +\n +\n注意:パノラマ撮影は処理と保存に時間がかかります。 パノラマ 元画像保存 パノラマ撮影時、元の画像を保存します。注意:パノラマ写真の保存には時間がかかります。問題を報告するのに役立つXMLファイルを保存することもできます。\n%s - 元画像を保存しない - 元画像を保存する - 元画像とデバッグ用XMLを保存する - - ID + 元画像を保存 + 元画像とデバッグ用XMLを保存 + ID + 露出補正値変更 - 写真を保存する形式を指定します。これはRAW以外の写真に適用されます。注意:ここで指定可能なPNG形式は品質設定100%%のJPEGから変換されたもので、本当の意味で可逆ではありません。\n%s - カメラ用API Camera2 API を使用すると、露出、フォーカス、ホワイトバランス、RAW(対応している場合)が利用可能になります。APIを変更するとアプリは再起動します。\n%s 従来のカメラ用API Camera2 API - 音に反応して撮影/録音します。 この機能をオンにした場合、画面上に表示されるマイクボタンを使用してリスニングをスタート/ストップします。 \n%s - もし可能であれば、GPS座標と一緒に住所もスタンプします。 注意:住所の使用が有効になっている場合、GPS座標から住所への変換をするため端末の位置情報を含むリクエストが第三者へ送信されます。 詳しくはこちら https://developer.android.com/reference/android/location/Geocoder この機能は、可用性または正確性を保証するものではありません。 結果は最良の推測であり、意味のあるものや正しいものであるとは限りません。 \n%s - - フォーカスするには画面をタッチ、そして写真を撮るには青いカメラボタンを押します。 - \n\n画面の輝度が最大になるのを無効にする場合は、[設定]->[画面表示設定]->[明るさを常に最大にする]をオフにします。 - Android5以降の端末でSDカードに保存するには、[設定]->[Storage Access Framework]を設定します。 - 詳しくは、[設定]->[オンラインヘルプ]をご覧ください。 - - + フォーカスするには画面をタッチして、写真を撮るには青いカメラボタンを押してください。 +\n +\n画面の輝度が最大になるのを無効にする場合は、[設定]->[画面表示設定]->[明るさを常に最大にする]をオフにしてください。 Android5以降の端末でSDカードに保存するには、[設定]->[Storage Access Framework]を設定してください。 詳しくは、[設定]->[オンラインヘルプ]をご覧ください。 リモートデバイスの選択 - オフ スクリーンボタンのみ隠す GUIを隠す すべてを隠す - なし 音に反応 - 音声コマンド: \"チーズ\" - - ビルドバージョン - カメラはOpenCameraから分岐します - 作者 - ソースコード - 免許 - カメラ情報 - 利用規約 - + 音声コマンド: \"チーズ\" + +ファイルの最大サイズ + \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 147f4e09e..c1ed9df5f 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -329,17 +329,17 @@ 왼손잡이 사용자 인터페이스 오른손잡이 사용자 인터페이스 - - 끄기 - 화면상의 가상 탐색 버튼만 숨기기 - GUI 숨기기 - 모두 숨기기 - + About 빌드 버전 - OpenCamera에서 카메라 포크 + Camera에서 카메라 포크 저자 소스 코드 라이센스 카메라 정보 서비스 약관 + + 끄기 + 화면상의 가상 탐색 버튼만 숨기기 + GUI 숨기기 + 모두 숨기기 diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 64383893a..b0322a932 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -1,178 +1,184 @@ - - Camera + Kamera + Innstillinger - Oppsprettsinnstillinger + Innstillinger for dialogboks OK (Denne meldingen vil ikke bli vist igjen) - - - Av - - Velg lagringsplasseringen + + + Av + + Velg lagringsplass: Slett mappehistorikken Vil du slette mappehistorikken? Velg en annen mappe - Endret lagreplasseringen til: - Avsluttet videoopptaket. - omspillinger igjen - Klarte ikke å koble til kameraet igjen. - En feil har oppstått. Videofilen din kan være korrumpert. - støttes ikke på enheten din. - Ukjent feil, videoen har stoppet. - Tjeneren har kollapset, videoen har stoppet. - Videoen har nådd maksvarigheten. - Videoen har nådd maksfilstørrelsen. + Endret lagringsplass til: + Avsluttet videoopptak + omspillinger igjen + + Klarte ikke å koble til kameraet igjen + Feil, videofilen kan være ødelagt + støttes ikke på enheten din + + Ukjent feil, videoen har stoppet + Tjeneren har kollapset, videoen har stoppet + Videoen har nådd maks varighet + Videoen har nådd maksimal filstørrelse Eksponeringskompensasjon - bilder i sekundet - Fokusdistanse + bilder per sekund + Fokusavstand Uendelig Frontkamera Bakkamera Foto Video - Eksponeringen er låst - Eksponeringen er låst opp - Nedtellingen er avbrutt. - Avbrøt seriefotograferingsmodusen - Startet nedtelling - Klarte ikke å lagre videofilen. - Klarte ikke å ta opp video. - Opptak av video har begynt. + Eksponering låst + Eksponering ulåst + Timeren ble avbrutt + Seriefotograferingsmodus ble avbrutt + Timeren ble startet + Kunne ikke lagre videofil + Kunne ikke ta opp video + Opptak av video har begynt Beklager - Klarte ikke å lagre bildet. - Klarte ikke å lagre RAW-bildet. - Klarte ikke å auto-stabilisere. - Klarte ikke å starte kameraforhåndsvisningen. + Kunne ikke lagre bilde + Kunne ikke lagre RAW-bilde + Kunne ikke nivåjustere automatisk + Kunne ikke starte kameraforhåndsvisning Tar bilde - Klarte ikke å ta et bilde. - GPS-posisjonen er ikke tilgjengelig. + Kunne ikke ta bilde + GPS-lokasjon er ikke tilgjengelig Bildet ble slettet - Ingen galleriapper er tilgjengelige - Skjermen er låst.\nSveip skjermen for å låse opp. - Låst opp. - Beklager, men auto-vater støttes\nikke på denne enheten. - Lyd er deaktivert. + Ingen applikasjon for bildegalleri er tilgjengelig + Skjermen er låst +\nsveip over skjermen for å låse opp + Låst opp + Beklager, automatisk nivåjustering støttes ikke +\npå denne enheten + Lyd er deaktivert Maks varighet - Fargeffekt + Fargeeffekt Scenemodus Hvitbalanse - Vinkel Retning KLARTE IKKE Å ÅPNE KAMERAET. ER KANSKJE KAMERAET I BRUK - AV EN ANNEN APP? + AV EN ANNEN APPLIKASJON? ISO - Forstørr - ledig + Zoom + Ledig [LÅST: Sveip for å låse opp] - - Klarte ikke å stemple infoen på bildet. - m - + Kunne ikke stemple informasjon til bildet + m + Kameraeffekter - Auto-stabiliser - Bilder vil bli rotert slik at automatisk er stabilisert (Kun bilder) (Tregere å ta bilder, og kan mislykkes på enheter med for lite lagring). - Legg til en fargeeffekt - Benytter den valgte fargeeffekten for bildet. + Automatisk nivåjustering + Bildene vil bli rotert slik at de automatisk er i vater (kun bilder) (tregere å ta bilder, og kan mislykkes på enheter med for lite minne) + Bruk en fargeeffekt + Bruker den valgte fargeeffekten på bildet Bruk en scenemodus - Optimaliser bildet til forskjellige scener. - Bestem hvitbalansen - Velg en innstilling for å justere hvitbalansen. - Velg ISO-en - En høyere verdi = mer sensitiv for lys. (Kan kanskje ikke virke på noen enheter) - Bestem eksponeringskompensasjonen. - Sett den til 0 for å bruke standard-eksponeringskompensasjonen. - Lås foto-/video-roteringen - Hvis dette er valgt, vil enhetens rotering bli ignorert, og bildets/videoens rotering vil samsvare med den bestemte roteringen\n%s - Ansiktsoppdagelse - Bruk ansikstsoppdagelse istedet for fokusområder. - + Optimaliser bildet for ulike scener + Konfigurer hvitbalansen + Velg en innstilling for å justere hvitbalansen + Sett ISO + En høyere verdi betyr økt lysfølsomhet (fungerer kanskje ikke på enkelte enheter) + Sett eksponeringskompensasjonen + Sett til 0 for standard eksponeringskompensasjon + Lås foto-/videoretning + Hvis angitt, ignoreres enhetens retning, og retningen på bildet/videoen vil være i forhold til den angitte retningen. +\n%s + Ansiktsgjenkjenning + Bruk ansiktsgjenkjenning istedenfor fokusområder Kamerakontrollere - Nedtelling - Nedtellingsbipp - Bipp når nedtellingen teller ned, eller under seriefotograferingsforsinkelse - Stemmenedtelling - Si nedtellingen eller seriefotograferingsmodusforsinkelsen (fra 60 sekunder) - Seriefoto + Timer + Lydsignal for timer + Lydsignal når timeren teller ned, eller forsinkelse under seriefotograferingsmodus + Stemmenedtelling for timer + Si nedtellingen for timeren eller forsinkelse i seriefotograferingsmodus (fra 60 sekunder) + Seriefotograferingsmodus + Seriefotograferingsintervall Flere kamerakontrollere… Trykk for å ta bilde - Ta et foto kun ved å trykke på dobbelt-tappe på forhåndsvisningen. + Ta et bilde eller ta opp en video bare ved å trykke eller dobbelttrykke på forhåndsvisningen Pause etter å ha tatt et bilde - Sett skjermen på pause etter å ha tatt et bilde, med valgene om å dele eller slette bildet. + Sett skjermen på pause etter å ha tatt et bilde, med mulighet for å dele eller slette bildet Lukkerlyd - Spill av en lyd når du tar et bilde. + Spill av en lyd når du tar et bilde Volumknapper Lydkontrollalternativer Lydkontrollsensitivitet - Innstillingen for støynivåsensitiviteten for lyd (Høy støy) - Lagringsplasseringen - Mappen som bildene/videoen skal lagres i. - Hvorvidt lagringstilgangsrammeverk skal brukes til å lagre bilder og videoer. - Forstavelsen til fotolagring - Forstavelsen som skal brukes til lagringsfilnavnene til bildene. - Forstavelsen til videolagring - Forstavelsen som skal brukes til lagringsfilnavnene til bildene. - Tidsformatet til filnavnene - Vis kameraet når mobilen er låstShow camera when locked - Hvis dette er aktivert, vil Camera fortsett vises over enhver låseskjerm (Du vil fortsatt måtte låse opp for å få tilgang til Innstillinger, Galleri, osv.). - Utfør auto-fokusering ved oppstart - Hvorvidt det skal auto-fokuseres når Camera startes opp. Hvis du har problemer med at blitsen skrur seg på ved oppstart, skru av denne innstillingen. + Innstilling for støynivåsensitivitet for lyd (høy lyd) + Lagringsplass + Mappe for lagring av bilde-/videofilene i + Hvorvidt Storage Access Framework skal brukes til lagring av bilder og videoer. Dette bør være aktivert for å tillate lagring på eksterne SD-kort. På Android 10+ må dette alternativet være aktivert hvis du vil lagre i en mappe utenfor DCIM. + Lagre bildeprefiks + Prefikset som skal brukes til å lagre filnavn for bilder + Lagre videoprefiks + Prefikset som skal brukes til å lagre filnavn for videoer + Tidsformat for filnavn + Vis kameraet når enheten er låst + Hvis aktivert, vil Kamera fortsatt vises på enhver låst skjerm (du må fortsatt låse opp for å få tilgang til innstillinger, galleri osv.) + Aktiver autofokus ved oppstart + Hvorvidt autofokus skal aktiveres når kameraet startes. Hvis du har problemer med at blitsen slås på når du starter kameraet, kan du deaktivere dette alternativet Lås skjermen under videoopptak - Under opptak av video, vil brukergrensesnitt bli låst for å unngå at opptaket blir stoppet ved et uhell. Sveip skjermen for å låse opp. Bemerk at opptak alltid vil bli stoppet dersom appen går inn i bakgrunnen eller at skjermen blir blank. - Rotér forhåndsvisningen - Innstilling for å rotere forhåndsvisningen (Påvirker ikke de resulterende bildene/videoene)\n%s - Grensesnittet på skjermen… + Når du spiller inn video, låses brukergrensesnittet for å forhindre at du stopper opptaket ved et uhell. Sveip over skjermen for å låse opp. Vær oppmerksom på at videoopptaket alltid stoppes hvis applikasjonen går i bakgrunnen eller skjermen blir blank. + Roter forhåndsvisningen + Innstilling for å rotere forhåndsvisningen (påvirker ikke de resulterende bildene/videoene) +\n%s + Brukergrensesnitt på skjermen… Forhåndsvisningsstørrelse - Grensesnittsplassering + Plassering av brukergrensesnitt Oppslukkende modus - Vis forstørring - Vis det nåværende kameraforstørringsnivået på skjermen (under forstørring) - Vis -/+—forstørringskontrollere - Vis -/+—knappene for forstørringskontrollering. - Vis forstørringsgliderkontrolleren - Vis glideren for forstørringskontroll. + Vis zoom + Vis gjeldende zoomnivå for kameraet på skjermen (når det er zoomet inn) + Vis -/+ zoomkontrollere + Vis knappene -/+ for zoomkontroll + Vis glidebryteren for zoom + Vis glidebryteren for zoomkontroll Vis ISO - Viser det nåværende ISO-nivået. I autoblitsmodus, vil et blitssymbol også fortelle når blitsen går av (Krever Camera2-API). - Vis ledig lagring - Vis den gjenværende enhetslagringsplassen på skjermen. - Vis vinkelen - Vis den nåværende enhetsroteringsvinkelen på skjermen. - Vis vinkellinjen - Vis en vannrett vaterlinje. - Vinkel/høyde-fremhevingsfarge - Fremhevingsfarge for når kameraet er nesten i vater. - Vis kompassretningen - Vis kompassretningen til enheten på skjermen. - Vis klokken - Vis det nåværende klokkeslettet på skjermen. + Viser gjeldende ISO-nivå. (Krever Camera2 API.) + Vis ledig minne + Vis enhetens gjenværende lagringsplass på skjermen + Vis vinkel + Vis gjeldende orienteringsvinkel for enheten på skjermen + Vis vinkellinje + Vis en horisontal vannrett linje + Vinkel/høyde uthevingsfarge + Uthevingsfarge for når kameraet er nesten i vater + Vis kompassretning + Vis enhetens kompassretning på skjermen + Vis tid + Vis nåværende klokkeslett på skjermen Vis batterinivå - Vis det nåværende batterinivået på skjermen. - Vis netting - Netting - Vis en klippingsveiviser - En klippeveiviser viser et rektangel som vis hva det bestemte skjermforholdet ser ut som — Nyttig dersom du planlegger å klippe bildet/videoen etterpå til et annet skjermforhold. Krever WYSIWYG-fotomodus, eller å være i videomodus\n%s - Vis oppsprettsbeskjeder - Hvorvidt oppsprettsbeskjedene skal vises. - Vis forhåndsvisningsanimasjon - Vis en bevegende forhåndsvisningsanimasjon når du tar et bilde. - Vis kanter når du tar et bilde - Vis kanter på skjermen når du tar et bilde. + Vis gjeldende batterinivå på skjermen + Vis rutenett + Rutenett + + Vis en beskjæringsguide + En beskjæringsguide viser et rektangel som viser hvordan det angitte størrelsesforholdet ser ut. Nyttig hvis du planlegger å beskjære bildet/videoen til et annet størrelsesforhold etterpå. Krever WYSIWYG-fotomodus eller videomodus. +\n%s + Vis meldinger på skjermen + Hvorvidt det skal vises midlertidige infomeldinger på skjermen + Vis miniatyrbildeanimasjon + Vis animasjon av bevegelige miniatyrbilder når du tar et bilde + Vis kantlinje når du tar bilde + Vis en ramme på skjermen når du tar et bilde Hold skjermen skrudd på Hvis dette er valgt, vil skjermen ikke skru seg av mens Cameras hovedgrensesnitt er aktivt. Fremtving makslysstyrke Tving skjermvisningen til å ha maks lysstyrke, og ikke enhetsstandarden. - Foto- og video-innstillinger Fotoinnstillinger… Videoinnstillinger… Posisjonsinnstillinger… Kameraoppløsning Bildekvalitet - Velg JPEG-kvaliteten til de lagrede bildene (Standardverdien er 90%%)\n%s + Velg JPEG-kvaliteten til de lagrede bildene (Standardverdien er 90%%)\n%s + RAW Lagre posisjonsdata (Geotagging) Lagre GPS-posisjonsdata i bildene/videoene. @@ -217,10 +223,9 @@ Lydkilde Mikrofonen som skal brukes til lydopptak\n%s Lydkanaler - Velg mono eller stereo for opptak av lyd (Stereo støttes kun på noen enheter).\n%s + Velg mono eller stereo for opptak av lyd (Stereo støttes kun på noen enheter). Blits under videoopptak Hvis dette er aktivert, vil blitsen skru seg av/på under videoopptak (Kan brukes til å se på avstand om kameraet fortsatt tar opp). - Diverse Netthjelp Gå til Camera-nettsiden i nettleseren din. @@ -233,11 +238,9 @@ Tilbakestill innstillinger Tilbakestill alle Camera-innstillinger til sine standarder. Er du sikker på at du vil tilbakestille alle Camera-innstillinger til sine standarder? - Tilgjengelig Ikke tilgjengelig Kopier til utklippstavlen - Ta bilde Galleri Eksponering @@ -250,7 +253,6 @@ Bytt til bildemodus Slett det seneste bildet Del bilde - Overmappe Ny mappe Kan ikke skrive til denne mappen. @@ -258,88 +260,73 @@ Skriv inn et nytt mappenavn Klarte ikke å lage mappen. Mappen eksisterer allerede. - Velg en lagreplassering Lagringstilgangsrammeverket ble avbrutt. Klarer ikke å lagre til denne mappen - Mikrofon-tillatelser er ikke tilgjengelige Posisjonstillatelser er ikke tilgjengelige - Begynn videoopptak Avslutt videoopptak - Maks filstørrelse - MB - GB - + MB + + GB + Begynn lydlytting Avslutt lydlytting Si \"Cheese!\" Lag en høy lyd - Auto-vater vil automatisk rotere bildene dine slik at de ser ut til å være i vater. \n\nBemerk at dette betyr at bilder automatisk vil litt lavere oppløsning (på grunn av roteringen og klippingen som er påkrevd). DNG-filer inneholder de fulle ukomprimerte og uprosesserte informasjonene fra ditt kamera.\n\nDe fleste galleriapper vil ikke kjenne igjen DNG, og de bør istedet brukes med spesialiserende apper.\n\nBemerk at diverse prosesseringsinnstillinger som "Stemple bilder" og "Auto-stabiliser" kun gjelder for JPEG-bildene, og ikke for DNG-bildene.\n\nDNG-filer tar opp veldig mye plass; en filutforsker-app kan være nyttig for å overføre eller slette dem.\n\nDNG-filer lagres kun i Standard- og DRO-fotomodusene. HDR-modus er nyttig for takninger som har stor variasjon i lysstyrke. Det virker ved at man tar flere bilder med forskjellige eksponeringer, og kombinerer dem til å forme ett endelig bilde.\n\n Bemerk at HDR ikke er egnet for scener med raske bevegelser, og kan føre til mindre nøyaktig fargerepresentasjon.\n\nÅ ta bilder i HDR-modus vil være tregere. - Ikke vis igjen - Fotomodus Std HDR Ekspo {} Exposure Bracketing - NR + NR + Støyreduksjon Fotostempel Lagre alle bilder i HDR-modus Hvis dette er aktivert, vil det i HDR-fotomodus være tre eksponeringsgrunnbilder som vil bli lagret, i tillegg til det endelige HDR-bildet. Bemerk at dette vil gjøre lagring tregere, spesielt hvis innstillinger som \"Stemple bilder\" eller Auto-vater også er brukt. - TILLATELSER ER IKKE TILGJENGELIGE Tillatelse er påkrevd Kameratillatelse er påkrevd for å kunne bruke kameraet. - Avlusingsinnstillinger Avlusingsinnstillinger Bruk alternativ blitsmetode Aktiver dette dersom enheten har trøbbel med blitsen i Camera2-APIen. this if your device has buggy flash behaviour with Camera2 API - Eksponeringsbrakett Antall bilder i eksponeringsbrakettmodusen\n%s Eksponeringsbrakett-stopper Hvor mange stopp som skal legges til / fjernes fra, for det mørkeste/lyseste bildet\n%s - Støyreduksjon av opprinnelige bilder Hvorvidt de opprinnelige bildene skal lagres under støyreduksjonsmodus. Bemerk at dette kan gjøre det mye tregere å lagre bilder.\n%s - Ikke lagre de opprinnelige bildene Lagre ett enkelt opprinnelig bilde Lagre alle opprinnelige bilder (Tregt) - - s - + s + Ikke nok ledig plass til å ta opp video Videoen ble stoppet.\nBatterinivået er kritisk lavt. Sjekk for kritisk batteri Avslutt videoopptak dersom batterinivået er kritisk lavt. Dette hjelper til med å redusere sjansen for at videoer blir korrumpert dersom enheten din plutselig skrur seg av fordi den gikk tom for strøm. - - Mørke - Lys + Mørke + + Lys + Lukkerhastighet - Stor kamerafeil - Aktiver rask HDR-/ekspongerings-blits Tillater raskere takning av HDR-/eksponerings-bilder. Deaktiver dette dersom enheten din har problemer når du tar bilder med HDR- eller eksponerings-fotomodusene. - Kamera Videoopptak Selfie - Speil frontkameraet Hvorvidt bilder skal speiles når frontkameraet brukes\n%s - Kalibrer vatervinkelen Denne innstillingen kalibrerer din enhets akselleromenter, sånn at auto-vateren og vater-/vinkel-innstillingene på skjermen virker riktig. Vennligst plasser din enhet på en flat vannrett overflate, sånn at den er i jevn høyde (Enten i portrett- eller landskaps-modus), og så velg Kalibrer.\n\nTrykk på Tilbakestill for å fjerne kalibreringen fra enheten din.\n\n\Trykk på Tilbake for å avbryte. @@ -347,16 +334,13 @@ Tilbakestill Stabiliseringen er kalibrert Stabiliseringskalibreringen er tilbakestilt. - DRO - Vis linjer Vis vannrette linjer Vis kompassretnings-linjer Vis kompassretnings-linjer. Videoundertekster Lag en undertekstfil (.SRT) som lagrer dato og klokkeslett; og også GPS-info dersom plasserings-/retnings-dataer er aktivert\n%s - Ubegrenset 3 sekunder 5 sekunder @@ -381,20 +365,15 @@ 30 minutter 45 minutter 1 time - Vis "Ta bilde"-ikon Vis ikonet for å ta bilder og å ta opp videoer. Nyttig dersom enheten din har en maskinvarelukkerknapp og at du heller ville brukt den. - Videoen ble pauset Video ble fortsatt Sett videoopptak på pause Fortsett videoopptak - Tar opp… - Klarte ikke å begynne lydlytting. Klarte ikke å lage et HDR-bilde. - Auto Overskyet Dagslys @@ -404,7 +383,6 @@ Skumring Varm Manuell - Action Strekkode Strand @@ -421,7 +399,6 @@ Stødig foto Solnedgang Teater - Aqua Svart tavle Mono @@ -431,21 +408,16 @@ Sepia Solariser Hvit tavle - Hva er nytt: Doner - Standard - Kun JPEG JPEG og DNG (RAW) - Standard åååå-mm-dd dd/mm/åååå mm/dd/åååå ingen - Blits av Auto-blits Blits på @@ -453,12 +425,10 @@ Rødt øye Auto-skjermblits Skjermblits på - Kameraopptaker Ekstern mikrofon (hvis det er en) Standardlydkilden Optimalisert for stemmer - Standard 100KB/s 200KB/s @@ -483,7 +453,6 @@ 80MB/s 90MB/s 100MB/s - Av 2x 3x @@ -498,7 +467,6 @@ 200x 500x Ubegrenset - Ingen forsinkelse 1s 2s @@ -516,14 +484,12 @@ 30m 1t 2t - Enhetsstandard 100MB 200MB 300MB 500MB 1GB - Ingen 1 (1:1) 1,25 (5:4) @@ -535,7 +501,6 @@ 2,33 (21:9) 2,35 (47:20) 2,4 (12:5) - +3 (høy sensitivitet) +2 +1 @@ -543,27 +508,23 @@ -1 -2 -3 (lav sensitivitet) - Venstrehendt grensesnitt Høyrehendt grensesnitt - Skyggelagt tekst Ren tekst - - Av - Skjul bare de virtuelle navigasjonsknappene - Skjul grensesnittet - Skjul alt - - Ingen - Høy støy - Stemmekommando: \"cheese\" - Bygg versjon - Kamera er gaffel fra OpenCamera + Kamera er gaffel fra Camera Forfatter Kildekode lisens Kamerainformasjon Tjenestevilkår - + Av + Skjul bare de virtuelle navigasjonsknappene + Skjul grensesnittet + Skjul alt + Ingen + Høy støy + Stemmekommando: \"cheese\" + + \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml new file mode 100644 index 000000000..3167a06b7 --- /dev/null +++ b/app/src/main/res/values-nl/strings.xml @@ -0,0 +1,838 @@ + + + Gevoeligheid audio besturing + Audio besturingsopties + Volume knoppen + Laat een sluiter toon horen bij het nemen van een foto + Sluiter geluid + Pauzeer het scherm na het nemen van een foto met de mogelijkheid die te delen of verwijderen + Pauzeer na foto-opname + Meer camera instellingen… + Interval serie opname + Serie opname + Gesproken aftellen bij de timer of tijdens vertraging bij serie opnames (vanaf 60 seconden) + Timer + Gebruik gezichtsherkenning in plaats van focus punten + Gezichtsherkenning + Indien ingesteld wordt de oriëntatie van het toestel genegeerd en is de oriëntatie van foto/video opnames zoals die is ingesteld +\n%s + Vergrendel foto/video oriëntatie + Zet op 0 voor de standaard belichtingscompensatie + Belichtingscompensatie instellen + Een hogere waarde betekend meer lichtgevoeligheid (werkt niet op sommige toestellen) + ISO waarde instellen + Witbalans instellen + Optimaliseer de foto voor verschillende scènes + Pas een scène modus toe + Past het geselecteerde kleureffect toe op de foto + Kleureffect toepassen + Auto-level + Camera effecten + m + Opslaan van foto informatie mislukt + Swipe om te ontgrendelen] + [VERGRENDELD: + Vrij + Zoom + ISO + DOOR EEN ANDERE APPLICATIE\? + CAMERA KAN IN GEBRUIK ZIJN + FOUT TIJDENS OPENEN CAMERA. + Richting + Hoek + Witbalans + Scène modus + Kleur effect + Max tijdsduur + Ontgrendeld + Geen galerij app beschikbaar + Foto verwijderd + GPS locatie niet beschikbaar + Sorry + Video opname gestart + Video bestand opslaan mislukt + Timer gestart + Timer geannuleerd + Video + Foto + Oneindig + Focus afstand + FPS + Belichting compensatie + Video heeft maximale bestandsgrootte bereikt + Video heeft maximale duur bereikt + Server probleem, video gestopt + Onbekende fout, video gestopt + niet ondersteund op uw toestel + Verbinding met camera mislukt + Video-opname gestopt + Opslag locatie gewijzigd naar: + Kies een andere map + Wis map geschiedenis\? + Wis map geschiedenis + Kies opslag locatie: + Uit + Aan + OK (Dit bericht zal niet meer verschijnen) + Instellingen + Camera + HDR + Standaard + Std + Maak een hard geluid + Zeg \"cheese\" + GB + MB + Map bestaat al + Vergrendel belichting + Belichting + Galerij + Kopieer naar klembord + Niet beschikbaar + Beschikbaar + Reset instellingen + Over + Online hulp + Tekst stijl + GPS stempel formaat + Sla locatie data op (Geotagging) + RAW + Camera resolutie + Toon miniatuur animatie + Raster + Toon hoek + Toon ISO + Machtiging vereist + MACHTIGINGEN NIET BESCHIKBAAR + Sla alle foto\'s op voor HDR modus + Foto Stempel + Ruis Onderdrukking + RO + Snelle Fotoreeks + []]] + Foto Modus + Niet opnieuw weergeven + Maximale bestandsgrootte + Stop opnemen video + Start opnemen video + Geen machtiging voor locatie toegang + Geen machtiging voor microfoon toegang + Kan niet opslaan naar deze map + Storage Access Framework geannuleerd + Selecteer opslag locatie + Probleem met het aanmaken van map + Geef naam voor nieuwe map + Geen toegang tot deze map + Kan niet naar deze map schrijven + Nieuwe Map + Foto Delen + Verwijder laatste foto + Schakel naar foto modus + Schakel naar video modus + Wissel naar achterste camera + Wissel naar voorste camera + Flash Modus + Focus Modus + Neem foto + Ben je zeker dat je alle Camera instellingen wil resetten\? + Reset alle Camera instellingen naar de standaard waarden + App en debug info + Doneer om verdere ontwikkeling te ondersteunen + Surf naar de Camera website in je browser + Audio kanalen + Audio bron + Neem audio op tijdens video opname + Audio opnemen + Herstart op maximum bestandsgrootte + Maximale grootte van video + Maximum duur van video + Video bitrate (bij benadering) + Schakel video stabilisatie in + 4K UHD afdwingen (werkt enkel op sommige apparaten) + Video resolutie + Tekst kleur voor stempels op foto\'s +\n%s + Tekst kleur + Tekst grootte voor stempels op foto\'s +\n%s + Tekstgrootte + Voeg stempel toe aan foto\'s met een aangepaste tekst + Aangepaste tekst + Formaat tijdsaanduiding + Datum stempel formaat + Voeg aan foto\'s een stempel toe met datum en tijd; en ook met gps locatie indien locatie/richting data ingeschakeld +\n%s + Voeg stempel toe op foto\'s + Als locatie data ingeschakeld is, neem alleen foto\'s/video\'s wanneer locatie data beschikbaar is + Verplicht locatie data + Sla GPS kompas richting op in foto\'s (alleen voor JPEG formaat) + Sla kompas richting op + Sla GPS locatie data op in foto\'s/video\'s (voor foto\'s, locatie date kan enkel opgeslagen worden in JPEG en DNG formaat) + Stel de beeldkwaliteit van opgeslagen JPEG of WebP afbeeldigen in (standaard waarde is 90%%). Dit heeft geen invloed op het PNG foto formaat. +\n%s + Foto kwaliteit + Locatie instellingen… + Video instellingen… + Foto instellingen… + Foto en Video instellingen + Zet scherm helderheid op maximaal, ongeacht de instellingen van het apparaat + Maximale helderheid afdwingen + Houd scherm ingeschakeld + Toon rand bij het nemen van een foto + Toon raster hulplijnen + Toon het batterij niveau op het scherm + Toon batterij + Toont de huidige tijd op het scherm + Toon tijd + Toon de kompas richting van het apparaat op het scherm + Toon kom­pas ­rich­ting + Toon horizontale level lijn + Toon hoek lijn + Toon vrij geheugen + Toon het zoom niveau op het scherm (wanneer ingezoomd) + Toon zoom + Voorbeeld grootte + Gebruikersinterface… + Draai voorbeeld + Tijdens het opnemen van video zal de gebruikersinterface geblokkeerd worden om te vermijden dat een opname per ongeluk wordt gestopt. Swipe over het scherm om te deblokkeren. Let wel dat een video-opname altijd stopt wanneer de app op de achtergrond wordt gezet of het scherm leeg is. + Vergrendelingsscherm actief tijdens het opnemen van video + Voer auto-focus uit tijdens het opstarten + Wanneer ingeschakeld zal Camera op het vergrendelingsscherm worden afgebeeld (Je moet wel nog deblokkeren voor toegang tot Instellingen, Galerij enz) + Toon camera wanneer vergrendeld + Tijdnotatie voor bestandsnamen + Het voorvoegsel voor bestandsnamen bij opgeslagen video\'s + Video voorvoegsel + Het voorvoegsel voor bestandsnamen bij opgeslagen foto\'s + Foto voorvoegsel + Gebruik Storage Access Framework + Map om foto/video bestanden in op te slaan + Opslag locatie + Neem een foto of video door het voorbeeld aan te raken of te dubbelklikken + Vastleggen bij aanraking + Timer met spraakgeluid + Geef signaal wanneer de timer aan het aftellen is of tijdens de vertraging bij serie opnames + Timer signaal + Camera Bediening + Kies een instelling om de witbalans aan te passen + Geluid uitgeschakeld + Sorry, auto-level wordt niet ondersteund +\nop dit apparaat + Scherm is vergrendeld +\nVeeg over het scherm om te ontgrendelen + Foto nemen mislukt + Foto genomen + Starten van camera voorbeeld mislukt + Auto-level mislukt + Opslaan van RAW foto is mislukt + Opslaan foto mislukt + Video opname mislukt + Herhaal modus geannuleerd + Belichting ontgrendeld + Belichting vergrendeld + Camera achter + Camera voor + Fout, het video bestand kan beschadigd zijn + herhalingen te gaan + Pop-up instellingen + Versie + Licentie + Auteurs + Servicevoorwaarden + Broncode + Diversen + Kies mono of stereo voor audio opnames (stereo werkt alleen op sommige toestellen) + Gebruikte microfoon voor audio opname +\n%s + Herstart automatisch wanneer de maximum bestand grootte is bereikt + De video opnam zal stoppen en/of herstarten (zie volgende optie) wanneer de maximum bestand grootte is bereikt. Merk op dat vele Android toestellen zelf een maximum bestand grootte hanteren (meestal rond 2GB of 4GB), maar deze optie geeft de mogelijkheid zelf een waarde te kiezen. +\n%s + Wanneer de video opname is gestopt bij het bereiken van de max tijdsduur (wanneer ingesteld), zal deze optie een nieuwe opname starten, voor een gespecificeerd aantal keer +\n%s + Herstart na max tijdsduur + De video opname zal stoppen na de gespecificeerde tijdsduur +\n%s + Stel de beeldfrequentie (FPS) van video\'s in (Dit is bij benadering en niet gegarandeerd. De opname kan mislukken als de beeldfrequentie niet wordt ondersteund). Merk op dat deze optie wordt genegeerd bij slow moti­on video\'s. +\n%s + Video beeldfrequentie (bij benadering) + Stel de bitrate van video\'s in (hoger betekend betere kwaliteit, maar neemt meer opslagruimte in; video opname kan mislukken als de bitrate niet wordt ondersteund) +\n%s + Video stabilisering reduceert het bewegen van de camera zowel in de preview als in de opnames. + Schakel 3840x2160 resolutie voor video opname in op de achterste camera - deze optie is een hack dat mogelijk toegang geeft tot 4K camera\'s op toestellen die deze optie normaal niet toestaan voor app\'s van derden. Het is niet gegarandeerd dat het werkt. + Foto\'s opslagen in een achtergrond-thread (Voor een snellere werking) + Gebruik achtergrond-thread + Tekst stijl voor foto stempels +\n%s + Wanneer ingeschakeld zal het scherm niet uit gaan wanneer de Camera gebruikersinterface actief is + Geef een rand weer op het scherm om aan te geven wanneer er een foto genomen wordt + Toon thumbnail animatie bij het nemen van een foto + Weergave van pop-up, \"toast\", berichten activeren/deactiveren + Toon berichten op het scherm + Geeft een rechthoek weer om te zien hoe een andere beeldverhouding er uit kan zien - handig als je van plan bent om later de foto/video beeldverhouding aan te passen. Vereist WYSIWYG foto modus of video modus +\n%s + Toon hulplijnen voor bijsnijden + Toon de resterende opslag ruimte van het toestel op het scherm + Geeft de huidige ISO waarde weer. (Vereist Camera2 API) + Toon de slider om de zoom te regelen + Toon zoom slider + Geeft -/+ knoppen om de zoom te regelen weer + Toon zoom -/+ knoppen + Plaatsing van gebruikersinterface + Optie om de voorbeeld weergave te draaien (heeft geen invloed op het resultaat van de opname) +\n%s + Automatisch scherpstellen bij het opstarten van de app. Wanneer je een probleem hebt waardoor de flits ongevraagd aan gaat bij het starten, schakel je deze optie uit + Maak gebruik van Storage Access Framework om foto\'s en video\'s op te slaan. Vink dit aan (vanaf Android 5) om te kunnen opslaan op externe SD-cards. Vanaf android 10 moet dit ingeschakeld staan om bestanden op te slaan buiten de DCIM map. + Geluidniveau gevoeligheid voor harde geluiden + 100% + 40x + 30x + 20x + 10x + 5x + 4x + 3x + 2x + Volgende + Camera2 API + Originele camera API + Camera API + ID + Originele foto\'s opslagen plus debug XML bestand + Originele foto\'s opslagen + Originele foto\'s niet opslagen + Originele panorama afbeeldingen ook opslagen. Merk op dat de opslag van panorama foto\'s langzamer gaat. Het is ook mogelijk een XML bestand op te slagen wat nuttig kan zijn om problemen met panorama te rapporteren. +\n%s + Panorama originele afbeeldingen + Panorama automatisch bijsnijden + Fout bij het maken van Panorama afbeelding + Panorama geannuleerd + Annuleer panorama + Panorama voltooien + Afbeeldingen aan het opslagen… + Scannen + Huidige afstandbediening: + Geeft een icoon weer op het scherm om de verschillende RAW modi te kunnen selecteren + Toon RAW icoon + Geeft een icoon weer op het scherm om de verschillende flash opties te kunnen selecteren, in plaats van flash opties in het pop-up menu. De zaklamp is wel niet beschikbaar wanneer je dit icoon gebruikt. + Toon flash icoon + Camera preview… + Resterende + Bepaalt de kleur waarmee scherpgestelde delen worden geaccentueerd +\n%s + Focus-Peaking kleur + Aan + Uit + Deze optie accentueert contouren die in focus staan. Dit kan handig zijn bij manuele focus om sneller scherp­ge­stelde delen te onderscheiden in het beeld. +\n%s + Focus-Peaking + 99% + 98% + 97% + 95% + 93% + 90% + 80% + 70% + Uit + Geeft zebra strepen weer op het scherm waar de camera preview overbelicht is. +\n%s + Toon zebra strepen + Helderheid (Gemiddelde van min.-max.) + Intensiteit (Gemiddeld) + Waarde (Maximum) + Helderheid + RGB Kleuren + Uit + Toont een kleuren histogram op het scherm +\n%s + Toon een histogram + Locatie data opslag stoppen + Locatie data opslagen + Geeft een knop weer op het scherm om de opslag van locatie data in/uit te schakelen (geotagging) + Toon icoon locatie data + Geen adres weergeven + Verkies adressen voor GPS coördinaten + Geef adressen weer wanneer mogelijk, samen met de GPS coördinaten + Gebruik adressen + Kraken Smart Housing + Afstandsbediening verbonden + Voor onderwater behuizingen, verbetert de nauwkeurigheid als het correcte water type is geselecteerd. + Gebruik Zoutwater voor diepte berekeningen + Hint: zet de standaard helderheid van het scherm op de minimum stand voor dat je Camera start. + Scherm dimmen bij verbroken verbinding + Onbekend apparaat + Bluetooth wordt niet ondersteund. + BLE Apparaat Scan + BLE wordt niet ondersteund + Type extern apparaat + Inschakelen van Bluetooth LE (BLE) besturingsapparaten + Inschakelen van Bluetooth LE afstandsbediening + Bluetooth LE afstandsbediening… + Panorama + Pano + Witbalans ontgrendeld + Witbalans vergrendeld + Witbalans ontgrendelen + Witbalans vergrendelen + Geeft een icoon weer om automatische witbalans te vergrendelen/ontgrendelen + Toon auto-witbalans icoon + Geeft een icoon weer om specifieke tekst stempel te gebruiken + Toon icoon voor specifieke tekst stempel + Foto stempels uitgeschakeld + Foto stempels ingeschakeld + Foto stempels uitschakelen + Foto stempels inschakelen + Geeft een icoon weer om foto stempels in of uit te schakelen + Toon foto stempel icoon + Gezichtsherkenning uitgeschakeld + Gezichtsherkenning ingeschakeld + Gezichtsherkenning uitschakelen + Gezichtsherkenning inschakelen + Geeft een icoon weer om gezichtsherkenning in of uit te schakelen + Toon gezichtsherkenning icoon + Iconen aan bovenkant (portret) + Rechtshandige gebruikersinterface + Linkshandige gebruikersinterface + Weinig licht + Normaal + NR modus + PNG + WebP + JPEG + Afbeelding formaat + Fout bij laden instellingen + Fout bij opslagen instellingen + Opgeslagen instellingen + Deze optie maakt het mogelijk om een opgeslagen instellingen bestand te selecteren. Wees voorzichtig! Het geselecteerde bestand zal alle huidige instellingen overschrijven! + Herstelt de vorige opgeslagen instellingen. Alle huidige instellingen zullen overschreven worden met de opgeslagen instellingen! + Instellingen terugzetten + Naam van het instellingen bestand + Slaagt alle Camera instellingen op in een bestand + Instellingen opslaan + Instellingen beheer + WebM (Audio niet ondersteund) + 3GPP + MPEG4 HEVC + MPEG4 H264 + Standaard + Video en audio bestandsformaat en codecs +\n%s + Video formaat + Altijd + Smart + Uit + HDR contrast verbetering + -3 (lage gevoeligheid) + -2 + -1 + 0 (standaard) + +1 + +2 + +3 (hoge gevoeligheid) + 2,4 (12:5) + 2,35 (47:20) + 2,33 (21:9) + 2,0 (2:1) + 1,85 (37:20) + 1,78 (16:9) + 1,5 (3:2) + 1,4 (7:4) + 1,33 (4:3) + 1,25 (5:4) + 1 (1:1) + Geen + 9 GB + 5 GB + 2 GB + 1 GB + 500 MB + 300 MB + 200 MB + 100 MB + Standaard + 2 h + 1 h + 30 min + 20 min + 10 min + 5 min + 2 min + 1 min + 30 s + 20 s + 15 s + 10 s + 5 s + 3 s + 2 s + 1 s + 0,5 s + Geen vertraging + Onbegrensd + 500x + 200x + 100x + 50x + Uit + Schakeld extra mogelijkheden in zoals manuele modus voor belichting, focus, witbalans en ook RAW (Indien het ondersteund wordt door het toestel). Dit werkt mogelijk niet correct op alle toestellen + Gebruik Camera2 API + Als je tevreden bent over deze app, overweeg a.u.b. een donatie te doen om de softwareontwikkelaars te ondersteunen. Je kan dit doen door mijn donatie app te kopen - klik op deze optie om de webpagina voor de donatie app te openen. Alvast bedankt! + Geen bestand dialoogvenster gevonden. Deze optie wordt niet ondersteund op dit toestel + Vorige + Vermeer of verminder belichting compensatie + 4x + 2x + Uit + 200 Mbps + 150 Mbps + 100 Mbps + 90 Mbps + 80 Mbps + 70 Mbps + 500 kbps + 200 kbps + 100 kbps + Standaard + Standaard audiobron + Externe microfoon + Standaard + Afbeelding kan niet geopend worden + Uit + Uit + 60 Hz + 50Hz + Auto + Algoritmes tegen flikkeren. +\n%s + Rode ogen reductie + Zaklamp + Flits aan + Automatische flits + Geen flits + Slow motion uitgeschakeld + Slow motion ingeschakeld + Normaal + Snelheid + 200 + 150 + 100 + 50 + 40 + 30 + 25 + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + Aantal foto\'s + 20 + 15 + 12 + 10 + 8 + 6 + 5 + 4 + 3 + 2 + Aantal foto\'s + Geen + mm/dd/jjjj + dd/mm/jjjj + jjjj-mm-dd (ISO 8601) + Standaard + Enkel DNG (RAW) + Standaard en DNG (RAW) + Neen + Verwerken… + Tekst op te slagen in de afbeelding metadata, copyright tag (enkel JPEG formaat, laat leeg indien niet gebruikt) + Copyright + Tekst op te slagen in de afbeelding metadata, artiest tag (enkel JPEG formaat, laat leeg indien niet gebruikt) + Artiest + Specifieke EXIF-tags + Standaard + Hoge snelheid + in het midden + onder aan het scherm + boven aan het scherm + rechts van het scherm + links van het scherm + Gezichten + Gezicht + Doneer + Nieuwigheden: + Whiteboard + Overbelicht + Sepia + Poster + Geen + Negatief + Mono + Schoolbord + Water + Theater + Zonsondergang + Sport + Sneeuw + Portret + Feest + Nacht-portret + Nacht + Landschap + Vuurwerk + Auto + Kaarslicht + Strand + Barcode + Actie + Manueel + Warm + Schemering + Schaduw + Gloeilamp + Fluorescerend + Daglicht + Bewolkt + Auto + HDR afbeelding kon niet gemaakt worden + Initialisatie audio opname mislukt + Opname bezig… + Hervat video opname + Pauzeer video opname + Video hervat + Video gepauzeerd + Toon het icoon om foto\'s en video\'s op te nemen. Schakel dit uit als je liever foto\'s neemt op een andere manier (bv. als jouw toestel een sluiterknop heeft, of met de volume knoppen). + Toon \"Neem Foto\" icoon + 1 uur + 45 minuten + 30 minuten + 25 minuten + 20 minuten + 15 minuten + 12 minuten + 11 minuten + 10 minuten + 9 minuten + 8 minuten + 7 minuten + 6 minuten + 5 minuten + 4 minuten + 3 minuten + 2 minuten + 1 minuut + 30 seconden + 15 seconden + 10 seconden + 5 seconden + 3 seconden + Onbeperkt + Maak een ondertitel (.SRT) bestand dat de datum en tijd bevat; en ook GPS info indien locatie/kompas data is ingeschakeld. (Vanaf Android 11+ moet hiervoor de optie \"Meer camera instellingen/Storage Access Framework ingeschakeld zijn). +\n%s + Video ondertitels + Toon kompas richting lijnen + Toon kompas richting lijnen + DRO + Reset + Bepaald of de afbeeldingen van de voor camera worden gespiegeld +\n%s + Spiegel front camera + Selfie + Video opnemen + Camera + Maakt snellere opnames mogelijk voor HDR/expo shots. Schakel dit uit wanneer je toestel problemen heeft met HDR of Expo modus. + Activeer snelle HDR/expo-Burst + Ernstige camera fout + Sluitertijd + Licht + Donker + Stop met video opname wanneer de batterij bijna leeg is. Dit helpt het risico te verminderen dat video\'s onleesbaar worden door plotseling uitvallen van de stroom. + Controle batterij lading + Video gestopt +\nBatterij bijna leeg + Niet genoeg vrije opslagruimte om video op te nemen + s + Originele afbeeldingen niet opslaan + Bewaar ook de originele afbeeldingen in ruisonderdrukking modus. Merk op dat foto\'s opslagen veel langzamer verloopt. +\n%s + Ruisonderdrukking originele afbeeldingen + Gebruik alternatieve flash methode + Debugging opties + Debugging opties + Locatie toegang is vereist voor geotag­ging (Opslaan van locatie data in foto\'s en video\'s, inclusief stempel en ondertitel opties). Locatie toegang is ook vereist (voor Android 11 en oudere versies) om te verbinden met Bluetooth LE afstandsbedieningen. + Opslag lees/schrijf toestemming is vereist om foto\'s op te slagen + Camera toestemming is vereist om de camera te activeren + Wanneer ingeschakeld, dan zullen in HDR modus de drie basis-belichting afbeelding samen met de uiteindelijke HDR foto opgeslagen worden. Merk op dat het opslagen langer duurt, zeker in combinatie met opties zoals \"Foto Stempel\" of \"Auto-level\". + HDR modus is handig voor shots met een grote variatie van lichtinval. Het werkt door verschillende shots met verschillende belichtingen te nemen, en die dan samenvoegen tot de uiteindelijke foto. +\n +\nMerk op dat HDR is niet geschikt for scènes met snelle beweging, en kan resulteren in minder accurate kleurweergave. +\n +\nFoto\'s nemen in HDR modus gaat langzamer. + DNG bestanden bevatten de volledige informatie van je camera, zonder compressie of bewerking. +\n +\nMerk op dat niet elke galerij app DNG bestanden herkent. DNG afbeeldingen kunnen gebruikt worden bij gespecialiseerde foto editors. +\n +\nMerk op dat verschillende bewerking opties, waaronder Stempel foto\'s en Auto-level, enkel beschikbaar zijn bij niet-DNG (JPEG/enz) afbeeldingen. + Bovenliggende map + 60 Mbps + 50 Mbps + 40 Mbps + 30 Mbps + 20 Mbps + 15 Mbps + 10 Mbps + 9 Mbps + 8 Mbps + 7 Mbps + 6 Mbps + 5 Mbps + 4 Mbps + 3 Mbps + 2 Mbps + 1 Mbps + Focus ondersteuning + Hoge kwaliteit + Snel + Minimaal + Uit + Standaard + Ruisonderdrukking algoritme + Verwerking instellingen… + ft + Voet + Meter + Gebruikt voor GPS hoogte voor foto stempels en video ondertitels. +\n%s + Afstand eenheid + Onbekend + Hoog + Medium + Laag + Onbetrouwbaar + Het kompas van je toestel moet gekalibreerd worden om de precisie te verbeteren. Dit kan je doen door je toestel te bewegen in een 8 figuur. +\n +\nHuidige precisie: + Kompas richting + Geeft de geluidssterkte op het scherm weer tijdens video-opnames + Toon audio indicatie + Sta foto\'s toe tijdens video opname + Informatie over Camera + Open Source licenties + Selecteer het bestandsformaat om foto\'s op te slagen. Dit is van toepassing op \"standaard\" (niet RAW) foto\'s. Opslag van Exif metadata wordt enkel bij JPEG bestanden ondersteund. Merk op dat het PNG niet werkelijk lossless is, maar in plaats daarvan geconverteerd vanuit JPEG aan 100%% kwaliteit. +\n%s + Diafragma + Camera is gebaseerd op Camera + Camera gebruikt pictogrammen van Google\'s Material Design icons (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , https://google.github.io/material-design-icons/) onder de Apache licentie versie 2.0. Sommige pictogrammen zijn aangepast. Tik hier voor de volledige licentie tekst. + Google Material Design pictogrammen + Camera is © 2013–2019 Mark Harman, uitgebracht onder de GPL v3 of later. Tik hier voor de volledige licentie tekst. + Camera + Camera maakt gebruik van de camera sensor en microfoon om te kunnen werken. De microfoon wordt ook gebruikt voor de optionele \"Audio besturing\". +\nMachtiging voor opslagruimte is nodig om foto\'s en video\'s op te slagen op je toestel. +\nLocatie machtiging is vereist voor de optionele geotagging functies (voor foto\'s en video\'s, inclusief stempel en ondertitel opties). Wanneer relevante optie(s) zijn ingeschakeld zal de locatie opgeslagen worden in foto/video/ondertitel bestanden. Locatie toegang is ook vereist om verbinding te maken met een Bluetooth afstandsbediening. +\nOmdat Camera ook gebruikt maakt maakt besturingssysteem API\'s, zou je ook het bijhorende privacybeleid moeten doornemen voor, onder andere, je toestel, fabrikant, besturingssysteem en/of Google Accounts. Bijvoorbeeld: +\n*De optionele stem besturing maakt gebruik van de Android spraak herkenning service. Wanneer ingeschakeld zal audio data waarschijnlijk verzonden worden naar externe servers om spraakherkenning uit te voeren. +\n*De \"Addressen\" optie voor foto stempels of video ondertitels maakt gebruik van Android Geocoder API. Wanneer ingeschakeld is het nodig om locatie data over internet te versturen naar een derde partij (Dit hangt af van welke backend service geïnstalleerd zijn op je toestel). +\n*Apps/services zoals cloud services kunnen de foto\'s en video\'s op je toestel automatisch uploaden. + Schakel dit in als je apparaat onvolmaakt flits gedrag heeft met Camera2 API + Toegang tot de microfoon is vereist om video met geluid op te nemen alsook om de \"Audio beheer\" opties te kunnen gebruiken + Belichting Bracketing + Auto-level zal automatisch foto\'s roteren, zodat ze waterpas staan. +\n +\nLet op dat dit betekent dat foto\'s een kleinere resolutie zullen hebben (door het roteren en bijsnijden dat benodigd is). + Stop beluisteren van geluid + Start beluisteren van geluid + Indien ingeschakeld zal de flitser langzaam knipperen tijdens een video opname (kan gebruikt worden als indicatie dat de camera aan het opnemen is) + Flits tijdens het opnemen van een video + Toon kleurmarkering wanneer camera ongeveer waterpas staat + Toon de huidige apparaat oriëntatie hoek op het scherm + Meeslepende modus + Foto\'s zullen gedraaid worden, zodat ze automatisch waterpas staan (alleen foto\'s) (langzamer om foto\'s te maken, en kan mislukken op apparaten met te weinig geheugen) + Hoek/hoogte markeringskleur + Scherm Zaklamp + Scherm Flits Aan + Scherm Flits Auto + Toon horizontale veldlijnen + Toon veldlijnen + Niveau kalibratie reset + Niveau gekalibreerd + Kalibreer + Plaats uw toestel op een plat horizontaal oppervlak zodat het waterpas ligt (in staande of liggende positie) en selecteer vervolgens Kalibreren. +\n +\nDruk op Reset om de kalibratie van uw toestel te verwijderen. +\n +\nDruk op de knop Terug om te annuleren. + Met deze optie wordt de versnellingsmeter van het toestel gekalibreerd, zodat de opties voor automatisch waterpas stellen en waterpas/hoek op het scherm correct werken + Kalibreer waterpashoek + Sla alle originele afbeeldingen op (langzaam) + Enkel originele afbeelding opslaan + Stabiele foto + Antibanding + Blootstelling Bracketing + Expo {} + Laatste foto genomen + Selecteer afstandsbediening + Video beeld profielen + Wanneer mogelijk, haal het adres op met de GPS locatie (voor foto stempel of video ondertitels). Merk op dat, wanneer ingeschakeld, het vereist is dat je toestel locatie data via het internet verstuurd naar een derde partij die GPS data omzet naar een adres. Ref: https://developer.android.com/reference/android/location/Geocoder . Deze functie voorziet geen garantie voor accuraatheid en beschikbaarheid. De resultaten zijn een schatting en niet gegarandeerd relevant of correct. +\n%s + Neem een foto/video wanneer een geluid is gedetecteerd. Als dit is ingeschakeld, gebruik de microfoon knop op het scherm om te starten/stoppen detecteren. +\n%s + Selecteer Camera2 API om extra functies in te schakelen zoals manuele belichting, focus, wit balans en RAW (indien ondersteund door jouw toestel). De API wijzigen zal de app doen herstarten. +\n%s + Zoekbalk om belichting compensatie te wijzigen + Om een panorama foto te nemen, houdt uw toestel vast voor een portret opname en klik om de panorama foto te starten. Draai daarna te toestel naar links of rechts totdat de witte cirkel in het midden overlapt met de blauwe cirkel. Nadat een nieuwe afbeelding is opgenomen, draai je jouw toestel verder tot je een nieuwe blauwe cirkel overlapt. +\n +\nTik op het vinkje om de panorama op te slaan, of het kruisje om te annuleren. +\n +\nMerk op dat panorama foto\'s tijd kunnen kosten om te verwerken en op te slaan. + Flash modi + Log profiel + Log (Extra sterk) + Log (Sterk) + Log (Medium) + Log (Laag) + Log (Fijn) + Voor de panorama modus, verwijder de golvende randen +\n%s + Tekst met schaduw achtergrond + Gewone tekst + Tekst met schaduw + Lage belichting modus: hou a.u.b. de camera zo stil mogelijk + Deblokkeer belichting + Geeft een icoon weer om de automatische belichting te vergrendelen + Toon auto belichting vergrendeling icoon + Uitschakelen auto-uitlijnen + Inschakelen auto-uitlijnen + Geeft een icoon weer om automatisch uitlijnen in/uit te schakelen. Wanneer dit is ingeschakeld, zullen foto\'s automatisch gedraaid worden om gelijk te lopen met de horizon. + Toon auto-uitlijn icoon + Focus bracketing geannuleerd + Zoom in wanneer de manuele focus afstand wordt aangepast +\n%s + Edge mode algoritme + Toon informatie over nieuwe functies en verbeteringen wanneer de applicatie is bijgewerkt + Toon nieuwigheden + Voeg oneindige afstand toe + Focus bracketing doel afstand + Focus bracketing bron afstand + Focus Bracketing + Focus {} + Onbewerkt + Geoptimaliseerd voor spraakherkenning + Geoptimaliseerd voor spraakgesprekken + Camcorder + Staat toe foto\'s te nemen tijdens video opnames. Deactiveer dit als er problemen zijn met video opnames terwijl Camera2 API is ingeschakeld op je toestel. + Geselecteerde afbeelding + Overlap een afbeelding om te helpen met uitlijnen. +\n%s + Nabeeld + Aantal stops die worden opgeteld/afgetrokken voor de lichtste/donkerste afbeelding +\n%s + Belichtingsreeks stops + Aantal beelden voor belichtingsreeks +\n%s + geen burst + \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e1627b8d5..ed8e9847f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -216,7 +216,7 @@ Źródło dźwięku Wybór mikrofonu, z którego będzie nagrywany dźwięk\n%s Źródło dźwięku - Wybór między dźwiękiem mono a stereo (dostępne tylko na niektórych urządzeniach)\n%s + Wybór między dźwiękiem mono a stereo (dostępne tylko na niektórych urządzeniach) Błysk podczas nagrywania Jeśli włączono, lampa błyskowa będzie się włączać i wyłączać (przydatne w przypadku gdy chcemy z większej odległości stwierdzić czy kamera wciąż nagrywa) Różne @@ -746,7 +746,7 @@ 99% 100% - + Uwydatnienie ostrości Jeśli ta opcja jest włączona, na ostrych krawędziach (konturach) zostaną pokazane podświetlenia. Jest to przydatne przede wszystkim przy ręcznym ustawianiu ostrości i może pomóc w określeniu, które obszary obrazu są ostre.\n%s Wyłączono @@ -972,13 +972,4 @@ Nie usuwaj danych EXIF urządzenia Usuń dane EXIF urządzenia Usuń z wyjątkiem daty/godziny - - Wersja kompilacji - Kamera jest rozwidlona z OpenCamera - Autor - Kod źródłowy - Licencja - Informacje o kamerze - Warunki usługi - diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 3e094ae67..e19e83293 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -329,17 +329,17 @@ Interface para canhoto Interface para destro - - Desligado - Somente esconder as teclas virtuais de navegação - Esconder IGU - Esconder tudo - + About Versão de compilação - A câmera é bifurcada no OpenCamera + A câmera é bifurcada no Camera Autor Código fonte Licença Informações da câmera Termos de serviço + + Desligado + Somente esconder as teclas virtuais de navegação + Esconder IGU + Esconder tudo diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index a2f52303d..98b5753d0 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -217,7 +217,7 @@ Fonte de áudio O microfone usado na gravação de áudio\n%s Canais de áudio - Especificar mono ou estéreo para a gravação de áudio (estéreo apenas é suportado em alguns dispositivos)\n%s + Especificar mono ou estéreo para a gravação de áudio (estéreo apenas é suportado em alguns dispositivos) Flash durante a gravação de vídeo Se ativado, o flash será ligado/desligado durante a gravação de vídeo (pode ser usado para verificar à distância se câmara ainda está a gravar) @@ -418,6 +418,14 @@ Texto sombreado Texto simples + About + Versão de compilação + A câmera é bifurcada no Camera + Autor + Código fonte + Licença + Informações da câmera + Termos de serviço Desligado Apenas ocultar os botões de navegação virtuais @@ -428,11 +436,4 @@ Ruído alto Comando de voz: \"cheese\" - Versão de compilação - A câmera é bifurcada no OpenCamera - Autor - Código fonte - Licença - Informações da câmera - Termos de serviço diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-ro/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 19058ed3a..2a34b4b92 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,15 +1,12 @@ - - Camera + Камера Настройки Настройки всплывающих окон - Ок (Это сообщение больше не появится) - - Вкл - Выкл - - Выберите папку для сохранения: + Ок (Это сообщение больше не появится.) + Включено + Выключено + Выберите папку сохранения: Очистить историю папки Очистить историю папки? Выбрать другую папку @@ -39,7 +36,7 @@ Не удалось сохранить видеофайл Не удалось записать видео Запись видео - К сожалению + Извините Не удалось сохранить фото Не удалось сохранить фото RAW Не удалось стабилизировать @@ -57,10 +54,9 @@ Цветовой эффект Сцена Баланс белого - Угол Направление - Не удалось открыть камеру + Не удалось открыть камеру. Камера может быть использована другим приложением? ISO @@ -68,10 +64,8 @@ Память [Заблокировано: Проведите по экрану, чтобы разблокировать] - Не удалось добавить отметку м - Эффекты Автостабилизация Изображение будет стабилизироваться. Не рекомендуется на слабых устройствах @@ -89,7 +83,6 @@ Игнорирование системной ориентации экрана устройства\n%s Распознавание лиц Распознавание лиц в объективе для фокусировки - Управление Таймер Звук таймера @@ -100,7 +93,7 @@ Интервал в пакетном режиме Дополнительные настройки… Касание для съемки - Делать снимок по одинарному или двойному касанию области просмотра + Сделать снимок или записать видео по одинарному или двойному касанию области просмотра Пауза после съёмки Пауза после снятия фото, с возможностью поделиться или удалить фотографию Звук затвора @@ -112,7 +105,8 @@ Чувствительность уровня шума для управления звуком (опция \"громкий шум\") Папка сохранения Имя папки для сохранения фото и видео (также может быть полный путь) - Использовать Storage Access Framework для сохранения фото и видео + Использовать Storage Access Framework + Использовать Storage Access Framework для сохранения фото и видео. Эта опция должна быть включена, чтобы разрешить сохранение на внешние SD-карты. На Android 10+ эта опция должна быть включена, если вы хотите сохранять в папке вне DCIM. Префикс для фото Префикс имен файлов для сохраняемых фото Префикс для видео @@ -126,7 +120,7 @@ При записи видео графический интерфейс будет заблокирован для предотвращения случайной остановки записи. Проведите по экрану, чтобы разблокировать. Обратите внимание, что запись видео остановится, если приложение перейдет в фоновый режим или погаснет экран. Поворот предпросмотра Возможность поворота предпросмотра (не повлияет на фото/видео)\n%s - Настройки интерфейса… + Экранный интерфейс… Размер предпросмотра Расположение интерфейса Режим погружения @@ -153,10 +147,11 @@ Показать батарею Отображение текущего уровня заряда батареи Показать сетку - Сетка + Сетка + Руководство по обрезке Отображение прямоугольника, показывающего соотношение сторон - полезно, если вы планируете обрезать фото/видео. Требуется режим фотосъемки WYSIWYG или режим видео\n%s - Всплывающие сообщения + Показывать всплывающие сообщения Показывать всплывающие уведомления при работе Показать анимацию эскиза Отображение анимации перемещения эскиза при съемке фотографии @@ -166,7 +161,6 @@ Если включено, экран не будет выключаться, пока Camera открыта Максимальная яркость Включение максимальной яркости во время съемки - Качество фото и видео Настройки фото… Настройки видео… @@ -198,9 +192,9 @@ Сохранять фото в фоновом потоке (для ускорения работы) Разрешение видео Качество видео 4K UHD (экспериментально) - При выборе разрешения (3840х2160) для записи через заднюю камеру она будет работать только, если ваше устройство поддерживает данный формат! - Включить стабилизацию видео - Стабилизация видео уменьшает тряску в связи с движением камеры + При выборе разрешения (3840х2160) для записи через заднюю камеру она будет работать только, если ваше устройство поддерживает данный формат. + Включить цифровую стабилизацию видео + Стабилизация видео уменьшает тряску в связи с движением камеры как при предварительном просмотре, так и в записанных видео. Это может быть ненужным, если ваше устройство поддерживает оптическую стабилизацию изображения (OIS). Битрейт видео (примерно) Выбор битрейта видео. (чем выше, тем лучше качество, но файл будет занимать больше места на диске. Неподдерживаемый битрейт может стать причиной ошибки при записи видео).\n%s Частота кадров видео (примерно) @@ -216,15 +210,15 @@ Запись звука Запись звука при записи видео Источник звука - Микрофон для записи звука\n%s + Микрофон для записи звука. Обратите внимание, что точное поведение опций зависит от того, как они реализованы на вашем устройстве. +\n%s Число каналов - Настройка моно или стереозвука (стерео доступно не на всех устройствах)\n%s + Настройка моно или стереозвука (стерео доступно не на всех устройствах) Вспышка во время записи видео Если включено, вспышка будет включаться/выключаться при записи видео (можно использовать, чтобы выполнить запись на расстоянии) - Разное Помощь в Интернете - Открыть веб-сайт Camera в вашем браузере + Запустить веб-сайт Camera в вашем браузере Пожертвовать Если вам нравится это приложение, киньте мне копейку. Вы можете сделать это, купив мое приложение. Спасибо! Использовать Camera2 API @@ -234,11 +228,9 @@ Сброс настроек Сброс всех настроек Camera на стандартные значения Сбросить все настройки Camera на стандартные значения? - Доступно Недоступно Копировать в буфер - Сделать фото Галерея Экспозиция @@ -250,8 +242,7 @@ Переключиться в режим видео Переключиться в режим фото Удалить последний снимок - Поделиться - + Поделиться фото Родительская папка Новая папка Невозможно записать в эту папку @@ -259,38 +250,37 @@ Введите имя новой папки Не удалось создать папку Папка уже существует - Выберите место для сохранения Storage Access Framework отменен Не удалось сохранить в эту папку - Разрешение на доступ к микрофону отсутствует Разрешение на доступ к файлам отсутствует - Начать запись видео Остановить запись видео - Максимальный размер файла - Мб - Гб - + Мб + + Гб + Включить управление звуком Выключить управление звуком Скажите \"cheese\" Создайте громкий шум - Автоматическая стабилизация будет поворачивать фотографии для их выравнивания.\n\nВажно: разрешение полученных фото слегка уменьшится из-за поворота и обрезки. - Файлы DNG содержат несжатую и необработанную информацию с вашей камеры.\n\nБольшинство программ для просмотра изображений не поддерживают DNG. Их нужно открывать специальными программами.\n\nВажно: различные опции наподобие "Штамп на фото" или "Автоматическая стабилизация" работают только для изображений формата JPEG, а не DNG.\n\nФайлы DNG имеют большой объем. Для их копирования или удаления может быть полезен файловый менеджер.\n\nФайлы DNG сохраняются только в режиме фото "Стандарт". + Файлы DNG содержат несжатую и необработанную информацию с вашей камеры. +\n +\nБольшинство программ для просмотра изображений не поддерживают DNG. Их нужно открывать специальными программами. +\n +\nВажно: различные опции наподобие Штамп на фото или Автоматическая стабилизация работают только для изображений формата JPEG, а не DNG. Файлы DNG имеют большой объем. Для их копирования или удаления может быть полезен файловый менеджер. Файлы DNG сохраняются только в режиме фото Стандарт. Режим HDR полезен для фото с большой разницей яркости. В нем делается несколько фото с различной экспозицией, которые объединяются в окончательное фото.\n\nВажно: HDR не рекомендуется для съемки кадров с быстрым движением, это может привести к менее корректной цветопередаче.\n\nСъемка фото в режиме HDR будет гораздо медленнее, чем в обычном режиме. - Больше не показывать - Режим фото - Std + Стд + Стандартный HDR - Expo {} + Экспо {} Брекетинг экспозиции Серийная съемка NR @@ -298,70 +288,57 @@ Штамп на фото Сохранять все изображения в режиме HDR Если эта опция включена, то в режиме HDR вместе с окончательным фото HDR будут сохранены три основных фото экспозиции. Важно: сохранение фото будет медленнее, особенно при включенных опциях наподобие "Штамп на фото" или "Автоматическая стабилизация". - - РАЗРЕШЕНИЯ НЕДОСТУПНЫ + РАЗРЕШЕНИЯ НЕ ДОСТУПНЫ Требуется разрешение Требуется разрешение на доступ к камере для ее включения - Требуется разрешение на определение местоположения для геотеггинга (хранение информации о местоположении - внутри фото и видео). Разрешение на определение местоположения также требуется для подключения к устройствам удаленного управления по Bluetooth LE (Android 11 or earlier). - + Требуется разрешение на определение местоположения для геотеггинга (хранение информации о местоположении внутри фото и видео, включая опции штампа и субтитров). Разрешение на определение местоположения также требуется (по крайней мере, для Android 11 и более ранних версий) для подключения к устройствам удаленного управления по Bluetooth LE. Настройки отладки Настройки отладки Использовать альтернативный способ вспышки Включите, если у вашего устройства проблемы со вспышкой в Camera2 API - Брекетинг экспозиции Количество изображений для режима брекетинга экспозиции\n%s Остановки брекетинга экспозиции Число остановок для каждого изображения\n%s - Снижение шума: оригинальные изображения Сохранение оригинальных изображений в режиме снижения шума. Важно: сохранение фото может замедлиться.\n%s - Не сохранять оригинальные изображения Сохранять одно оригинальное изображение Сохранять все оригинальные изображения (медленно) - - сек - + сек + Недостаточно свободного места для записи видео Запись видео остановлена\nКритически низкий уровень заряда батареи Проверка критического состояния батареи Остановить запись видео, если уровень заряда батареи критически низок. Это поможет уменьшить риск повреждения видео при внезапном выключении устройства из-за нехватки заряда батареи. - - Темный - Светлый + Темный + + Светлый + Выдержка - Серьезная ошибка камеры - Включить быструю съемку в режиме HDR/экспозиции Позволяет быстрее захватывать снимки в режиме HDR/экспозиции. Отключите, если у вашего устройства проблемы с фотосъемкой в режиме HDR или экспозиции (прекращение работы камеры или неправильный порядок экспозиции фотографий). - Камера Записать видео Селфи - Зеркалить фронтальную камеру Отражать изображения зеркально при использовании фронтальной камеры\n%s - Калибровать уровень угла - Эта настройка калибрует акселерометр вашего устройства для корректной работы автоматической стабилизации и настроек наэкранного уровня/угла. + Эта настройка калибрует акселерометр вашего устройства для корректной работы автоматической стабилизации и настроек наэкранного уровня/угла Поместите ваше устройство на ровную горизонтальную поверхность для установки уровня (в портретной или ландшафтной ориентации), затем выберите "Откалибровать".\n\nНажмите "Сбросить" для удаления калибровки с вашего устройства.\n\nНажмите "Назад" для отмены. Откалибровать Сбросить Уровень откалиброван Сброс уровня калибровки - DRO - Отображать делительные линии Отображать горизонтальные делительные линии на экране Отображать линии направления компаса Отображать линии направления компаса на экране Субтитры видео - Создавать файл субтитров (.SRT) с датой и временем записи, а также информацией GPS при включенных данных геолокации/направления\n%s - + Создавать файл субтитров (.SRT) с датой и временем записи, а также информацией GPS при включенных данных геолокации/направления. На Android 11+ эта опция требует включения функции More camera controls/Storage Access Framework). +\n%s Без ограничений 3 секунды 5 секунд @@ -386,20 +363,15 @@ 30 минут 45 минут 1 час - - Показать кнопку съёмки + Показать кнопку съемки Отображение кнопки фото- и видеосъемки. Полезно, если на вашем устройстве уже есть аппаратная кнопка спуска затвора. - Запись видео приостановлена Запись видео продолжена Приостановить запись видео Приостановить запись видео - Захват… - Не удалось инициализировать прослушивание аудио Не удалось создать изображение в режиме HDR - Автоматически Облачно Светлый день @@ -409,7 +381,6 @@ Сумерки Тепло Вручную - Движение Штрих-код Пляж @@ -426,7 +397,6 @@ Устойчивая камера Закат Театр - Аква Черная доска Моно @@ -436,10 +406,8 @@ Сепия Соляризация Белая доска - Что нового: Пожертвовать - лицо лица @@ -448,29 +416,23 @@ в верхней части экрана в нижней части экрана в центре - - Высокая скорость - + Высокая скорость + По умолчанию - Пользовательские теги EXIF Автор Текст для хранения в метаданных изображения под меткой "автор" (только в формате JPEG). (Оставьте пустым при отсутствии.) Авторское право Текст для хранения в метаданных изображения под меткой "авторское право" (только в формате JPEG). (Оставьте пустым при отсутствии.) - Обработка… - Нет Стандартное и DNG (RAW) Только DNG (RAW) - По умолчанию гггг-мм-дд дд/мм/гггг мм/дд/гггг Нет - Количество фото 2 3 @@ -482,7 +444,6 @@ 12 15 20 - Количество фото 2 3 @@ -501,57 +462,49 @@ 100 150 200 - Скорость Нормальная Замедление движения включено Замедление движения отключено - - Вспышка Выкл + Вспышка выключена Вспышка Авто - Вспышка Вкл + Вспышка включена Фонарик Красные глаза Экранная вспышка: автоматически Экранная вспышка: включено Экранный фонарик - Антибэндинг Алгоритмы для борьбы с мерцанием света.\n%s Автоматически 50 Гц 60 Гц Выкл. - Изображение-призрак Наложение изображения поверх экрана для помощи с выравниванием.\n%s Выкл. Последнее фото Выбранное изображение - Диалог выбора файла не найден на данном устройстве, изображение-призрак не поддерживается Не удалось открыть данное изображение - Разрешать снимать фото во время записи видео Разрешает снимать фото во время записи видео. Отключите при возникновении проблем с записью видео с включенным Camera2 API. - - Плоский профиль видео (log) - Включить плоский профиль (log) для режима записи видео\n%s - Выкл. - Очень низкий - Низкий - Средний - Высокий - Очень высокий - Профиль log - + Профиль видеокартины + Установить стандартный или плоский профиль для режима записи видео +\n%s + По умолчанию + Журналирование (Очень низкое) + Журналирование (Низкое) + Журналирование (Среднее) + Журналирование (Высокое) + Журналирование (Очень высокое) + Профиль журнала Микрофон видеокамеры Внешний микрофон (если есть) По умолчанию Оптимизировано для голоса Оптимизировано для распознавания голоса Без обработки - По умолчанию 100 kbps 200 kbps @@ -578,43 +531,34 @@ 100 Mbps 150 Mbps 200 Mbps - - no burst - + Без ускорения + Показывать измеритель уровня звука Показывать измеритель уровня звука на экране при записи видео - - Фокус {} + Фокус {} + Фокус-брэкетинг - Исходное расстояние фокус-брэкетинга Целевое расстояние фокус-брэкетинга - Добавить бесконечное расстояние - Направление компаса Необходимо откалибровать компас вашего устройства для улучшения точности. Это можно сделать, нарисовав устройством в воздухе цифру 8.\n\nТекущая точность: - Невозможно определить Низкая Средняя Высокая Неизвестно - Единицы расстояния В них измеряется высота по GPS для штампов на фото и субтитров к видео\n%s Метры Футы - фт - + фт + Показывает диалог Что нового Показывает информацию о новых возможностях и улучшениях при обновлении приложения - Алгоритм режима краев Алгоритм, используемый драйвером камеры для улучшения краев. Улучшение краев увеличивает резкость и детализацию фото. (Данная настройка игнорируется в режиме снижения шума.)\n%s - Настройки обработки… - Алгоритм снижения шума Алгоритм, используемый драйвером камеры для снижения шума. Алгоритм снижения шума пытается улучшить качество изображения путем удаления сильного шума, появляющегося в процессе захвате, особенно в темных условиях. (Важно: данная настройка не относится к режиму снижения шума на фото и фактически игнорируется в этом режиме.)\n%s По умолчанию @@ -622,18 +566,16 @@ Минимальный Быстрый Высокое качество - Помощь при фокусировке Масштабировать при изменении фокусного расстояния вручную\n%s Выкл. 2x 4x - Увеличивать или уменьшать экспокоррекцию - - Предыдущий - Следующий - + Предыдущий + + Вперёд + Выкл 2x 3x @@ -647,8 +589,8 @@ 100x 200x 500x - Навсегда - + Навсегда + Без задержки 0.5 секунды 1 секунда @@ -667,7 +609,6 @@ 30 минут 1 час 2 часа - По умолчанию (зависит от устройства) 100 Мб 200 Мб @@ -677,9 +618,7 @@ 2 Гб 5 Гб 9 Гб - Фокус-брэкетинг отменен - Нет 1 (1:1) 1.25 (5:4) @@ -692,7 +631,6 @@ 2.33 (21:9) 2.35 (47:20) 2.4 (12:5) - +3 (высокая чувствительность) +2 +1 @@ -700,114 +638,98 @@ -1 -2 -3 (низкая чувствительность) - Улучшение контрастности HDR Использовать алгоритм улучшения контрастности для HDR. Может улучшить качество при очень высоком динамическом диапазоне в кадре, в результате чего изображение становится "похожим на HDR".\n%s Выкл. Умный Всегда - Формат видео - Кодеки и формат видео- и аудиофайлов\n%s - + Кодеки и формат видео-и аудиофайлов\n%s По умолчанию MPEG4 H264 MPEG4 HEVC 3GPP WebM (аудио не поддерживается) - Управление настройками - Сохранить настройки - Сохраняет все настройки Camera в файл + Сохраняет все настройки Камеры в файл Имя сохраненных настроек - Восстановить настройки Восстанавливает ранее сохраненные настройки. Все текущие настройки будут перезаписаны сохраненными! Позволяет выбрать ранее сохраненный файл настроек. Будьте осторожны: при выборе файла все текущие настройки будут перезаписаны! - Сохраненные настройки Не удалось сохранить настройки Не удалось восстановить настройки Диалог выбора файла не найден на данном устройстве, настройка не поддерживается - Формат изображения JPEG WebP PNG - - Режим NR + Режим снижения шума Нормальный Низкий уровень освещенности - Интерфейс для левши Интерфейс для правши Ярлыки в верхней части экрана (портретный режим) - Показывать ярлык распознавания лиц Показывать на экране ярлык для включения или отключения распознавания лиц - Включить распознавание лиц - Отключить распознавание лиц + Включить распознавание лиц + + Отключить распознавание лиц + Распознавание лиц включено Распознавание лиц отключено - Показывать ярлык автоматического выравнивания Показывать на экране ярлык для включения или отключения автоматического выравнивания. При включенном автоматическом выравнивании фотографии будут поворачиваться в соответствии с линией горизонта. - Включить автоматическое выравнивание - Отключить автоматическое выравнивание - + Включить автоматическое выравнивание + + Отключить автоматическое выравнивание + Показывать ярлык для штампа на фото Показывать на экране ярлык для включения или отключения штампа на фото - Включить штамп на фото - Отключить штамп на фото + Включить штамп на фото + + Отключить штамп на фото + Штамп на фото включен Штамп на фото отключен - Показывать ярлык для пользовательского текстового штампа на фото Показывать на экране ярлык ввода пользовательского текста для штампа на фото - Показывать ярлык для блокировки автоматического баланса белого Показывать на экране ярлык для блокировки или разблокировки автоматического баланса белого Заблокировать баланс белого Разблокировать баланс белого Баланс белого заблокирован Баланс белого разблокирован - Показывать ярлык для блокировки автоматической экспозиции Показывать на экране ярлык для блокировки или разблокировки экспозиции Разблокировать экспозицию - Режим низкого уровня освещенности: пожалуйста, держите камеру в устойчивом положении - - Pano + Pano + Панорама - Удаленное управление по Bluetooth LE… Включить удаленное управление по Bluetooth LE Включить устройства удаленного управления по Bluetooth LE (BLE) Тип удаленного устройства - BLE не поддерживается Сканирование устройств по BLE Bluetooth не поддерживается. Неизвестное устройство Выключать экран при отключении удаленного управления - Подсказка: установите яркость по умолчанию на минимальный уровень перед запуском Camera. + Подсказка: установите яркость по умолчанию на минимальный уровень перед запуском Камеры. Использовать Saltwater для более точных вычислений При размещении под водой улучшает точность, если выбран правильный тип воды. Удаленное устройство подключено - Использовать адреса По возможности показывать адреса вместе с GPS-координатами Предпочитать адреса GPS-координатам Не показывать адреса - Показывать ярлык сохранения данных о местоположении Показывать на экране ярлык для включения или отключения данных о местоположении (геотеггинг) Сохранять данные о местоположении Прекратить сохранять данные о местоположении - Показывать гистограмму Показывать на экране гистограмму цветов\n%s Выкл. @@ -816,104 +738,88 @@ Значение (максимум) Интенсивность (средняя) Освещенность (средняя мин.-макс.) - Показывать полосы зебры Если данная настройка включена, на экране будут появляться полосы зебры при чрезмерной экспозиции.\n%s Выкл. - 70% - 80% - 90% - 93% - 95% - 97% - 98% - 99% - 100% - + 70% + + 80% + + 90% + + 93% + + 95% + + 97% + + 98% + + 99% + + 100% + Снижение фокусировки Если данная настройка включена, грани (контуры) фокуса будут освещены. В основном это применяется для ручной фокусировки, также его можно использовать для определения зон изображения находящихся в фокусе.\n%s Выкл. Вкл. Цвет снижения фокуса Данный цвет будет использоваться для подсветки контуров фокуса\n%s - - Осталось - + Осталось + Предпросмотр камеры… - Переключать вспышку Показывать ярлык вспышки - Показывать на экране ярлык для задания цикла вспышки вместо отображения настроек вспышки во всплывающем меню - + Показывать на экране ярлык для задания цикла вспышки вместо отображения настроек вспышки во всплывающем меню. Обратите внимание, что вспышка недоступна при использовании этого значка. Разрешать RAW для брэкетинга экспозиции Настройка также предназначена для применения RAW для режима брэкетинга экспозиции фото (или для режима HDR, когда включена настройка \"Сохранять все изображения для режима HDR\"). Если данная настройка отключена, в данных режимах фото будут сохранены только в формате JPEG. - Разрешать RAW для фокус-брэкетинга Настройка также предназначена для применения RAW для режима фокус-брэкетинга фото. Если данная настройка отключена, в режиме фокус-брэкетинга фото будут сохранены только в формате JPEG. - Переключать режимы RAW Показывать ярлык RAW Показывать на экране ярлык для переключения режимов RAW - Текущее удаленное устройство: Сканировать - Текст с тенью Обычный текст Текст с тенью фона - Сохранение изображений… - Закончить панораму Отменить панораму Панорама отменена Не удалось создать панораму - Автоматическая обрезка панорамы Удалять волнистые края в режиме панорамы\n%s - Чтобы снять панораму, удерживайте ваше устройство в портретной ориентации и нажмите на кнопку снятия фото для начала формирования панорамы. Затем поворачивайте устройство влево или вправо, сдвигая белый круг в центре на синюю точку. После захвата нового изображения продолжайте поворачивать устройство, чтобы захватить следующую синюю точку.\n\nНажмите на галочку, чтобы сохранить панораму, или крестик, чтобы отменить ее.\n\nВажно: обработка и сохранение фото панорамы могут занять некоторое время. - Оригинальные изображения панорамы Сохранять оригинальные изображения в режиме панорамы. Важно: фото панорам будут сохраняться медленнее. Также позволяет сохранять файл XML, который может быть полезен при сообщении об ошибках с панорамами.\n%s - Не сохранять оригинальные изображения Сохранять оригинальные изображения Сохранять оригинальные изображения и файл XML для отладки - - ID - + ID + Шкала для изменения компенсации экспозиции - - Выберите формат файла для сохранения фото. Это влияет на \"обычные\" (не RAW) фото. Важно: формат PNG не является настоящим форматом "без потерь", вместо этого он конвертируется из JPEG со 100%% качеством.\n%s - + Выберите формат файла для сохранения фото. Это влияет на \"обычные\" (не RAW) фото. Только JPEG поддерживает сохранение метаданных Exif. Важно: формат PNG не является настоящим форматом без потерь, вместо этого он конвертируется из JPEG со 100%% качеством. +\n%s Camera API Выберите Camera2 API, чтобы включить дополнительные возможности, например ручные режимы экспозиции, фокус, баланс белого, вместе с форматом RAW (если поддерживается устройством). При изменении API потребуется перезапуск.\n%s Оригинальный API камеры Camera2 API - - Снимать фото/видео при обнаружении шума. + Снимать фото/видео при обнаружении шума или по голосовой команде. Если включено, используйте экранную кнопку микрофона для запуска/остановки слушания. \n%s - По возможности использовать адрес при штамповании геолокации по GPS. Если включено ваше устройство будет передавать данные геолокации сторонним лицам для преобразования GPS в адрес (developer.android.com/reference/android/location/Geocoder). Не дает никаких гарантий доступности или точности. Результаты приблизительные. \n%s - Коснитесь для фокуса и нажмите синюю кнопку камеры, чтобы сделать фото. - \n\nДля отключения максимальной яркости экрана перейдите в Настройки/Настройки интерфейса…/\"Максимальная яркость\". - Для сохранения на SD-карту на Android 5+ перейдите в Настройки/Дополнительные настройки…/\"Storage Access Framework\". - Для получения подробностей нажмите \"Помощь в Интернете\" в меню Настройки. - - +\n +\nДля отключения максимальной яркости экрана перейдите в Настройки/Экранный интерфейс…/\"Максимальная яркость\". Для сохранения на SD-карту на Android 5+ перейдите в Настройки/Дополнительные настройки…/\"Storage Access Framework\". Для получения подробностей нажмите \"Помощь в Интернете\" в меню Настройки. Выбрать удаленное устройство - REC709 sRGB Гамма - Значение гаммы видео Значение гаммы для видео при заданном профиле \"Гамма\"\n%s 1.6 @@ -926,61 +832,88 @@ 2.4 2.6 2.8 - Выключить Только приглушить кнопки навигации Скрыть кнопки навигации Скрыть интерфейс Скрыть все - Непрозрачность призрачного изображения Значение альфа для призрачных изображений. Чем ниже значение, тем более прозрачным будет изображение, чем выше - тем более непрозрачным.\n%s - Цвет полос зебры на переднем плане Цвет на переднем плане при отображении полос зебры.\n%s Цвет полос зебры на заднем плане Цвет на заднем плане при отображении полос зебры.\n%s - Черный Красный Оранжевый Прозрачный Белый - Внешняя камера Ультраширокая камера - Переключиться на внешнюю камеру Переключить камеру Переключаться между несколькими камерами Значок нескольких камер Если включено, использовать отдельные кнопки для переключения между фронтальной/задней камерами и между несколькими фронтальными/задними камерами. Если отключено, значок \"Переключить камеру\" будет циклически переключать все камеры. - Показать ID камеры Показывать номер ID текущей камеры на экране - Разрешать действия при долгом нажатии При возможности разрешать действия при долгом нажатии (например, долгое нажатие на галерею для изменения пути сохранения). - Апертура - 4K UHD Битрейт Частота кадров Замедление времени - Сохранять связанную систему координат Сохранять связанную систему координат устройства в EXIF фото в комментарии пользователя (только для формата JPEG) - Нет Громкий шум - Голосовая команда: \"cheese\" - - Версия сборки - Камера разветвлена от OpenCamera - автор + Голосовая команда: \"cheese\" + + Камера использует набор иконок из Material Design от Google (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , https://google.github.io/material-design-icons/) под лицензией Apache версии 2.0. Некоторые значки включают модификации. Нажмите здесь для получения полного текста лицензии. + Значки Google Material Design + Камера © 2013-2023 Марк Харман, выпущена под лицензией GPL v3 или более поздней. Нажмите здесь для получения полного текста лицензии. + Камера + Open Source лицензии + Расширение: Украшательства / Ретушь лица + X-Укрошательства + Расширение: Боке + X-Боке + Расширение: Ночь + X-Ночь + Расширение: HDR + X-HDR + Расширение: Auto + X-Auto + Неизвестное устройство (разрешение на подключение Bluetooth недоступно) + Разрешения на сканирование/подключение Bluetooth необходимы для обнаружения и подключения к устройствам дистанционного управления работающим по Bluetooth LE. + Попробуйте включить эту опцию, если у вашего устройства возникают проблемы при съемке фотографий в режимах HDR или Expo-фото (если Expo-изображения получаются с одинаковой экспозицией). Актуально только в том случае, если также включена опция быстрого HDR/Expo ниже. + Включить фиктивный захват HDR/expo fix + Панель поиска для изменения текущего значения предпочтения + Доступ к микрофону требуется для записи видео со звуком, а также для использования опций \"Управление звуком\" + Для сохранения результирующих файлов, таких как фотографии или видео, требуется разрешение на чтение/запись из хранилища + ОБЪЕКТИВ + Пропустить + Вперёд + Назад + Условия предоставления услуг + Информация о приложении Камера + Лицензия Исходный код - лицензия - Информация о камере - Условия обслуживания - + Авторы + Камера является форком Camera + Версия сборки + Для получения более качественных снимков держите камеру ровно. + Наложение тонов в HDR + Алгоритм, используемый для тонового отображения в режиме HDR-фотографии +\n%s + Простое крепление + Экспоненциальный + По умолчанию + Удалять ли метаданные EXIF устройства с фотографий JPEG. Этот параметр не удаляет теги exif, применяемые другими настройками, которые применяют метаданные EXIF (например, местоположение/геотегирование). Эти другие параметры являются независимыми и отменяют данную настройку. RAW/DNG и видео не затрагиваются. +\n%s + Не удалять EXIF-данные устройства + Удалить EXIF-данные устройства + Удалить EXIF-данные устройства + Удалить все, кроме даты/времени + \ No newline at end of file diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 5b0807190..408f8503d 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -218,7 +218,7 @@ Vir zvoka Kateri mikrofon naj se uporabi za snemanje zvoka. Upoštevajte, da je podrobno vedenje te možnosti odvisno od načina vdelave te možnosti v napravo.\n%s Zvočni kanali - Določite mono ali stereo za snemanje zvoka (stereo je podprt samo na nekaterih napravah)\n%s + Določite mono ali stereo za snemanje zvoka (stereo je podprt samo na nekaterih napravah) Svetilka med snemanjem videoposnetkov Če je omogočeno, se bo ob snemanju videoposnetkov vklopila/izklopila svetilka (se lahko uporabi za prepoznavanje delovanja kamere na razdaljo) @@ -440,7 +440,7 @@ Novosti: Daruj - + obraz obrazi @@ -449,11 +449,11 @@ na zgornji strani zaslona na spodnji strani zaslona na sredini - + Visoka hitrost Privzeta - + Oznake EXIF po meri Avtor Besedilo, ki se shrani med metapodatke slike v oznako "Avtor" (samo oblika JPEG) @@ -471,7 +471,7 @@ dd.mm.yyyy mm/dd/yyyy Brez - + Št. fotografij 2 3 @@ -516,7 +516,7 @@ Sam. zaslonska bliskavica Zaslonska bliskavica je vklopljena Zaslonska svetilka - + Odstranjevanje pasov Algoritmi za pomoč pri utripanju svetlobe.\n%s Samodejno @@ -579,7 +579,7 @@ 100 Mb/s 150Mbps 200Mbps - + brez taporedja Prikaži merilnik ravni zvoka @@ -678,7 +678,7 @@ 2 GB 5 GB 9 GB - + Stopnjevanje globine ostrenja je preklicano. Brez @@ -701,7 +701,7 @@ -1 -2 -3 (nizka občutljivost) - + Izboljšava kontrasta HDR Kdaj naj se uporabi algoritem za izboljšavo kontrasta v načinu HDR. To lahko izboljša videz v primerih zelo visokega dinamičnega razpona prizora in rezultatom doda "HDR-videz".\n%s Izk. @@ -745,7 +745,7 @@ Up. vmesnik za levičarje Up. vmesnik za desničarje Ikone na vrhu (pokončno) - + Prikaži ikono za zaznavane obrazov Ali naj se na zaslonu prikaže ikona za omogočanje/onemogočanje zaznavanja obrazov Omogoči zaznavanje obrazov @@ -862,10 +862,18 @@ Osenčeno besedilo Golo besedilo + About + Različica za izdelavo + Kamera je vilica Camera + Avtor + Izvorna koda + Licenca + Podatki o fotoaparatu + Pogoji storitve Besedilo z osenčenim ozadjem - + Shranjevanje slik … - + Dokončaj panoramo Prekliči panoramo Panorama je preklicana. @@ -934,7 +942,7 @@ Skrij samo zaslonske navidezne gumbe za krmarjenje Skrij gr. up. vmsnik Skrij vse - + Prosojnost prekrivne slike Vrednost alfa pri uporabi prekrivne slike. Nižja vrednost pomeni večjo prosojnost.\n%s @@ -980,11 +988,4 @@ Glasen zvok Glasovni ukaz: \"cheese\" - Različica za izdelavo - Kamera je vilica OpenCamera - Avtor - Izvorna koda - Licenca - Podatki o fotoaparatu - Pogoji storitve diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml new file mode 100644 index 000000000..84d439c4f --- /dev/null +++ b/app/src/main/res/values-sv/strings.xml @@ -0,0 +1,960 @@ + + + Kamera + Källkod + Inställningar + FPS + Fokuseringsavstånd + Oändlig + Främre kamera + Upprepa + Prefixet som ska användas för fotofilnamn när de sparas + Tala nedräkningen för självutlösare eller vid fördröjning av upprepningsläge (från 60 sekunder) + Intervall för upprepningsläge + Fler kamerakontroller … + Ta ett foto eller spela in video genom att trycka eller dubbeltrycka på förhandsgranskningen + Pausa efter att ha tagit ett foto + Pausa skärmen efter att ha tagit ett foto, med möjlighet att dela eller radera fotot + Slutarljud + Spela upp ett ljud när du tar ett foto + Volymknappar + Alternativ för ljudkontroll + Ljudkontrollens känslighet + Sparningsplats + Mapp för att spara foto-/videofiler i + Spara videoprefix + Prefixet som ska användas för videofilnamn när de sparas + Kameraeffekter + Applicera en färgeffekt + Applicerar vald färgeffekt på fotot + Applicera ett scenläge + Optimera fotot för olika scener + Ställ in vitbalansen + Välj en inställning för att justera vitbalansen + Ställ in ISO + Ett högre värde betyder ökad ljuskänslighet (kanske inte fungerar på vissa enheter) + Ställ in exponeringskompensationen + Lås orientering för foto och video + Ansiktsdetektering + Använd ansiktsdetektering istället för fokusområden + Kamerakontroller + Självutlösare + Självutlösarljud + Pip när självutlösaren räknar ner eller vid fördröjning i upprepningsläge + Röstnedräkning för självutlösare + Spara fotoprefix + Tidsformat för filnamn + Visa kameran när enheten är låst + Visa meddelanden på skärmen + Av + Välj lagringsplats: + Rensa mapphistorik + Vill du rensa mapphistoriken\? + Välj en annan mapp + Ändrade sparningsplats till: + Slutade spela in video + Misslyckades att återansluta till kameran + Fel, videofilen kan vara skadad + stöds inte på din enhet + Okänt fel, videon stoppades + Servern dog, videon stoppades + Videon uppnådde maximal varaktighet + Videon uppnådde maximal filstorlek + Exponeringskompensation + Bakre kamera + Foto + Video + Exponering låst + Exponering olåst + Avbröt timer + Avbröt upprepningsläge + Startade timer + Misslyckades att spara videofil + Misslyckades att spela in video + Startade videoinspelning + Tyvärr + Misslyckades att spara foto + Misslyckades att spara RAW-foto + Misslyckades att starta kamerans förhandsgranskning + Tar foto + Misslyckades att ta bild + GPS-position är inte tillgänglig + Foto raderat + Ingen galleriapp tillgänglig + Skärmen är låst +\nsvep skärmen för att låsa upp + Olåst + Ljud inaktiverat + Maximal varaktighet + Färgeffekt + Scenläge + Vitbalans + Vinkel + Riktning + MISSLYCKADES ATT ÖPPNA KAMERAN. + KAMERAN KANSKE ANVÄNDS + AV EN ANNAN APPLIKATION\? + ISO + Zoom + Ledig + [LÅST: + Svep för att låsa upp] + Misslyckades att stämpla information till foto + m + Popup-inställningar + OK (Det här meddelandet visas inte igen) + + Om den är aktiverad visas Kamera fortfarande ovanför alla låskärmar (du måste fortfarande låsa upp för att komma åt Inställningar, Galleri etc.) + Utför autofokus vid start + Lås skärm när video spelas in + När video spelas in kommer användargränssnittet låsas för att förhindra att inspelningen stoppas av misstag. Svep på skärmen för att låsa upp. Observera att videoinspelningen alltid stoppas om appen körs i bakgrunden eller om skärmen släcks. + Rotera förhandsvisning + Användargränssnitt på skärm … + Storlek på förhandsgranskning + Placering av användargränssnitt + Uppslukande läge + Visa zoom + Visa kamerans aktuella zoomnivå på skärmen (vid inzoomning) + Visa -/+ zoomkontroller + Visa knapparna -/+ för zoomkontroll + Visa zoomreglage + Visa reglaget för zoomkontroll + Visa ISO + Visa aktuell ISO-nivå. (Kräver Camera2 API.) + Visa ledigt minne + Visa vinkel + Visa vinkellinje + Markeringsfärg för vinkel/höjd + Visa kompassriktning + Visa tid + Visa batteri + Visa rutnät + Rutnät + Visa beskärningsguide + Om du vill autofokusera när kameran startas. Om du har problem med att blixten slås på när du startar, inaktivera detta alternativ + Visa enhetens återstående lagringsutrymme på skärmen + Visa enhetens aktuella orienteringsvinkel på skärmen + Visa horisontell nivålinje + Visa markeringsfärg när kameran nästan är i nivå + Visa enhetens kompassriktning på skärmen + Visa aktuell tid på skärmen + Visa aktuell batterinivå på skärmen + Visa miniatyranimering + Visa kantlinje när du tar ett foto + Behåll skärmen på + Fotoinställningar … + Videoinställningar … + Platsinställningar … + Kamerans upplösning + Bildkvalitet + RAW + Lagra platsdata (geotaggning) + Alternativ för att rotera förhandsgranskning (påverkar inte slutresultat för foto/video) +\n%s + Om tillfälliga meddelanden ska visas på skärmen + Visa rörlig miniatyranimering när du tar ett foto + Visar en kantlinje på skärmen för att indikera att du tar ett foto + Upphovsmän + Användarvillkor + Programversion + Tvinga skärmen till maximal ljusstyrka istället för enhetens standardinställning + Ställ in bildkvalitéten för sparade JPEG- eller WebP-bilder (standardvärdet är 90%%). Har ingen effekt på PNG-bildformatet. +\n%s + Lagra GPS-position i foton/videos (för foton kan endast position lagras i formaten JPEG och DNG) + Lagra kompassriktning + Lagra GPS-ens kompassriktning i foton (endast JPEG-formatet) + Format för datumstämpel + Format för tidsstämpel + Format för GPS-stämpel + Anpassad text + Stämpla foton med en anpassad text + Typssnittsstorlek + Typssnittsstorlek som används vid stämpling av text på foton +\n%s + Typsnittsfärg + Typssnittsfärg som används vid stämpling av text på foton +\n%s + Textstil + Stil som används vid stämpling av text på foton +\n%s + Använd bakgrundstråd + Stämpla foton + Tvinga maximal ljusstyrka + Foto- och videoinställningar + Om aktiverat kommer inte skärmen att stängas av när Kameras huvudanvändargränssnitt är aktivt + Tryck för att ta bild + Ställ in till 0 för exponeringskompensationens standardvärde + Kräv platsdata + Ta endast foto/video när platsdata finns tillgängligt om platsdata är aktiverat + Videoupplösning + Tvinga 4K UHD-video (fungerar endast på vissa enheter) + Maximal längd för video + Videoinspelningen kommer stoppas efter angiven tid +\n%s + Tillgänglig + Inte tillgänglig + Kopiera till urklipp + Galleri + Exponering + Exponeringslås + Fokusläge + Blixtläge + Byt till främre kameran + Byt till bakre kameran + Byt till videoläge + Byt till fotoläge + Radera senaste bild + Dela bild + Ny mapp + Kan inte skriva till denna mapp + Kommer inte åt denna mapp + Ange namn för ny mapp + Misslyckades att skapa mapp + Mapp finns redan + Välj en plats att spara på + Kan inte spara i denna mapp + 2 minuter + 3 minuter + 4 minuter + 5 minuter + 6 minuter + 7 minuter + 8 minuter + 9 minuter + 10 minuter + 11 minuter + 12 minuter + 15 minuter + 20 minuter + 25 minuter + 30 minuter + 45 minuter + 1 timme + Ta en bild + Maximal filstorlek för video + Spela in ljud + Spela in ljud när video spelas in + Ljudkälla + Mikrofon som används vid ljudinspelning. Observera att alternativets exakta beteende beror på hur alternativet implementerats på enheten. +\n%s + Ljudkanaler + Blinka medan video spelas in + Om aktiverat kommer blixten att blinka medan video spelas in (kan användas för att avgöra om kameran spelar in på avstånd) + Diverse + Onlinehjälp + Öppna Kameras webbplats i din webbläsare + Donera för att stödja utvecklingen + Om + Återställ inställningar + Återställ alla Kamerainställningar till standardinställningar + Mikrofonbehörighet är inte tillgänglig + Platsbehörighet är inte tillgänglig + Starta videoinspelning + Stoppa videoinspelning + Maximal filstorlek + MB + GB + Starta ljuduppspelning + Stoppa ljuduppspelning + Säg \"apelsin\" + Gör ett högt ljud + Visa inte igen + Fotoläge + Standard + HDR + Exponeringsgaffling + Brusreducering + BEHÖRIGHETER INTE TILLGÄNGLIGA + Behörigheter krävs + Exponeringsgaffling + Antal bilder i läget exponeringsgaffling +\n%s + Spara inte originalbilder + Spara en originalbild + Spara alla originalbilder (långsam) + s + Inte tillräckligt med ledigt utrymme för att spela in video + Video stoppades +\nBatterinivån är kritiskt låg + Mörk + Ljus + Slutarhastighet + Allvarligt kamerafel + Kamera + Spela in video + Kalibrera + Återställ + Videoundertexter + Obegränsad + 3 sekunder + 5 sekunder + 10 sekunder + 15 sekunder + 30 sekunder + 1 minut + Vill du verkligen återställa Kameras inställningar till standardinställningar\? + upprepningar kvar + Stämpla foton med datum och tid, även med GPS-information om plats-/riktningsdata är aktiverat +\n%s + Om foton ska sparas med en bakgrundstråd (för snabbare åtgärd) + Starta om video efter maximal längd + Om videon har stoppats efter att den har nått maximal längd (om inställt) kommer detta alternativ att starta om videon upp till angivet antal gånger +\n%s + Överordnad mapp + DNG-filer innehåller hela den okomprimerade och obearbetade informationen från din kamera. +\n +\nObservera att vissa galleriappar inte kan läsa DNG-filer. DNG-filer kan användas med specialiserade fotoredigerare. +\n +\nObservera att vissa bearbetningsalternativ som Stämpla foto och auto-nivå endast appliceras på icke-DNG-bilder (JPEG/etc) och inte på DNG-filen. + Std + Exponering {} + Kamerabehörighet krävs för att kunna aktivera kameran + Brusreducering för originalbilder + Huruvida bilder ska sparas i brusreduceringsläge. Observera att detta kan göra att det går mycket långsammare att spara bilder. +\n%s + Selfie + Video pausad + Video återupptagen + Pausa videoinspelning + Återuppta videoinspelning + Misslyckades att skapa HDR-bild + Molnigt + Dagsljus + Fluorescerande + Skugga + Varm + Manuell + Streckkod + Strand + Stearinljus + Fyrverkeri + Automatiskt + Automatiskt + Blixt av + Nej + 30x + Standard och DNG (RAW) + 40x + 50x + 100x + 200x + 500x + Endast DNG (RAW) + Standard + 500 kbps + 1 Mbps + 2 Mbps + 3 Mbps + 4 Mbps + 5 Mbps + yyyy-mm-dd (ISO 8601) + dd/mm/yyyy + mm/dd/yyyy + Ingen + 6 Mbps + Antal foton + 2 + 3 + 4 + 5 + 6 + 8 + 10 + 12 + 15 + 20 + Antal foton + 2 + 3 + 4 + 7 Mbps + 8 Mbps + 9 Mbps + 5 + 6 + 8 + 10 + 12 + 15 + 20 + 25 + 30 + 40 + 50 + 100 + 150 + 200 + Hastighet + Normal + Blixt auto + Ficklampa + Röda ögon + Skärmficklampa + 50 Hz + 60 Hz + Av + Av + Senast tagna foto + Valda bilder + 10 Mbps + Kan inte öppna denna bild + Standard + Optimerad för röstsamtal + 15 Mbps + Optimerad för röstigenkänning + Obearbetad + Standard + 100 kbps + 5x + 10x + 200 kbps + 20x + Landskap + Natt + Nattporträtt + Fest + Porträtt + Snö + Sport + Solnedgång + teater + Negativ + Ingen + Vad är nytt: + Donera + ansikte + ansikten + till vänster i skärmen + till höger i skärmen + uppe i skärmen + nere i skärmen + i mitten + Standard + Anpassade EXIF-taggar + Upphovsrätt + Bearbetar … + 20 Mbps + 30 Mbps + 40 Mbps + 50 Mbps + 60 Mbps + 70 Mbps + 80 Mbps + 90 Mbps + 100 Mbps + 150 Mbps + 200 Mbps + Fokus {} + Fokusgaffling + Lägg till oändligt avstånd + Kompassriktning + Opålitlig + Låg + Medium + Hög + Okänd + Enhet för avstånd + Används för GPS-altitud till fotostämplar och videoundertexter +\n%s + Meter + Fot + ft + Visa dialogen Vad är nytt + Om information ska visas för nya funktioner och förbättringar när applikationen har uppdaterats + Bearbetningsinställningar … + Brusreduceringsalgoritm + Standard + Av + Minimal + Snabb + Hög kvalitet + Fokusassistans + Av + 2x + 4x + Öka eller minska exponeringskompensation + Föregående + Nästa + Av + 2x + 3x + 4x + Obegränsad + Ingen fördröjning + 0,5 s + 1 s + 2 s + 3 s + 5 s + 10 s + 15 s + 20 s + 30 s + 1 min + 2 min + 5 min + 10 min + 20 min + 30 min + 1 tim + 2 tim + Enhetens standardinställning + 100 MB + 200 MB + 300 MB + 500 MB + 1 GB + 2 GB + 5 GB + 9 GB + Avbryt fokusgaffling + Ingen + +3 (hög känslighet) + +2 + +1 + 0 (standard) + -1 + -2 + -3 (låg känslighet) + Av + Smart + Alltid + Videoformat + Standard + WebM (ljud stöds ej) + Inställningshanterare + Spara inställningar + Återställ inställningar + Sparade inställningar + Misslyckades att spara inställningar + Misslyckades att återställa inställningar + Bildformat + JPEG + WebP + PNG + Normal + Vänsterhänt användargränssnitt + Högerhänt användargränssnitt + Visa ikon för ansiktsigenkänning + Aktivera ansiktsigenkänning + Avaktivera ansiktsigenkänning + Ansiktsigenkänning aktiverat + Ansiktsigenkänning avaktiverat + Lås vitbalans + Lås upp vitbalans + Vitbalans låst + Vitbalans upplåst + Lås upp exponering + Okänd enhet + Använd adresser + Automatiskt + Använd Camera2 API + Möjliggör extra funktioner så som manuella lägen för exponering, fokus och vitbalans tillsammans med RAW (om det stöds av enheten) men kanske inte fungerar korrekt på alla enheter (omstart kommer ske) + App- och felsökningsinformation + Aktivera digital videostabilisering + Videostabilisering minskar skakningar på grund av kamerarörelser både i förhandsvisning och i inspelade videor. Detta kan vara onödigt om din enhet stöder optisk bildstabilisering (OIS). + Felsökningsalternativ + Felsökningsalternativ + Kritisk batterinivåkontroll + Stoppa videoinspelning om batterinivån är kritiskt låg. Detta hjälper till att minska risken för att videor blir skadade om din enhet plötsligt stängs av på grund av att den blir utan ström. + 1 (1:1) + 1,25 (5:4) + 1,33 (4:3) + 1,4 (7:4) + 1,5 (3:2) + 1,78 (16:9) + 1,85 (37:20) + 2 (2:1) + 2,33 (21:9) + 2,35 (47:20) + 2,4 (12:5) + HDR kontrastförstärkning + När kontrastförstärkningsalgoritm ska användas för HDR. Detta kan förbättra utseendet i de fall det är högt dynamiskt omfång i bilden, ger även en HDR-stil på resultatet. +\n%s + Video - och ljudformat och kodeks +\n%s + MPEG4 H264 + MPEG4 HEVC + 3GPP + Visa histogram + Om historgram ska visas för färgerna som finns på skärmen +\n%s + Av + RGB-färger + Värde (Maximalt) + Intensitet (Medel) + Ljushet (Medel av min-max) + Visa zebraränder + Röd + Orange + Genomskinlig + Vit + Extern kamera + Göm allt + Visa kamera-ID + Visa den aktuella siffran för kamera-ID på skärmen + Tillåt åtgärder vid långtryck + Bländare + 4K UHD + Bithastighet + Bildhastighet + Öppen källkodslicens + Camera is © 2013–2023 Mark Harman, publicerad under GPL v3 eller senare. Tryck här för hela licenstexten. + Googles Material Design-ikoner + Kamera är avgrenad från Camera + Licens + Information om Kamera + Bakåt + Nästa + Hoppa över + OBJ. + Kamera + Svart + Luminans + Ingen + Högt ljud + Om åtgärder vid långtryck ska tillåtas (t.ex. långtryck på galleriet för att ändra lagringsplats). + Sparar alla Kameras inställningar till en fil + Namn på sparade inställningar + Återställ tidigare sparade inställningar. Detta kommer skriva över alla nuvarande inställningar med dom sparade inställningarna! + Av + 70% + 80% + 90% + 93% + 95% + 97% + 98% + 99% + 100% + Visa adress om möjligt som tillägg till GPS-koordinater + Föredra adress framför GPS-koordinater + Visa inte adress + Visa lagra platsdataikon + Lagra platsdata + Sluta lagra platsdata + Sparar bilder … + Slutför panorama + Avbryt panorama + Panorama avbruten + Automatisk beskärning av panorama + Huruvida vågiga kanter ska tas bort i panoramaläget +\n%s + Spara inte originalbilder + Spara originalbilder + ID + Av + + Skanna + Skuggad text + Vanlig text + Kvarstår + Visa blixtikon + Av + 1,6 + 1,8 + 1,9 + 2,0 + 2,1 + 2,2 + 2,3 + 2,4 + 2,6 + 2,8 + Byt till extern kamera + Byt kamera + Byt mellan flera kameror + REC709 + sRGB + Gamma + Camera2 API + Göm användargränssnitt + Zebraränders förgrundsfärg + Zerbraränders bakgrundsfärg + Färg som används för bakgrundsränder när zebraränder visas. +\n%s + Färg som används för förgrundsränder när zebraränder visas. +\n%s + Spara originalbilder plus felsöknings-XML + Text med skuggad bakgrund + Misslyckades att skapa panoramabild + Alternativ för ljudnivåkänslighet för ljud (högt ljud) + Misslyckades att nivåjustera automatiskt + Tyvärr, automatisk nivåjustering stöds inte +\npå denna enhet + Automatisk nivå + Bilder kommer att roteras så att de är automatiskt i nivå (endast foton) (långsammare att ta foton och kanske misslyckas på enheter med för lite minne) + Om inställt kommer enhetens orientering att ignoreras och bildens/videons orientering kommer vara i förhållande till angiven orientering +\n%s + En beskärningsguide där en rektangel visas som anger hur det angivna bildförhållandet ser ut - användbart om du planerar att beskära fotot/videon i efterhand till ett annat bildförhållande. Kräver WYSIWYG-fotoläge eller att vara i videoläge. +\n%s + Videobildhastighet (uppskattning) + Aktivera upplösningen 3840x2160 för videoinspelning på bakre kamera - detta alternativ är ett hack som kanske tillåter 4K-enheter på 4K-kameror som inte exponerar alternativet till tredjepartskameraappar. Detta är inte garanterat att fungera, testa innan du börjar arbeta. + Videobithastighet (uppskattad) + Ställ in den uppskattade bithastigheten för videor (högre betyder bättre kvalitet men tar upp mer lagringsutrymme, kan få videoinspelning att misslyckas om bithastighet inte stöds) +\n%s + Ställ in bildhastigheten (FPS) för videor (kan vara uppskattad, inte garanterat att det uppnås, och kan få videoinspelning att misslyckas om bildhastighet inte stöds. Kontrollera videoresultatet för att se den faktiska bildhastigheten som användes. Observera att denna inställning ignoreras för slow motion-videor. +\n%s + Starta om vid maximal filstorlek + Huruvida automatisk omstart ska ske när maximal filstorlek nås (antingen enhetens maximala standardfilstorlek eller angivet av användaren) + Videoinspelningen stoppas och/eller startas om (se alternativ nedan) när den (uppskattade) maximala filstorleken är nådd. Observera att många Androidenheter har en maximal filstorlek för videor (vanligen runt 2 GB eller 4 GB), men detta alternativ tillåter att ställa in ett specifikt värde. Observera att detta alternativ inte kan användas för att öka enhetens inbyggda maximala värde. +\n%s + Specificera mono eller stereo för ljudinspelning (på vissa enheter stöds endast stereo) + Om du gillar denna app, vänligen fundera på att göra en donation för att stödja utvecklingen. Du kan göra detta genom att köpa min donationsapp - klicka på detta alternativ för att öppna sidan för min donationsapp. Tack! + Storage Access Framework avbruten + Visa \"Ta foto\"-ikon + Visa ikonen för att ta foton eller spela in videor. Avmarkera om du hellre tar foton på ett annat sätt (t.ex. om enheten har en fysisk slutarknapp eller använder volymknapparna). + Tar foto … + Glödlampa + Skymning + Action + Stadigt foto + Text som lagras i bildens metadata i upphovsrättstaggen (endast JPEG-format). (Lämna tomt för ingen.) + Slow motion aktiverad + Slow motion avaktiverades + Blixt på + Automatisk skärmblixt + Skärmblixt på + Tillåt foton medan inspelning av video + Tillåter att ta foton medan video spelas in. Avaktivera detta om det är problem med videoinspelning med Camera2 API aktiverad på enheten. + Bildprofiler för video + Ställ in standard eller platt bildprofil för videoläge +\n%s + Log (Fin) + Log (Låg) + Log (Medium) + Log (Stark) + Log (Extra stark) + Log-profil + Videokamera + Extern mick (om den finns) + Standardljudkälla + Auto-nivå kommer automatiskt rotera foton så att de framstår vara i nivå. +\n +\nObservera att detta innebär att bilder kommer få en något lägra upplösning (på grund av den rotation och beskärning som krävs). + HDR-läge är användbart för foton med stor variation i ljushet. Det fungerar genom att ta flera foton med olika exponeringar, och kombinerar dom sedan för att skapa den slutgiltiga bilden. +\n +\nObservera att HDR inte är lämpligt för motiv med snabba rörelser, och kan resultera i något sämre färgåtergivning. +\n +\nAtt ta foton i HDR-läge är långsammare. + BR + Fotostämpel + Spara alla bilder för HDR-läge + Om aktiverat, när HDR-fotoläge används, kommer de tre basbilderna sparas precis som det slutgiltiga HDR-fotot. Observera att detta kommer att göra det långsammare att spara, speciellt om alternativ som \"Stämpla foton\" eller Auto-nivå också används. + Läs- och skrivbehörighet till filer och media krävs för att spara filer så som foton och videor + Mikrofonbehörighet krävs för att spela in video med ljud och för att kunna använda \"Ljudkontroll\"-alternativen + Platsbehörighet krävs för geotagging (lagra platsdata i foton och videor, inklusive stämpel och undertexters alternativ). Platsbehörighet krävs också (åtminstone för Android 11 och tidigare) för att ansluta till Bluetooth LE fjärrkontrollsenheter. + Kalibrera nivåvinkel + Detta alternativ kalibrerar enhetens accelerometer så att auto-nivå och nivå-/vinkelalternativen på skärmen fungerar korrekt + Placera enheten på en platt horisontell yta så att den är i nivå (antingen i porträtt- eller landskapsläge), välj sedan Kalibrera. +\n +\nTryck på Återställ för att ta bort kalibreringen från din enhet. +\n +\nTryck på bakåtknappen för att avbryta. + Nivå kalibrerad + Nivåkalibrering återställd + Visa kompassens riktningslinjer + Visa kompassriktningslinjer + Om Storage Access Framework ska användas för att spara foton och videor. Detta bör aktiveras för att tillåta att spara till externa SD-kort. I Android 10+ måste detta alternativ vara aktiverat om du vill spara i en mapp utanför DCIM. + Snabb serie + Använd alternativ blixtmetod + Aktivera detta om enheten har programfel i blixtbeteendet med Camera2 API + Exponeringsgafflingssteg + Hur många steg som ska dras bort/läggas till för den mörkaste/ljusaste bilden +\n%s + Aktivera snabb HDR-/exposerie + Tillåter snabbare fångst av HDR-/expofoton. Avaktivera detta om enheten har problem med att ta foton i HDR- eller Expofotoläge. + Spegla främre kameran + Huruvida bilder tagna med främre kameran ska spegelvändas +\n%s + DRO + Visa stigningslinjer + Visa horisontella stigningslinjer + Skapa en fil med undertexter (.SRT) som lagrar datum och tid, och även GPS-info om plats-/riktningsdata är aktiverat. (I Android 11+, detta alternativ kräver att Fler kamerakontroller/Storage Access Framework aktiveras.) +\n%s + Misslyckades att starta ljudavlyssning + Aqua + Svart tavla + Mono + Affischera + Sepia + Solarisera + Whiteboard + Hög fart + Antiränder + Algoritmer som hjälper mot ljusflimmer. +\n%s + Spökbild + Lägg över en bild för att hjälpa med placering. +\n%s + Ingen fildialog hittades på denna enhet, alternativet spökbild stöds ej + ingen serie + Visa ljudnivåmätare + Hurruvida ljudnivå ska visas på skärmen när video spelas in + Enhetens kompass behöver kalibreras för att förbättra noggrannheten. Detta kan göras genom att röra din enheten i ett mönster som liknar en 8. +\n +\nAktuell noggrannhet: + Huruvida inzoomning ska ske när fokusavstånd justeras manuellt +\n%s + Detta alternativ tillåter att du väljer en av inställningsfilerna som sparats tidigare. Tag varning om att inläsning av vald fil skriver över alla nuvarande inställningar! + Ingen fildialog hittades på denna enhet, alternativet stöds ej + Algoritmer för kantläge + Algoritm som kameradrivrutinen bör använda för att applicera kantförbättring. Kantförbättring förbättrar skärpan och detaljerna i den tagna bilden. (Denna inställning ignoreras i BR-fotoläge.) +\n%s + Algoritm som kamerans drivrutin bör använda för att applicera brusreducering. Brusreduceringsalgoritmen försöker förbättra bildkvaliteten genom att ta bort överdrivet brus som tillkommit i bildtagningsprocessen, speciellt i mörka förhållanden. (Observera att detta inte är relaterat till Brucreduseringsfotoläget, och denna inställning kommer att ignoreras i BR-fotoläget.) +\n%s + Panorama + BR-läge + Svagt ljus + Ikoner längst upp (porträtt) + Huruvida ikon ska visas på skärmen för att aktivera eller avaktivera ansiktsigenkänning + Visa ikon för auto-nivå + Huruvida ikon ska visas på skärmen för att aktivera eller avaktivera auto-nivå. När auto-nivå är aktiverat kommer foton roteras så att de automatiskt är i nivå med horisonten. + Aktivera auto-nivå + Avaktivera auto-nivå + Visa ikon för fotostämpel + Huruvida ikon ska visas på skärmen för att aktivera eller avaktivera fotostämpel + Aktivera fotostämpel + Avaktivera fotostämpel + Fotostämpel aktiverad + Fotostämpel avaktiverad + Huruvida ikon ska visas på skärmen för att ange anpassad text som ska stämplas på fotot + Visa ikon för fotostämpel med anpassad text + Visa låsikon för automatisk vitbalans + Huruvida ikon ska visas på skärmen för att låsa eller låsa upp automatisk vitbalans + Visa låsikon för automatisk exponering + Huruvida ikon ska visas på skärmen för att låsa eller låsa upp exponering + Svagt ljus-läge: Håll kameran stadigt + Pano + Bluetooth LE fjärrkontroll … + Aktivera Bluetooth LE fjärrkontroll + Aktivera Bluetooth LE (BLE) fjärrkontrollenheter + Fjärrenhetstyp + BLE stöds ej + BLE enhetesskanning + Bluetooth stöds ej. + Dämpa skärmen om anslutning bryts till fjärr + Tips: Ställ in standardljusstyrkan till lägsta nivån innan Kamera startas. + Använd Saltvatten för beräkning av djup + För undervattenshus, förbättrar noggrannheten om korrekt vattentyp är valt. + Fjärr ansluten + Huruvida ikon ska visas på skärmen för att aktivera eller avaktivera platsdata (geotaggning) + Om detta alternativ är aktiverat kommer zebraränder visas på skärmen som visar var kamerans förhandsvisning är överexponerad. +\n%s + Om detta alternativ är aktiverat kommer markeringar att visas på kanter som är i fokus (konturer). Detta är primärt användbart för manuell fokus, och kan användas för att hjälpa till att avgöra vilka områden i en bild som är i fokus. +\n%s + Fokusmarkering + Fokusmarkeringsfärg + Kameraförhandsvisning … + Bläddra blixt + Panorama originalbilder + Huruvida ikon ska visas på skärmen för att bläddra igenom alla blixtalternativ istället för att visa blixtalternativ i popup-menyn. Observera att ficklampan inte är tillgänglig när denna ikon visas. + Tillåt RAW vid exponeringsgaffling + Visa RAW-ikon + Bläddra RAW-läge + Huruvida ikon ska visas på skärmen för att bläddra igenom RAW-lägen + Aktuell fjärr: + För att ta en panoramabild, håll enheten i porträttläge och tryck ta bild för att starta panorama. Vrid sedan enheten antingen åt vänster eller åt höger för att flytta den centrerade vita cirkeln över den blåa punkten. Efter att varje ny bild är tagen, fortsätt vrida enheten för att täcka varje ny blå punkt som visas i tur och ordning. +\n +\nTryck på bockikonen för att spara panoramat eller krysset för att avbryta. +\n +\nObservera att panoramabilder kan ta tid att bearbeta och spara. + Huruvida originalbilderna ska sparas i panoramaläge. Observera att detta kommer göra det långsammare att spara panoramabilder. Tillåter även alternativet att spara en XML-fil vilket kan vara användbart när problem med panorama rapporteras. +\n%s + Vilken färg som ska användas för att markera kanterna som är i fokus +\n%s + Huruvida RAW-alternativet även ska appliceras för exponeringsgafflingsläget (eller för HDR-läge när Spara alla bilder för HDR-läge är aktiverat). Endast JPEG kommer sparas i dessa fotolägen om detta alternativ är avaktiverat. + Tillåt RAW vid fokusgaffling + Huruvida RAW-alternativet även ska gälla för fokusgafflingsläget. Endast JPEG kommer sparas i fokusgafflingslägen om detta alternativ är avaktiverat. + Kamera API + Välj Camera2 API för att tillgängliggöra extra funktioner så som manuella lägen för exponering, fokus, vitbalans tillsammans med RAW (om det stöds av enheten). Ändring av API kommer tvinga en omstart. +\n%s + Camera API original + Sökfält för att ändra exponeringskompensation + Ta foto/video när ett ljud upptäcks. När detta är aktiverat, använd mikrofonknappen på skärmen för att starta/stoppa lyssning. +\n%s + Välj fjärrenhet + Videogammavärde + Gamma värde som ska användas för video om videobildprofilen är inställd på Gamma +\n%s + Göm virtuella navigationsknappar på skärmen + Spökbilds ogenomskinlighet + Alfavärde som ska används för spökbilder. Ett lägre värde ger mer genomskinlighet, högre betyder mer ogenomskinlighet. +\n%s + Tryck för att fokusera och tryck på den vita kameraknappen för att ta foto. +\n +\nFör att avaktivera maximal skärmljusstyrka, se Inställningar/På skärmens användargränssnitt/\"Tvinga maximal ljusstyrka\". För att spara till SD-kort i Android 5+, se Inställningar/Mer kamerakontroller/\"storage Access Framework\". För mer hjälp, tryck på \"Onlinehjälp\" i inställningarna. + Dämpa endast de virtuella navigationsknapparna på skärmen + Ultrabred + Flera kameraikoner + Om detta är aktiverat används separata knappar för att byta mellan främre och bakre kameror och för att byta mellan flera framåt-/bakåtriktade kameror. Om detta är avaktiverat kommer Byt kameraikonen att bläddra igenom alla kameror. + Slowmotion + Lagra gir, stigning och rullning + Lagra gir, stigning och rullning för enheten i fotots Exif-användarkommentar (endast JPEG-format) + Röstkommando: \"cheese\" + Aktivera ta bild-dummy för HDR/exponeringsfix + Bluetooth skanna/anslut-behörigheter krävs för att kunna upptäcka och ansluta till Bluetooth LE fjärrkontrollenheter. + Okänd enhet (Bluetooth anslutbehörighet inte tillgänglig) + Tillägg: Auto + X-HDR + Tillägg: HDR + X-Natt + Tillägg: Natt + X-Bokeh + Tillägg: Bokeh + X-Bty + Tillägg: Vacker / Ansiktsretuschering + Sökfält för att ändra aktuellt inställt värde + X-Auto + Kamera använder ikoner från Googles Material Design-ikoner (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , https://google.github.io/material-design-icons/) med Apache-licens version 2.0. Vissa ikoner har modifieringar inkluderade. Tryck här för att se licenstexten i sin helhet. + Välj filformat som ska användas när foton sparas. Detta påverkar \"standard\"-foton (inte RAW). Endast JPEG stödjer att Exif-metadata sparas. Observera att formatet PNG inte är helt förlustlöst, istället konverteras det från en JPEG med kvaliteten 100%%. +\n%s + Artist + Text att lagra i bildens metadata i artisttaggen (endast JPEG-format). (Lämna tomt för att ange ingen.) + Fokusgafflings källavstånd + Fokusgafflings målavstånd + Om möjligt, hämta adress från GPS-plats (för fotostämpel eller videoundertexter). Observera att om detta är aktiverat kräver detta att enheten skickar platsdata över internet till en tredje part för att konvertera GPS-koordinater till en adress. Se https://developer.android.com/reference/android/location/Geocoder . Denna funktion ger inga garantier på tillgänglighet eller noggrannhet. Resultatet är en bästa gissning och garanterar inte att den kommer vara meningsfull eller korrekt. +\n%s + Försök att aktivera detta om din enhet har problem vid tagning av foto med HDR- eller exponeringsfotoläge (om exponeringsbilder genererar samma exponeringar). Endast relevant om snabb HDR-/exponeringsalternativet nedan också är aktiverat. + Ta bort enhetens EXIF-data + Ta inte bort enhetens EXIF-data + Ta bort enhetens EXIF-data + Ta bort förutom datum/tid + HDR-tonmappning + Algoritm som används för tonmappning i HDR-fotoläge +\n%s + Enkel klämning + Exponentiell + Standard + Huruvida enhetens EXIF-metadata ska tas bort från JPEG-bilder. Detta kommer inte ta bort exif-taggar för andra inställningar som applicerar EXIF-metadata (t.ex. plats/geotaggning). Dessa andra alternativ är fristående och kommer åsidosätta denna inställning. RAW/DNG och videor påverkas inte. +\n%s + Håll kamera stadigt för bättre foton. + Lägg till kontakt + Lägg till händelse i kalendern + Lägg till denna händelse i kalendern + Öppna denna plats + Öppna denna plats + Skicka nytt mejl + Kolla upp detta ISBN + Sök efter detta ISBN på isbnsearch.org + Kolla upp produkt + Kolla upp denna produkts streckkods-ID + Skicka ett nytt SMS + Lägg till kontakt + Komponera ett nytt mejl till den angivna adressen + QR-kod + Skicka ett nytt SMS till de angivna mottagarna + Ring telefonnummer + Ring telefonnumret + Kolla upp VIN + Anslut till detta trådlösa nätverk + Lägg till detta trådlösa nätverk till kända nätverk och anslut enheten till det + Ikon + Dela + Kopiera till urklipp + Ingen app tillgänglig för att hantera denna åtgärd + Text + Konfigurera denna enhet + Wi-Fi Easy Connect™ (DPP) + Dela med + \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 4e2b0441d..a5be97c78 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,13 +1,13 @@ - - Camera + Open (Açık kaynaklı) kamera Ayarlar Popup Ayarları TAMAM (Bu mesaj tekrar gösterilmeyecektir.) - - Açık - Kapalı + Açık + + Kapalı + Kayıt yerini seç: Klasör geçmişini temizle @@ -15,10 +15,12 @@ Başka bir klasör seç Değiştirilen kayıt konumu: Vidyo kaydı durduruldu - repeats to go + repeats to go + Kameraya tekrar bağlanma hatası Hata oluştu, vidyo dosyası bozulmuş olabilir - cihazınız desteklemiyor + cihazınız desteklemiyor + Bilinmeyen hata oluştu, vidyo duraklatıldı Server durdu, vidyo duraklatıldı Vidyo maksimum süreye ulaştı @@ -56,7 +58,6 @@ Renk efekti Sahne modu Beyaz dengesi - Açı Yön KAMERA AÇMA HATASI. @@ -67,9 +68,9 @@ Boş [KİLİTLENDİ: Açmak için kaydırın] - Fotoğrafa tarih bilgisi ekleme hatası - m + m + Kamera Efektleri Otomatik-stabilize @@ -88,7 +89,6 @@ Eğer ayarlanırsa, cihazın yönlendirmesi geçilecektir ve fotoğraf/vidyo yönlendirmesi daha önce belirlenen yönlendirme ayarına uyacaktır\n%s Yüz tanıma Odak alanları yerine yüz tanımayı kullan - Kamera Kontrolleri Zamanlayıcı Zamanlayıcı ayarla @@ -105,17 +105,15 @@ Fotoğraf çekme sesi Fotoğraf çekerken ses çal Ses seviyesi tuşları - Kaydetme yeri Fotoğraf/vidyo dosyaları için kayıt klasörü - Fotoğraf ve vidyoları kaydetmek için Storage Access Framework kullan + Fotoğrafları ve videoları kaydetmek için Depolama Erişim Çerçevesi\'nin kullanılıp kullanılmayacağı. Harici SD kartlara kaydetmeye izin vermek için bu etkinleştirilmelidir. Android 10+\'da DCIM dışındaki bir klasöre kaydetmek istiyorsanız bu seçenek etkinleştirilmelidir. Fotoğraf adlandırma öneki kaydet Fotoğraflarda dosya adlarını kaydetmede kullanılacak önek vidyo adlandırma öneki kaydet Vidyolarda dosya adlarını kaydetmede kullanılacak önek Kilitlendiğinde kamerayı göster - Etkinleştirilirse, Camera yukarıda kilit ekranı göstermeye devam edecektir(Sizin\' ayarlara, galeriye vb. erişmek için yine de ekranı açamanız gerekir) - + Etkinleştirilirse, Kamera herhangi bir kilit ekranının üzerinde gösterilmeye devam eder (Ayarlar, Galeri vb.\'ye erişmek için kilidi açmanız gerekir) Vidyo kaydederken ekranı kilitle Vidyo kaydederken, GUI kazara kaydı durdurmayı önlemek için kilitlenecek. Kilidi açmak için ekranı kaydırın. Vidyo kaydederken eğer uygulama arkaplana giderse ya da ekran boşsa kayıt daima durdurulacaktır. Önzilemeyi döndür @@ -131,7 +129,7 @@ Zoom kaydırma kontrolünü göster Zoom kontrolü için kaydırma barını göster ISO yu göster - Şu anki ISO seviyesini göster(Camera2 API si gerekir) + Geçerli ISO seviyesini görüntüler. (Camera2 API gerektirir.) Boş bellek alanını göster Ekranda kalan boş cihaz alanını göster Açıyı göster @@ -149,15 +147,14 @@ Çerçeve göster Kırpma yardımcısını göster Kırpma yardımcısı -eğer daha sonra fotoğraf/vidyoları farklı görüntü oranlarında kırpmayı planlıyorsanız kullanışlıdır- özel görüntü oranlarının nasıl göründüğünü dikdörtgen şeklinde gösterir. WYSIWYG fotoğraf modu ya da vidyo modunda olmak gerekir\n%s - \"ileti\" mesajları göster - \"ileti\" mesajlarını açılır pencere şeklinde göster + Ekran üstü mesajları göster + Ekranda geçici bilgi mesajlarının görüntülenip görüntülenmeyeceği Önizleme animasyonunu göster Fotoğraf çekerken önizleme animasyon hareketini göster Ekranı açık tut - Etkinleştirilirse, Camera kullanıcı arayüzü aktifken ekran kapanmayacaktır + Etkinleştirilirse, Kamera arayüzü aktifken ekran kapanmayacaktır Maksimum parlaklık için zorla Cihazın öntanımlı ayarına bakmaksızın ekran görüntüsünü maksimum parlaklık için zorlar - Fotoğraf ve Vidyo Ayarları Fotoğraf ayarları… Vidyo ayarları… @@ -187,26 +184,26 @@ Vidyo çözünürlüğü 4K UHD vidyo için zorla(deneysel) 3840x2160 çözünürlüğünü arka kameradan vidyo kaydederken etkinleştir- bu ayar sadece cihazınız destekliyorsa çalışacaktır, desteklemiyorsa cihazınız çökebilir! - Vidyo stabilizasyonunu etkinleştir - Vidyo stabilizasyonu, önizleme yaparken ve kaydedilmiş vidyolarda kamera hareketine bağlı olarak sarsıntıyı azaltır + Dijital video sabitlemeyi etkinleştirin + Video sabitleme, hem önizlemede hem de kaydedilen videolarda kameranın hareketinden kaynaklanan titremeyi azaltır. Cihazınız optik görüntü sabitlemeyi (OIS) destekliyorsa bu gereksiz olabilir. Vidyo bitrate (ortalama) Vidyoların ortalama bitoranlarını ayarla(değerler yükseldikçe kalite yükselir fakat dosyalar daha fazla alan kaplar; eğer bitoranı desteklenmezse vidyo kaydederken hatalar oluşabilir)\n%s Vidyo kare oranı (ortalama) - Vidyoların kare oranını(FPS) ayarla(ortalama olabilir, tamamlanacağının garantisi yoktur ve kare oranı desteklenmezse hatalar oluşabilir)\n%s + Videoların kare hızını (FPS) ayarlayın (yaklaşık olabilir, elde edileceği garanti edilmez ve kare hızı desteklenmiyorsa video kaydının başarısız olmasına neden olabilir). Kullanılan gerçek kare hızını bulmak için lütfen sonuç videolarını kontrol edin. Bu ayarın ağır çekim videolar için göz ardı edildiğini unutmayın. +\n%s Vidyoların maksimum süresi Vidyo kaydı belirlenen süreden sonra durdurulacaktır\n%s Maksimum süreye ulaşıldığında vidyoyu yeniden başlat Vidyo maksimum süreye(ayarlandı ise) ulaşdığında, bu seçenek vidyoyu belirli bir sayıya ulaşana dek yeniden başlatacaktır\n%s - Sesleri kaydet Vidyo kaydederken sesleri de kaydet Sesin Kaynağı - Ses kaydetmede kullanılacak mikrofon\n%s + Ses kaydı için kullanılacak mikrofon. Seçeneklerin tam davranışının, seçeneğin cihazınızda nasıl uygulandığına bağlı olduğunu unutmayın. +\n%s Ses kanalları - Ses kaydetmede kullanılacak kanalları mono ya da stereo özelleştir(stereo sadece bazı cihazlarda desteklenir)\n%s + Ses kaydetmede kullanılacak kanalları mono ya da stereo özelleştir(stereo sadece bazı cihazlarda desteklenir) vidyo kaydederken Flaşı aç Etkinleştirildiğinde, flaş vidyo kaydederken yanıp sönecektir(kameranın hala uzak bir yerde kayıt yaptığını anlamak için kullanılabilir) - Karışık Online yardım Geliştirmeyi desteklemek için bağışta bulunun @@ -216,13 +213,11 @@ Hakkında Uygulama ve eksiklik bilgisi Ayarları temizle - Tüm Camera ayarlarını öntanımlı ayarlara döndür + Tüm Kamera ayarlarını varsayılana sıfırla Tüm Camera ayarlarını öntanımlı ayarlara döndürmek istediğinize emin misiniz? - Etkinleştir Etkin değil Clipboarda kopyala - Fotoğraf çek Galeri Pozlama @@ -231,7 +226,6 @@ Flaş Modu Son Resmi Sil Fotoğraf Paylaş - Ana Klasör Yeni Klasör Bu klasöre kaydetme izniniz yok @@ -239,14 +233,11 @@ Yeni bir klasör adı girin Klasör oluşturma hatası Bu adda bir klasör zaten var - Kaydedilecek konumu seçin Storage Access Framework iptal edildi - Mikrofon izni etkin değil Konum izni etkin değil - Sınırsız 3 saniye 5 saniye @@ -272,24 +263,20 @@ 45 dakika 1 saat Öntanımlı ayar - Öntanımlı ayar yyyy-aa-gg gg/aa/yyyy aa/gg/yyyy Tarih bilgisi yok - Flaş Kapalı Flaş Otomatik Flaş Açık Flaş Işığı Kırmızı Göz - Camcorder Harici mikrofon (varsa) Öntanımlı ses kaynağı Kişi sesine optimize et - Öntanımlı ayar 100kbps 200kbps @@ -314,7 +301,6 @@ 80Mbps 90Mbps 100Mbps - Kapalı 2x 3x @@ -329,7 +315,6 @@ 200x 500x Sınırsız - Gecikmesiz 1sn 2sn @@ -347,7 +332,6 @@ 30da 1sa 2sa - Yok 1 (1:1) 1.25 (5:4) @@ -359,23 +343,79 @@ 2.33 (21:9) 2.35 (47:20) 2.4 (12:5) - Solak kullanıcı arayüzü Sağ el kullanıcı arayüzü - Gölgeli yazı Düz yazı - - Kapalı - Sadece sanal ekran navigasyon butonlarını gizle - GUI(Grafik arayüz) gizle - Herşeyi gizle - + About Derleme sürümü - Kamera OpenCamera\'dan çatallandı - yazar + Kamera Camera\'dan çatallandı + Yapımcılar Kaynak kodu lisans Kamera bilgileri - Hizmet şartları - + Kullanım koşulları + Kapalı + Sadece sanal ekran navigasyon butonlarını gizle + GUI(Grafik arayüz) gizle + Herşeyi gizle + Ses kontrol hassasiyeti + Fotoğraf çekildiğini belirtmek için ekranda bir kenarlık görüntüleyin + Fotoğrafların bir arka plan iş parçacığına kaydedilip kaydedilmeyeceği (daha hızlı çalışma için) + Arkaplan kayıt uygulaması kullan + Maksimum dosya boyutuna ulaşınca çekimi yeniden başlat + Ön kameraya geç + Yüksek bir ses çıkarın + Tekrar gösterme + Gürültü Azaltma + Coğrafi etiketleme (damga ve altyazı seçenekleri de dahil olmak üzere fotoğraf ve videolarda konum verilerinin saklanması) için konum izni gereklidir. Konum izni ayrıca (en azından Android 11 ve öncesi için) Bluetooth LE uzaktan kumanda cihazlarına bağlanmak için de gereklidir. + Gürültü Azaltma orijinal görüntüler + RAW + Alternatif flaş yöntemi kullan + Video moduna geç + Video kaydına başla + GB + Standart + Taramalı Çekim + GA + Tüm fotoğrafları HDR olarak kaydet + Hata ayıklama seçenekleri + Kamerayı kullanmak için kamera izni gerekli + HDR + Sesli video kaydetmek ve \"Ses kontrolü\" seçeneklerini kullanmak için mikrofon izni gereklidir + Tarayıcınızda Kamera web sitesini başlatın + Kamera başlatıldığında otomatik odaklama yapılıp yapılmayacağı. Başlatma sırasında flaşın açılması sorunu yaşıyorsanız, bu seçeneği devre dışı bırakın + Pozlama Parantezleme + Std + Maksimum dosya boyutuna ulaşıldığında otomatik olarak yeniden başlatılıp başlatılmayacağı (cihaz varsayılan maksimum dosya boyutu veya kullanıcı tarafından belirtilen) + Pzlm {} + Fotoğraf moduna geç + Arka kameraya geç + (Yaklaşık) maksimum dosya boyutuna ulaşıldığında video kaydı duracak ve/veya yeniden başlayacaktır (aşağıdaki seçeneğe bakın). Birçok Android cihazın videolar için maksimum dosya boyutuna sahip olduğunu unutmayın (genellikle 2GB veya 4GB civarında), ancak bu seçenek belirli bir değerin ayarlanmasına izin verir. Bu seçeneğin bir cihazın yerleşik maksimum değerini artırmak için kullanılamayacağını unutmayın.  +\n%s + Video için maksimum dosya boyutu + Fotoğraf çekerken kenarlığı göster + Izgara + Başlangıçta otomatik odaklama gerçekleştirin + Dosya adı için zaman formatı + Ses (yüksek gürültü) seçeneği için gürültü seviyesi hassasiyeti + Ses kontrol ayarları + Pozlama Parantezleme + Cihazınız Camera2 API ile hatalı flaş davranışına sahipse bunu etkinleştirin + Fotoğraf veya video gibi sonuç dosyalarını kaydetmek için depolama okuma/yazma izni gereklidir + Hata ayıklama seçenekleri + IZINLER MEVCUT DEĞIL + İzin gerekli + Etkinleştirilirse, HDR fotoğraf modu kullanılırken, üç temel pozlama görüntüsünün yanı sıra son HDR fotoğrafı da kaydedilir. Bunun, özellikle \"Fotoğrafları damgala\" veya Otomatik seviye gibi seçenekler de kullanılıyorsa, kaydetmeyi yavaşlatacağını unutmayın. + Fotoğraf Damgası + Fotoğraf modu + Ses dinlemesi durdur + \"Cheese\" diyin + Maksimum dosya boyutu + MB + Ses dinlemesi başlat + Video kaydını durdur + Bu klasöre kayıt edilemiyor + RAW fotoğraf kaydı başarısız + Sıradaki + \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 59e9a8da6..8f353b0fb 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,24 +1,25 @@ - - Camera + Камера Налаштування Налаштування зринаючих вікон "Гаразд (Більше це повідомлення не з'явиться.)" - - Увімк - Вимк - + Увімк + + Вимк + Виберіть теку для збереження: Очистити історію теки Очистити історію теки? Вибрати іншу теку Теку для збереження змінено на: Запис зупинено - повторів залишилось + повторів залишилось + "Не вдалося з'єднатися з камерою" Помилка, відеофайл може бути пошкоджено - Не підтримується на вашому пристрою + Не підтримується на вашому пристрою + Невідома помилка, відео зупинено Сервер впав, відео зупинено Відео досягло максимальної тривалості @@ -57,7 +58,6 @@ Кольоровий ефект Сцена Баланс білого - Кут Напрямок Не вділося відкрити камеру. @@ -68,10 +68,8 @@ "Пам'ять" [Заблоковано: Проведіть по екрану, аби розблокувати] - Не вдалося додати відмітку м - Ефекти Авто-стабілізація Зображення буде стабілізуватися. Не рекомендується на слабких пристроях @@ -89,7 +87,6 @@ Ігнорування системної орієнтації екрану пристрою\n%s Розпізнавання облич "Розпізнавання облич в об'єктиві для фокусування" - Керування Таймер Звук таймеру @@ -107,21 +104,18 @@ Відтворення звуку під час знімку фотографії Кнопки гучності Налаштування керування звуком - Чутливість керування - Тека збереження "Ім'я теки для збереження фото та відео (також може бути повний шлях)" - Використовувати Storage Access Framework для збереження фото та відео + Чи використовувати Storage Access Framework для збереження фотографій і відео. Це потрібно ввімкнути, щоб дозволити збереження на зовнішні SD-карти. На Android 10+ цю опцію слід увімкнути, якщо ви хочете зберігати в папку за межами DCIM. Префікс для фото Префікс імен файлів для знімків Префікс для відео Префікс імен файлів для відео Формат часу для імені файлу Камера на екрані блокування - Якщо увімкнуто, то Camera все одно буде показуватись над будь-яким екраном блокування (ви можете отримати доступ до налаштувань, галереї и т.п.) + Якщо увімкнено, Камера все одно відображатиметься над будь-яким екраном блокування (вам все одно доведеться розблокувати, щоб отримати доступ до Налаштувань, Галереї тощо) Автофокус під час запуску - Блокувати екран під час запису відео Під час запису відео, графічний інтерфейс буде заблоковано, аби запобігати випадковому припиненню запису. Проведіть по екрану, аби розблокувати. Зверніть увагу, що запис відео припиниться, якщо додаток перейде у фоновий режим або ж згасне екран. Поворот попереднього перегляду @@ -153,20 +147,20 @@ Показувати батарею Показувати поточний рівень заряду батареї Показати сітку - Сітка + Сітка + Порадник по обрізанню фото Показ прямокутника, який показуватиме відношення сторін - корисно, якщо ви плануєте обрізати фото/відео. Потребує WYSIWYG режим фотознімку чи режим відео\n%s - Зринаючі повідомлення - Показувати зринаючі повідомлення під час роботи + Показувати екранні повідомлення + Чи відображати тимчасові інформаційні повідомлення на екрані Показувати ескіз анімації Показ пересування ескізу анімації під час знімку фотографії Показувати рамку під час фотографування Показувати рамку на екрані для індикації режиму фотографування Не вимикати екран - Якщо увімкнуто, екран не буде вимикатися, доки активний інтерфейс Camera + Якщо увімкнено, екран не вимикається, поки активний основний інтерфейс камери Максимальна яскравість Встановлення максимальної яскравості під час зйомки - Якість фото та відео Налаштування фото… Налаштування відео… @@ -200,28 +194,25 @@ Якість відео 4K UHD (експериментально) При виборі розширення (3840х2160) для запису через задню камеру, це буде працювати лише тоді, якщо ваш пристрій підтримує вказаний формат! Увімкнути стабілізацію відео - Стабілізація відео зменшує тряску, через рух камерою + Стабілізація відео зменшує тремтіння, спричинене рухом камери, як у попередньому перегляді, так і в записаному відео. Це може бути непотрібним, якщо ваш пристрій підтримує оптичну стабілізацію зображення (OIS). Відео бітрейт (приблизно) Вибір бітрейту відео (чим вище, тим краще якість, але файл буде займати більше місця на флеш-картці. Якщо бітрейт не підтримується, це може викликати помилку під час запису відео)\n%s Частота кадрів відео (приблизно) - Кількість кадрів на секунду (FPS) у відео (може викликати помилку під час запису, якщо частота не підтримується)\n%s + Встановіть частоту кадрів (FPS) для відео (може бути приблизною, не гарантується, що буде досягнуто, і може призвести до збою запису відео, якщо частота кадрів не підтримується). Будь ласка, перевірте отримані відео, щоб дізнатися фактичну частоту кадрів. Зверніть увагу, що цей параметр ігнорується для сповільнених відео. +\n%s Максимальна тривалість відео Відеозапис припиниться, через вказаний час\n%s Записати нове відео, коли буде досягнуто ліміту При досягненні ліміту тривалості, буде записано нове відео. (стільки разів, скільки ви вказали)\n%s Максимальний розмір файлу відео - - - Запис звуку Запис звуку під час запису відео Джерело звуку Мікрофон для запису звуку\n%s Число каналів - Налаштування моно чи стереозвуку (стерео доступно не для всіх пристроїв)\n%s + Налаштування моно чи стереозвуку (стерео доступно не для всіх пристроїв) Спалах під час запису відео Якщо увімкнуто, спалах буде вмикатися/вимикатися під час запису відео (можна використовувати, аби виконувати запис на відстані) - Різне Онлайн допомога Відкрити сайт Camera в веб браузері @@ -234,11 +225,9 @@ Скидання налаштувань Скинути всі налаштування Camera на стандартні значення Ви дійсно бажаєте скинути всі налаштування Camera на стандартні значення? - Доступно Не доступно Копіювати до буферу - Зробити фото Галерея Експозиція @@ -247,11 +236,10 @@ Спалах Перейти на фронтальну камеру Перейти на основну камеру - >Перейти до відео-режиму - >Перейти до фото-режиму + >Перейти до відео-режиму + >Перейти до фото-режиму Видалити останній знімок Поділитися - Батьківська тека Нова тека Неможливо записати до даної теки @@ -259,99 +247,52 @@ "Введіть ім'я нової теки" Не вдалося створити теку Тека вже існує - Оберіть місце для збереження Storage Access Framework скасовано - Доступ до мікрофона не надано Доступ до місця-розташування не надано - Почати запис відео Зупинити запис відео - Максимальний розмір файлу - МБ - ГБ - + МБ + + ГБ + Увімкнути керування звуком Вимкнути керування звуком Скажіть \"сир\" Створіть сильний шум - - - - - Надалі не показувати - Режим фото - Std + Std + Стандартний HDR Expo {} - Штамп на фото Зберішати всі зображення в режимі HDR - - - - - - - - - Налаштування відлагодження Налаштування відлагодження - - - - - - - - - с - + с + Недостатньо вільного міця для запису відео Запис відео зупинено\nКритично низький рівень заряду батареї - - - - Темніше - Світліше + Темніше + + Світліше + Витримка - Суттєва помилка камери - - - - Камера Записати відео Селфі - - - - Калібрувати рівень кута - - Калібрувати Скинути Рівень відкалібровано Скидання калібровки рівня - DRO - - - - - - - - Без обмеження 3 секунди 5 секунд @@ -376,30 +317,20 @@ 30 хвилин 45 хвилин Година - - - - Запис відео призупинено Запис відео продовжено Призупинити запис відео Продовжити запис відео - Захоплення… - Не вдалося ініціалізувати прослуховування аудіо - Типово - ЛишеJPEG JPEG та DNG (RAW) - Типово рррр-мм-дд дд/мм/рррр мм/дд/рррр Відсутня - Спалах Вимк. Спалах Авто Спалах Увімк. @@ -407,12 +338,10 @@ Червоні очі Спалах екрану Авто Спалах екрану Увімк. - Відеокамера Зовнішній мікрофон (якщо є) Типово Внутрішній мікрофон - Типово 100kbps 200kbps @@ -437,7 +366,6 @@ 80Mbps 90Mbps 100Mbps - Вимкнуто 2x 3x @@ -452,7 +380,6 @@ 200x 500x Постійно - Без затримки Секунда 2 секунди @@ -470,14 +397,12 @@ 30 хвилин Година 2 години - Типово для пристрою 100МБ 200МБ 300МБ 500МБ 1ГБ - Немає 1 (1:1) 1.25 (5:4) @@ -489,7 +414,6 @@ 2.33 (21:9) 2.35 (47:20) 2.4 (12:5) - +3 (висока чутливість) +2 +1 @@ -497,27 +421,26 @@ -1 -2 -3 (низька чутливість) - Інтерфейс для лівші Інтерфейс для правші - Текст с тінью Звичайний текст - + About + Збірка версії + Камера роздвоєна від Camera + Автори + Вихідний код + Ліцензія + Інформація про камеру + Умови користування послугами Вимкнути Приховати кнопки навігації Приховати GUI Приховати все - Немає Низький шум - Голосова команда: \"сир\" - - Збірка версії - Камера роздвоєна від OpenCamera - Автор - Вихідний код - Ліцензія - Інформація про камеру - Умови обслуговування - + Голосова команда: \"сир\" + + Чи виконувати автофокусування під час запуску камери. Якщо у вас виникла проблема ввімкнення спалаху під час запуску, вимкніть цю опцію + Чутливість до рівня шуму для опції аудіо (гучний шум) + \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e3fb12dec..28ac6ecdd 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -217,7 +217,7 @@ Nguồn âm thanh Micrô được sử dụng để ghi âm\n%s Kênh âm thanh - Thiết lập âm thanh đơn hoặc nổi (chỉ hỗ trợ âm thanh nổi trên một số thiết bị)\n%s + Thiết lập âm thanh đơn hoặc nổi (chỉ hỗ trợ âm thanh nổi trên một số thiết bị) Nháy đèn flash khi quay video Nếu kích hoạt, đèn flash sẽ nháy khi quay video (có thể được sử dụng để cảnh báo camera vẫn đang quay ở khoảng cách xa) @@ -779,6 +779,14 @@ Đổ bóng Thuần túy + About + Phiên bản xây dựng + Máy ảnh được rẽ nhánh từ Camera + Tác giả + Mã nguồn + Giấy phép + Thông tin camera + Điều khoản dịch vụ Tắt Chỉ ẩn các nút điều hướng @@ -789,11 +797,4 @@ Tiếng động lớn Tiếng cheese - Phiên bản xây dựng - Máy ảnh được rẽ nhánh từ OpenCamera - Tác giả - Mã nguồn - Giấy phép - Thông tin camera - Điều khoản dịch vụ diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index ff840a1a5..da570207e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -33,9 +33,9 @@ 视频 曝光锁定 曝光解锁 - 已取消倒计时 + 已取消定时器 已取消连拍模式 - 开始倒计时 + 已开始定时器 保存视频文件失败 录制视频失败 已开始录制视频 @@ -90,13 +90,13 @@ 通过识别人脸完成对焦 相机控制 - 倒计时 - 倒计时蜂鸣器 - 倒计时、连拍间隔时发出蜂鸣器声 + 定时器 + 定时器蜂鸣 + 当计时器倒数或连拍模式延迟时蜂鸣 语音定时器倒计时 - 语音播报倒计时或连拍延时(从60秒开始倒数) + 说出定时器倒计时或连拍模式延时(从60秒开始) 连拍模式 - 连拍间隔时长 + 连拍模式间隔 更多相机控制… 触摸快门 拍照只需通过触摸预览 @@ -105,7 +105,7 @@ 快门声音 拍照时播放声音 音量键功能 - 声控拍照 + 语音识别 麦克风灵敏度 使用语音识别时麦克风过滤噪声的阈值 保存位置 @@ -140,7 +140,7 @@ 显示角度 在屏幕上显示当前的设备与铅垂线的夹角 显示角度线 - 显示水平基准线 + 显示水平线 角度高亮颜色 当相机几乎是水平时的高亮颜色 显示罗盘方向 @@ -153,8 +153,8 @@ 网格 显示裁剪框 屏幕上显示一个预设比例的矩形框体。\n如果你拍照后会裁剪照片/视频为不同长宽比的照片,这就很有用了。\n%s - 显示toast消息 - 是否显示弹出的toast消息 + 显示 \"toast\" 消息 + 是否显示弹出的 \"toast\" 消息 显示缩略图动画 当拍照时显示移动缩略图动画 保持屏幕常亮 @@ -168,7 +168,7 @@ 位置设置… 相机分辨率 照片质量 - 设置保存照片的质量(推荐值90%%)\n%s + 设置保存的照片质量(建议值是90%%)\n%s 存储位置数据 (地理标记) 在照片/视频中存储 GPS 位置数据 存储罗盘方向 @@ -209,8 +209,8 @@ 录像时录音 音频源 麦克风用于录制音频\n%s - 录音通道数 - 规定使用单声道或者立体声进行录音(仅部分设备支持立体声)\n%s + 音频声道 + 规定使用单声道或者立体声进行录音(仅部分设备支持立体声)。 录像时闪光 如果启用,录像时闪光将开启/关闭 (在一段距离外可以用来告诉相机仍然在录制)。 @@ -262,7 +262,7 @@ 开始音频监听 停止音频监听 - 说 \"cheese\" + 说 \"cheese\" 发出大的声音 无限 @@ -424,13 +424,13 @@ 显示罗盘方向线 暂停录像 继续录像 - 显示拍照按钮 + 显示“拍照按钮” 显示拍照、录像按钮。除非你有其他方法(比如硬件快门、使用音量键),否则不应该取消勾选 包围曝光的图片数量\n%s - 开启降噪模式后仍然保存原图。注意这会让保存照片变慢很多。\n%s + 在降噪模式中保存原图。注意这会让保存照片慢很多。\n%s 停止录像\n电量严重不足 检查电池报警 @@ -456,7 +456,7 @@ 快速HDR/包围曝光 允许更快地完成HDR/包围拍照。如果您的设备在使用HDR/包围模式拍照时出现了问题,请禁用此功能。 - 没有在设备上找到文件选择器,所以不能使用辅助图像功能。 + 在设备上没有找到文件选择器,所以不能使用辅助图像功能。 无法打开文件 允许在录像时拍照 @@ -625,15 +625,11 @@ 降噪(NR) 照片水印 保存HDR模式采集的所有原图 - 启用后使用HDR模式拍照会保存三个基本曝光图像以及最终的HDR照片。注意这会使保存速度变慢,尤其是同时启用了“照片水印”或“自动水平”等功能时。 + 启用后使用HDR模式拍照会保存三个基本曝光图像以及最终的HDR照片。注意这会使保存速度变慢,尤其是启用了“照片水印”或自动水平等功能时。 没有获得授权 需要授权 操作相机需要相机权限 - 启用虚拟捕捉修复HDR/包围曝光 - 如果您的设备在使用HDR或包围曝光模式拍摄照片时出现问题(比如包围曝光模式的图像的曝光度相同),请尝试启用此选项。只有同时启用了下面的快速HDR/包围曝光选项时才会有效。 - 发现和连接BLE远程控制设备需蓝牙扫描/连接权限。 - 未知设备(蓝牙连接权限不可用) 录像和语音控制需要麦克风权限 自动开启屏幕补光 @@ -799,7 +795,7 @@ 循环闪光灯的模式 显示闪光灯按钮 - 按下按钮后切换闪光灯模式,而不是弹出选项菜单。 + 按下按钮后循环切换闪光灯模式,而不是弹出菜单选项。 允许RAW包围曝光 @@ -834,7 +830,15 @@ 保存原图 保存原图和debug XML - ID + ID + About + 内部版本 + 相机是从Camera分叉的 + 作者 + 源代码 + 牌照 + 相机信息 + 服务条款 关闭 只隐藏屏幕上的虚拟导航按钮 @@ -918,8 +922,8 @@ 2.4 2.6 2.8 - 辅助图像透明度 - 设置辅助图像的透明度值。值越低越透明,值越高越不透明。\n%s + 辅助图片透明度 + 用于辅助图片的透明度值。较低的值代表更透明,较高的值代表更不透明。\n%s 外部相机 超广角 切换至外部相机 @@ -946,28 +950,13 @@ 保存三轴运动信息 在照片的 Exit 用户备注字段保存设备的三轴运动信息(仅适用于JPEG格式) - 启用此功能后,可以点击屏幕上的麦克风按钮来启动监听。麦克风检测到声音后,自动拍照或者录像。 + 根据噪点拍照。 + 当启用后,使用屏幕上的麦克风按钮来启动监听。 \n%s 点击来对焦,然后按下蓝色相机按钮以拍照。要禁用最大屏幕亮度,查阅设置/屏幕GUI/\"强制最大亮度\"选项。要在 Android 5 之后的设备上保存至 SD 卡,查阅设置/更多相机控制/\"Storage Access Framework\"。如需更多帮助,在设置中点击“在线帮助”。 - 不使用 + 大的声音 语音命令: \"cheese\" - 需要存储读/写权限才能保存照片或视频文件 - 地理标记需要位置权限(将位置数据存储在照片和视频,包括水印和)。还需要位置权限(至少对于 Android 11 及更早版本)才能连接到BLE远程控制设备。 - HDR映射 - 在HDR模式中使用的色调映射算法\n%s - 删除设备 EXIF 信息 - 是否删除 JPEG 照片中的设备 EXIF 信息。其他 EXIF 信息(如坐标/海拔)不受影响,RAW/DNG 和视频也不受影响。\n%s - 不删除设备 EXIF 信息 - 删除设备 EXIF 信息 - 删除日期/时间以外的信息 - 内部版本 - 相机是从OpenCamera分叉的 - 作者 - 源代码 - 牌照 - 相机信息 - 服务条款 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 91012d47e..263fd7db1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ - Camera + Camera 設定 彈出設定 好 (此訊息將不再顯示) @@ -218,7 +218,7 @@ 音源 用於錄製音訊的麥克風。請注意,這個選項真正的行為取決於您的裝置如何實作這個選項。\n%s 音源頻道 - 指定使用單聲道或立體聲來錄音 (立體聲只支援某些裝置)\n%s + 指定使用單聲道或立體聲來錄音 (立體聲只支援某些裝置) 錄影時閃光 如果啟用,錄影時閃光將開啟/關閉 (在一段距離外可以用來判斷相機仍然在錄製) @@ -977,11 +977,4 @@ 大的聲音 音訊指令:「cheese」 - 内部版本 - 相机是从OpenCamera分叉的 - 作者 - 源代码 - 牌照 - 相机信息 - 服务条款 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 274257cc1..32101a90c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ - Camera + Camera Settings Popup settings OK (This message won\'t show again) @@ -219,7 +219,7 @@ Audio source Microphone to use for recording audio. Note that the exact behaviour of the options depends on how the option is implemented on your device.\n%s Audio channels - Specify mono or stereo for recording audio (stereo only supported on some devices)\n%s + Specify mono or stereo for recording audio (stereo only supported on some devices) Flash while recording video If enabled, flash will switch on/off when recording video (can be used to tell camera is still recording at a distance) @@ -528,7 +528,7 @@ Off Ghost image - Display an image over the preview, to help with alignment.\n%s + Overlay an image, to help with alignment.\n%s Off Last photo taken Selected image @@ -911,7 +911,7 @@ This feature provides no guarantees on availability or accuracy. Results are a best guess, and not guaranteed to be meaningful or correct. \n%s - Touch to focus, and press the circular white shutter button to take photos. + Touch to focus, and press the white camera button to take photos. \n\nTo disable maximum screen brightness, see Settings/On screen GUI/\"Force maximum brightness\". To save to SD cards on Android 5+, see Settings/More camera controls/\"Storage Access Framework\". For more help, click \"Online help\" from Settings. @@ -1035,63 +1035,64 @@ Camera is developed by Mark Harman. - <br/>Camera accesses camera sensor and microphone data to fulfil its purpose as a camera. + \nCamera accesses camera sensor and microphone data to fulfil its purpose as a camera. Microphone is also used for the optional \"Audio control\". - <br/>Access to files is needed (at least for Android 9 and earlier) to save resultant files such as photos and videos to your device. - <br/>Location permission is requested in order to deliver the optional geotagging features (for photos and videos, + \nAccess to files is needed (at least for Android 9 and earlier) to save resultant files such as photos and videos to your device. + \nLocation permission is requested in order to deliver the optional geotagging features (for photos and videos, including stamp and subtitles options). When relevant option(s) are enabled, your device location will be stored in photo/video/subtitle files. - <br/>Bluetooth permissions are used to allow the optional feature to discover and connect to Bluetooth LE remote control devices; + \nBluetooth permissions are used to allow the optional feature to discover and connect to Bluetooth LE remote control devices; the Bluetooth remote control feature also requires location permission (on Android 11 or earlier) or Nearby Devices permission (on Android 12 or later). - <br/>Resultant data such as photos or videos can be shared with + \nResultant data such as photos or videos can be shared with other apps if you use the share option in Camera, or when Camera is called by another app on your device, or when you use the Storage Access Framework option to save to another app or service. - <br/>Data handling procedures, data retention and deletion policies: Camera + \nData handling procedures, data retention and deletion policies: Camera does not transmit personal or sensitive information to me. - <br/>Since Camera also uses operating system APIs, you should review relevant privacy policies + \nSince Camera also uses operating system APIs, you should review relevant privacy policies such as for your device, manufacturer, operating system and/or Google accounts. For example: - <br/>*Apps/services such as cloud services on your device may auto-upload photos and videos that are saved on your device. - <br/>If you have inquiries about my privacy policy, please contact me by email at + \n*Apps/services such as cloud services on your device may auto-upload photos and videos that are saved on your device. + \nIf you have inquiries about my privacy policy, please contact me by email at <a href=\"mailto:mark.harman.apps@gmail.com?subject=Open%20Camera%20privacy%20policy\">mark.harman.apps@gmail.com</a>. - Open Source licences - Camera - Camera is © 2013–2024 Mark Harman, released under the GPL v3 or later. Tap here for full licence text and terms of service. + Open Source licences + Camera + Camera is © 2013–2023 Mark Harman, released under the GPL v3 or later. Tap here for full licence text. AndroidX libraries Camera uses the AndroidX/Jetpack libraries under the Apache license version 2.0. Tap here for full licence text. - Google\'s Material Design icons - Camera uses icons from Google\'s Material Design icons + Google\'s Material Design icons + Camera uses icons from Google\'s Material Design icons (https://developer.android.com/design/downloads/index.html , https://design.google.com/icons/ , https://github.com/google/material-design-icons/ , - https://google.github.io/material-design-icons/ , - https://fonts.google.com/icons) + https://google.github.io/material-design-icons/) under the Apache license version 2.0. Some icons include modifications. Tap here for full licence text. Online licences Please tap here for full online licensing information (opens in your browser). - + [This dialog is shown when Camera is updated. You can disable it under Settings/On screen GUI/Show What\'s New dialog.] - \n\nv1.53:\n + \n\nv1.52:\n
              -
            • Improved user interface icons.\n
            • -
            • Smoother zoom for Camera2 API.\n
            • -
            • Camera vendor extensions show percentage progress on supported Android 14 devices.\n
            • -
            • New option for on-screen icon to enable/disable focus peaking.\n
            • -
            • Support for themed/monochrome application icon.\n
            • +
            • Improvements for pinch zooming.\n
            • +
            • Fixes for split-screen and multi-window mode.\n
            • +
            • Support for zoom and on-screen ISO/exposure display when using camera vendor extensions (for supported Android 13+ devices).\n
            • +
            • \"Touch to capture\" option now supports starting and stopping video.\n
            • +
            • Applied a 2s timeout for focusing with original camera API.\n
            • +
            • Improved performance for NR photo mode.\n
            • +
            • No longer cancel panorama when rotating device too far in wrong direction.\n
            • Various other improvements and bug fixes.\n
            Build version - Camera is forked from OpenCamera + Camera is forked from Camera Authors Source code Licence @@ -1105,6 +1106,10 @@ - Panorama, including for front camera.
            Terms of service + Back + Next + Skip + LENS QRCode Add contact -- GitLab From f0198e77fac5563568068d9ab20bd3326b65a36b Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 6 Sep 2024 15:20:33 +0530 Subject: [PATCH 54/58] camera: add incrementing versionCode and versionName --- .gitignore | 1 + app/build.gradle | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/.gitignore b/.gitignore index 46ed4410c..775172ba3 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ _saved/ build/ app/release/ +app/version.properties gfx/ testdata/ diff --git a/app/build.gradle b/app/build.gradle index 775d38616..61d228d03 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,6 +5,62 @@ android { compileSdk 34 compileOptions.encoding = 'UTF-8' + def versionPropsFile = file('version.properties') + Properties versionProps = new Properties() + + if (!versionPropsFile.exists()) { + versionProps['VERSION_CHANGE'] = '0' + versionProps['VERSION_MAJOR'] = '1' + versionProps['VERSION_MINOR'] = '53' + versionProps['VERSION_PATCH'] = '1' + versionProps['VERSION_CODE'] = '90' + versionProps.store(versionPropsFile.newWriter(), null) + } + + def getVersionCode = { -> + if (versionPropsFile.canRead()) { + versionProps.load(new FileInputStream(versionPropsFile)) + def versionChange = versionProps['VERSION_CHANGE'].toInteger() + 1 + def versionMinor = versionProps['VERSION_MINOR'].toInteger() + def versionMajor = versionProps['VERSION_MAJOR'].toInteger() + def versionPatch = versionProps['VERSION_PATCH'].toInteger() + // Up version on each 100 cycles of builds + if (versionChange >= 100) { + versionPatch = versionProps['VERSION_PATCH'].toInteger() + 1 + versionChange = 0 + } + if (versionPatch == 9) { + versionMinor = versionProps['VERSION_MINOR'].toInteger() + 1 + versionPatch = 0 + } + if (versionMinor == 9) { + versionMajor = versionProps['VERSION_MAJOR'].toInteger() + 1 + versionMinor = 0 + } + def versionCode = versionProps['VERSION_CODE'].toInteger() + + versionProps['VERSION_CHANGE'] = versionChange.toString() + versionProps['VERSION_PATCH'] = versionPatch.toString() + versionProps['VERSION_MINOR'] = versionMinor.toString() + versionProps['VERSION_MAJOR'] = versionMajor.toString() + versionProps['VERSION_CODE'] = (versionCode.toInteger() + 1).toString() + versionProps.store(versionPropsFile.newWriter(), null) + return versionCode + } + } + + def getVersionName = { -> + if (versionPropsFile.canRead()) { + versionProps.load(new FileInputStream(versionPropsFile)) + + def versionMajor = versionProps['VERSION_MAJOR'] + def versionMinor = versionProps['VERSION_MINOR'] + def versionPatch = versionProps['VERSION_PATCH'] + + return "${versionMajor}.${versionMinor}.${versionPatch}" + } + } + signingConfigs { // These are public keys provided by AOSP, Use different passcode protected keys for production debug { @@ -21,6 +77,9 @@ android { targetSdkVersion 34 //compileSdkVersion 31 // needed to support appcompat:1.4.0 (which we need for emoji policy support, and not yet ready to target SDK 30) + versionCode getVersionCode() + versionName getVersionName() + renderscriptTargetApi 21 //renderscriptSupportModeEnabled true // don't use support library as it bloats the APK, and we don't need pre-4.4 support // need build tools at least 20 at least to support ScriptIntrinsicHistogram -- GitLab From 2001e783a452e9b93e281320731e16dc556f1275 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 6 Sep 2024 15:46:59 +0530 Subject: [PATCH 55/58] camera: Hide multi-lens in panorama --- .../net/sourceforge/opencamera/ui/MainUI.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java index 18bd12661..3e1307103 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java @@ -1078,6 +1078,10 @@ public class MainUI { int resource; int content_description; int switch_video_content_description; + boolean panorama_recording = main_activity.getApplicationInterface().getPhotoMode() + == MyApplicationInterface.PhotoMode.Panorama && + main_activity.getApplicationInterface().getGyroSensor().isRecording(); + boolean isQrMode = main_activity.getPreview().isQRCode(); // The switch order is camera -> video -> qrcode -> camera... if( main_activity.getPreview().isVideo() ) { if( MyDebug.LOG ) @@ -1085,14 +1089,13 @@ public class MainUI { resource = main_activity.getPreview().isVideoRecording() ? R.drawable.take_video_recording : R.drawable.take_video_selector; content_description = main_activity.getPreview().isVideoRecording() ? R.string.stop_video : R.string.start_video; switch_video_content_description = R.string.switch_to_qrcode; - } else if (main_activity.getPreview().isQRCode()) { + } else if (isQrMode) { if (MyDebug.LOG) Log.d(TAG, "set icon to qrcode"); resource = R.drawable.empty; content_description = 0; switch_video_content_description = R.string.switch_to_photo; - } else if( main_activity.getApplicationInterface().getPhotoMode() == MyApplicationInterface.PhotoMode.Panorama && - main_activity.getApplicationInterface().getGyroSensor().isRecording() ) { + } else if( panorama_recording ) { if( MyDebug.LOG ) Log.d(TAG, "set icon to recording panorama"); resource = R.drawable.baseline_check_white_48; @@ -1118,7 +1121,7 @@ public class MainUI { view.setContentDescription( main_activity.getResources().getString(switch_video_content_description) ); if (main_activity.getPreview().isVideo()) { resource = R.drawable.ic_switch_qrcode; - } else if (main_activity.getPreview().isQRCode()) { + } else if (isQrMode) { resource = R.drawable.ic_photo_camera_white_48dp; } else { // camera resource = R.drawable.ic_videocam_white_48dp; @@ -1127,13 +1130,11 @@ public class MainUI { view.setTag(resource); // for testing // Hide/Show gallery & switch camera icons. - if (main_activity.getPreview().isQRCode()) { - main_activity.findViewById(R.id.gallery).setVisibility(View.INVISIBLE); - main_activity.findViewById(R.id.switch_camera).setVisibility(View.INVISIBLE); - } else { - main_activity.findViewById(R.id.gallery).setVisibility(View.VISIBLE); - main_activity.findViewById(R.id.switch_camera).setVisibility(View.VISIBLE); - } + boolean showGalleryAndSwitch = isQrMode || panorama_recording; + main_activity.findViewById(R.id.gallery).setVisibility( + showGalleryAndSwitch ? View.INVISIBLE : View.VISIBLE); + main_activity.findViewById(R.id.switch_camera).setVisibility( + showGalleryAndSwitch ? View.INVISIBLE : View.VISIBLE); } } -- GitLab From 1fc6571fdc7fb401b131f0f2668e1726ecc22553 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 5 Sep 2024 19:32:16 +0530 Subject: [PATCH 56/58] camera: add gitlab CI --- .gitlab-ci.yml | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..8e2f31462 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,77 @@ +image: "registry.gitlab.e.foundation/e/os/docker-android-apps-cicd:latest" + +stages: + - update-from-upstream + - build + +before_script: + - apt update && apt-get install libncurses5 -y + - export GRADLE_USER_HOME=$(pwd)/.gradle + - chmod +x ./gradlew + +cache: + key: ${CI_PROJECT_ID} + paths: + - .gradle/ + +build: + stage: build + script: + - ./gradlew build -x test + artifacts: + paths: + - app/build/outputs/apk + +.update-from-upstream: + image: registry.gitlab.e.foundation/e/tools/docker-tools:latest + stage: update-from-upstream + rules: + - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_REF_NAME == $LOCAL_BRANCH' + variables: + CI_PROJECT_SSH_URL: git@gitlab.e.foundation:$CI_PROJECT_PATH + GIT_STRATEGY: none + before_script: + - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )' + - eval $(ssh-agent -s) + - echo "${SSH_E_ROBOT_PRIVATE_KEY}" | tr -d '\r' | ssh-add - + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + - echo "${SSH_KNOWN_HOSTS}" > ~/.ssh/known_hosts + - echo "${SSH_KNOWN_HOSTS}" + - chmod 644 ~/.ssh/known_hosts + - git config --global user.email $GITLAB_USER_EMAIL + - git config --global user.name "$GITLAB_USER_NAME" + - cd $CI_BUILD_DIR + - rm -rf $CI_PROJECT_DIR + - git clone $CI_PROJECT_SSH_URL $CI_PROJECT_DIR + - cd $CI_PROJECT_DIR + script: + - git config http.sslverify false + # update $UPSTREAM_BRANCH & tags + - git fetch origin + - git checkout $UPSTREAM_BRANCH + - git remote add upstream $UPSTREAM_URL + - git fetch upstream + - git pull upstream $UPSTREAM_DEFAULT_BRANCH + - git push origin $UPSTREAM_BRANCH + - git push origin --tags + # checkout to latest tag commit to $TEMP_LATEST_TAG_BRANCH + - git checkout $(git describe --tags --abbrev=0) + - git checkout -b $TEMP_LATEST_TAG_BRANCH + # merge $LOCAL_BRANCH with $TEMP_LATEST_TAG_BRANCH & push + - git checkout $LOCAL_BRANCH + - git merge $TEMP_LATEST_TAG_BRANCH + - git push origin $LOCAL_BRANCH + # remove unwanted local branch & remote + - git branch -D $TEMP_LATEST_TAG_BRANCH + - git remote remove upstream + +update-default-branch: + extends: .update-from-upstream + variables: + LOCAL_BRANCH: master + UPSTREAM_BRANCH: upstream/master + UPSTREAM_DEFAULT_BRANCH: master + UPSTREAM_URL: https://git.code.sf.net/p/opencamera/code + TEMP_LATEST_TAG_BRANCH: latest_upstream_tag_branch + allow_failure: true -- GitLab From 0de67f5068dbfe1bfc9fb1d411641c7dc95ca7df Mon Sep 17 00:00:00 2001 From: althafvly Date: Tue, 17 Sep 2024 16:46:37 +0530 Subject: [PATCH 57/58] camera: Don't allow camera lens longpress --- app/src/main/java/net/sourceforge/opencamera/MainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 2e4702a8e..50b3012cc 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -725,7 +725,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen }); // set up switch camera button long click - must be done after setting is_multi_cam - if( n_cameras > 2 ) { + if( n_cameras > 2 && !getResources().getBoolean(R.bool.zoom_level_switch_supported)) { View.OnLongClickListener long_click_listener = new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { -- GitLab From 1ef790d31c13f7cc484702d031cc583ecc69002c Mon Sep 17 00:00:00 2001 From: Nishith Khanna Date: Tue, 17 Sep 2024 16:32:21 +0530 Subject: [PATCH 58/58] Port our theme changes --- app/src/main/AndroidManifest.xml | 10 +- .../sourceforge/opencamera/MainActivity.java | 96 +-- .../opencamera/MyApplicationInterface.java | 14 +- .../sourceforge/opencamera/ScaleUtils.java | 17 + .../opencamera/qr/QrImageAnalyzer.kt | 4 +- .../opencamera/ui/CircleImageView.java | 499 +++++++++++++++ .../opencamera/ui/DrawPreview.java | 116 +--- .../net/sourceforge/opencamera/ui/MainUI.java | 603 ++++++++++++------ .../sourceforge/opencamera/ui/PopupView.java | 104 ++- .../main/res/drawable/bg_rounded_corner.xml | 8 + app/src/main/res/drawable/bg_zoom_control.xml | 10 + app/src/main/res/drawable/ic_album.xml | 16 + app/src/main/res/drawable/ic_arrow_down.xml | 11 + app/src/main/res/drawable/ic_arrow_left.xml | 11 + app/src/main/res/drawable/ic_arrow_right.xml | 11 + app/src/main/res/drawable/ic_bluetooth.xml | 9 + .../main/res/drawable/ic_camera_exposure.xml | 9 + .../drawable/ic_camera_exposure_locked.xml | 12 + .../drawable/ic_camera_exposure_unlocked.xml | 15 + .../res/drawable/ic_camera_flash_auto.xml | 9 + .../main/res/drawable/ic_camera_flash_off.xml | 9 + .../main/res/drawable/ic_camera_flash_on.xml | 9 + .../main/res/drawable/ic_camera_highlight.xml | 12 + .../res/drawable/ic_camera_remove_red_eye.xml | 9 + .../main/res/drawable/ic_camera_shutter.xml | 14 + .../main/res/drawable/ic_camera_toggle.xml | 16 + app/src/main/res/drawable/ic_camera_video.xml | 14 + .../drawable/ic_camera_video_recording.xml | 18 + app/src/main/res/drawable/ic_cancel.xml | 16 + app/src/main/res/drawable/ic_colorize.xml | 9 + app/src/main/res/drawable/ic_delete.xml | 9 + app/src/main/res/drawable/ic_done.xml | 16 + app/src/main/res/drawable/ic_face.xml | 9 + .../main/res/drawable/ic_focus_mode_auto.xml | 9 + .../res/drawable/ic_focus_mode_infinity.xml | 9 + .../res/drawable/ic_focus_mode_locked.xml | 9 + .../main/res/drawable/ic_focus_mode_macro.xml | 9 + app/src/main/res/drawable/ic_iso.xml | 9 + app/src/main/res/drawable/ic_mic.xml | 13 + app/src/main/res/drawable/ic_more.xml | 9 + app/src/main/res/drawable/ic_pause.xml | 16 + app/src/main/res/drawable/ic_play.xml | 16 + .../drawable/ic_preference_auto_stabilise.xml | 9 + .../ic_preference_camera_flash_on.xml | 10 + .../drawable/ic_preference_camera_preview.xml | 9 + .../main/res/drawable/ic_preference_cog.xml | 9 + .../ic_preference_exposure_unlocked.xml | 12 + .../main/res/drawable/ic_preference_face.xml | 10 + .../drawable/ic_preference_focus_peaking.xml | 9 + .../drawable/ic_preference_folder_open.xml | 9 + .../main/res/drawable/ic_preference_help.xml | 10 + .../main/res/drawable/ic_preference_info.xml | 9 + .../res/drawable/ic_preference_location.xml | 9 + .../main/res/drawable/ic_preference_mic.xml | 12 + .../ic_preference_more_horizontal.xml | 9 + .../drawable/ic_preference_on_screen_gui.xml | 9 + .../drawable/ic_preference_photo_settings.xml | 9 + .../ic_preference_photo_size_select.xml | 9 + .../main/res/drawable/ic_preference_power.xml | 9 + .../res/drawable/ic_preference_processing.xml | 18 + .../main/res/drawable/ic_preference_save.xml | 9 + .../drawable/ic_preference_text_format.xml | 9 + .../res/drawable/ic_preference_text_stamp.xml | 9 + .../main/res/drawable/ic_preference_timer.xml | 9 + .../res/drawable/ic_preference_touch_app.xml | 9 + .../drawable/ic_preference_video_settings.xml | 9 + app/src/main/res/drawable/ic_raw.xml | 15 + app/src/main/res/drawable/ic_settings.xml | 9 + app/src/main/res/drawable/ic_share.xml | 9 + .../main/res/drawable/ic_shutter_speed.xml | 9 + .../main/res/drawable/ic_switch_camera.xml | 16 + .../res/drawable/ic_switch_multi_camera.xml | 25 + app/src/main/res/drawable/ic_switch_video.xml | 16 + app/src/main/res/drawable/ic_text_stamp.xml | 10 + .../drawable/ic_white_balance_unlocked.xml | 9 + app/src/main/res/drawable/ic_zoom_in.xml | 9 + app/src/main/res/drawable/ic_zoom_out.xml | 9 + .../res/drawable/popup_camera_flash_auto.xml | 21 + .../res/drawable/popup_camera_flash_off.xml | 18 + .../res/drawable/popup_camera_flash_on.xml | 18 + .../drawable/popup_camera_flash_red_eye.xml | 18 + .../res/drawable/popup_camera_flash_torch.xml | 21 + .../main/res/drawable/shortcut_gallery.xml | 8 +- .../drawable/shortcut_ic_face_white_48dp.xml | 8 +- .../shortcut_ic_photo_camera_white_48dp.xml | 8 +- .../shortcut_ic_videocam_white_48dp.xml | 6 +- .../main/res/drawable/shortcut_settings.xml | 8 +- .../main/res/drawable/take_photo_selector.xml | 4 +- .../take_photo_when_video_recording.xml | 15 + .../res/drawable/take_video_recording.xml | 13 +- .../main/res/drawable/take_video_selector.xml | 4 +- app/src/main/res/layout/activity_main.xml | 581 +++++++++-------- .../res/layout/popupview_arrayoptions.xml | 8 +- .../res/layout/qr_bottom_sheet_dialog.xml | 18 +- .../res/layout/widget_layout_take_photo.xml | 2 +- app/src/main/res/values-v21/styles.xml | 7 +- app/src/main/res/values/arrays.xml | 24 +- app/src/main/res/values/attrs.xml | 9 + app/src/main/res/values/colors.xml | 13 + app/src/main/res/values/dimens.xml | 7 +- app/src/main/res/xml/preferences.xml | 26 +- .../preferences_sub_camera_controls_more.xml | 8 +- app/src/main/res/xml/preferences_sub_gui.xml | 20 +- .../main/res/xml/preferences_sub_location.xml | 2 +- .../main/res/xml/preferences_sub_photo.xml | 4 +- .../xml/preferences_sub_settings_manager.xml | 6 +- 106 files changed, 2364 insertions(+), 754 deletions(-) create mode 100644 app/src/main/java/net/sourceforge/opencamera/ScaleUtils.java create mode 100644 app/src/main/java/net/sourceforge/opencamera/ui/CircleImageView.java create mode 100644 app/src/main/res/drawable/bg_rounded_corner.xml create mode 100644 app/src/main/res/drawable/bg_zoom_control.xml create mode 100644 app/src/main/res/drawable/ic_album.xml create mode 100644 app/src/main/res/drawable/ic_arrow_down.xml create mode 100644 app/src/main/res/drawable/ic_arrow_left.xml create mode 100644 app/src/main/res/drawable/ic_arrow_right.xml create mode 100644 app/src/main/res/drawable/ic_bluetooth.xml create mode 100644 app/src/main/res/drawable/ic_camera_exposure.xml create mode 100644 app/src/main/res/drawable/ic_camera_exposure_locked.xml create mode 100644 app/src/main/res/drawable/ic_camera_exposure_unlocked.xml create mode 100644 app/src/main/res/drawable/ic_camera_flash_auto.xml create mode 100644 app/src/main/res/drawable/ic_camera_flash_off.xml create mode 100644 app/src/main/res/drawable/ic_camera_flash_on.xml create mode 100644 app/src/main/res/drawable/ic_camera_highlight.xml create mode 100644 app/src/main/res/drawable/ic_camera_remove_red_eye.xml create mode 100644 app/src/main/res/drawable/ic_camera_shutter.xml create mode 100644 app/src/main/res/drawable/ic_camera_toggle.xml create mode 100644 app/src/main/res/drawable/ic_camera_video.xml create mode 100644 app/src/main/res/drawable/ic_camera_video_recording.xml create mode 100644 app/src/main/res/drawable/ic_cancel.xml create mode 100644 app/src/main/res/drawable/ic_colorize.xml create mode 100644 app/src/main/res/drawable/ic_delete.xml create mode 100644 app/src/main/res/drawable/ic_done.xml create mode 100644 app/src/main/res/drawable/ic_face.xml create mode 100644 app/src/main/res/drawable/ic_focus_mode_auto.xml create mode 100644 app/src/main/res/drawable/ic_focus_mode_infinity.xml create mode 100644 app/src/main/res/drawable/ic_focus_mode_locked.xml create mode 100644 app/src/main/res/drawable/ic_focus_mode_macro.xml create mode 100644 app/src/main/res/drawable/ic_iso.xml create mode 100644 app/src/main/res/drawable/ic_mic.xml create mode 100644 app/src/main/res/drawable/ic_more.xml create mode 100644 app/src/main/res/drawable/ic_pause.xml create mode 100644 app/src/main/res/drawable/ic_play.xml create mode 100644 app/src/main/res/drawable/ic_preference_auto_stabilise.xml create mode 100644 app/src/main/res/drawable/ic_preference_camera_flash_on.xml create mode 100644 app/src/main/res/drawable/ic_preference_camera_preview.xml create mode 100644 app/src/main/res/drawable/ic_preference_cog.xml create mode 100644 app/src/main/res/drawable/ic_preference_exposure_unlocked.xml create mode 100644 app/src/main/res/drawable/ic_preference_face.xml create mode 100644 app/src/main/res/drawable/ic_preference_focus_peaking.xml create mode 100644 app/src/main/res/drawable/ic_preference_folder_open.xml create mode 100644 app/src/main/res/drawable/ic_preference_help.xml create mode 100644 app/src/main/res/drawable/ic_preference_info.xml create mode 100644 app/src/main/res/drawable/ic_preference_location.xml create mode 100644 app/src/main/res/drawable/ic_preference_mic.xml create mode 100644 app/src/main/res/drawable/ic_preference_more_horizontal.xml create mode 100644 app/src/main/res/drawable/ic_preference_on_screen_gui.xml create mode 100644 app/src/main/res/drawable/ic_preference_photo_settings.xml create mode 100644 app/src/main/res/drawable/ic_preference_photo_size_select.xml create mode 100644 app/src/main/res/drawable/ic_preference_power.xml create mode 100644 app/src/main/res/drawable/ic_preference_processing.xml create mode 100644 app/src/main/res/drawable/ic_preference_save.xml create mode 100644 app/src/main/res/drawable/ic_preference_text_format.xml create mode 100644 app/src/main/res/drawable/ic_preference_text_stamp.xml create mode 100644 app/src/main/res/drawable/ic_preference_timer.xml create mode 100644 app/src/main/res/drawable/ic_preference_touch_app.xml create mode 100644 app/src/main/res/drawable/ic_preference_video_settings.xml create mode 100644 app/src/main/res/drawable/ic_raw.xml create mode 100644 app/src/main/res/drawable/ic_settings.xml create mode 100644 app/src/main/res/drawable/ic_share.xml create mode 100644 app/src/main/res/drawable/ic_shutter_speed.xml create mode 100644 app/src/main/res/drawable/ic_switch_camera.xml create mode 100644 app/src/main/res/drawable/ic_switch_multi_camera.xml create mode 100644 app/src/main/res/drawable/ic_switch_video.xml create mode 100644 app/src/main/res/drawable/ic_text_stamp.xml create mode 100644 app/src/main/res/drawable/ic_white_balance_unlocked.xml create mode 100644 app/src/main/res/drawable/ic_zoom_in.xml create mode 100644 app/src/main/res/drawable/ic_zoom_out.xml create mode 100644 app/src/main/res/drawable/popup_camera_flash_auto.xml create mode 100644 app/src/main/res/drawable/popup_camera_flash_off.xml create mode 100644 app/src/main/res/drawable/popup_camera_flash_on.xml create mode 100644 app/src/main/res/drawable/popup_camera_flash_red_eye.xml create mode 100644 app/src/main/res/drawable/popup_camera_flash_torch.xml create mode 100644 app/src/main/res/drawable/take_photo_when_video_recording.xml create mode 100644 app/src/main/res/values/attrs.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2ae6ec27e..525732197 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -93,7 +93,7 @@ @@ -144,7 +144,7 @@ @@ -155,7 +155,7 @@ @@ -166,7 +166,7 @@ diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java index 50b3012cc..222b911eb 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java +++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java @@ -11,6 +11,7 @@ import net.sourceforge.opencamera.preview.Preview; import net.sourceforge.opencamera.preview.VideoProfile; import net.sourceforge.opencamera.qr.QrImageAnalyzer; import net.sourceforge.opencamera.remotecontrol.BluetoothRemoteControl; +import net.sourceforge.opencamera.ui.CircleImageView; import net.sourceforge.opencamera.ui.DrawPreview; import net.sourceforge.opencamera.ui.FolderChooserDialog; import net.sourceforge.opencamera.ui.MainUI; @@ -26,7 +27,7 @@ import java.io.InputStream; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Hashtable; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -166,7 +167,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen private boolean camera_in_background; // whether the camera is covered by a fragment/dialog (such as settings or folder picker) private GestureDetector gestureDetector; private boolean screen_is_locked; // whether screen is "locked" - this is Open Camera's own lock to guard against accidental presses, not the standard Android lock - private final Map preloaded_bitmap_resources = new Hashtable<>(); + private final Map preloaded_bitmap_resources = new HashMap<>(); private ValueAnimator gallery_save_anim; private boolean last_continuous_fast_burst; // whether the last photo operation was a continuous_fast_burst private Future update_gallery_future; @@ -603,7 +604,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } // initialise on-screen button visibility - View switchCameraButton = findViewById(R.id.switch_camera); + ImageButton switchCameraButton = findViewById(R.id.switch_camera); switchCameraButton.setVisibility(n_cameras > 1 ? View.VISIBLE : View.GONE); // switchMultiCameraButton visibility updated below in mainUI.updateOnScreenIcons(), as it also depends on user preference View speechRecognizerButton = findViewById(R.id.audio_control); @@ -612,10 +613,12 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "onCreate: time after setting button visibility: " + (System.currentTimeMillis() - debug_time)); View pauseVideoButton = findViewById(R.id.pause_video); pauseVideoButton.setVisibility(View.GONE); - View takePhotoVideoButton = findViewById(R.id.take_photo_when_video_recording); + ImageButton takePhotoVideoButton = findViewById(R.id.take_photo_when_video_recording); takePhotoVideoButton.setVisibility(View.GONE); View cancelPanoramaButton = findViewById(R.id.cancel_panorama); cancelPanoramaButton.setVisibility(View.GONE); + View finishPanoramaButton = findViewById(R.id.finish_panorama); + finishPanoramaButton.setVisibility(View.GONE); // We initialise optional controls to invisible/gone, so they don't show while the camera is opening - the actual visibility is // set in cameraSetup(). @@ -629,6 +632,8 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen zoomControls.setVisibility(View.GONE); View zoomSeekbar = findViewById(R.id.zoom_seekbar); zoomSeekbar.setVisibility(View.INVISIBLE); + View zoomSeekbarIcon = findViewById(R.id.zoom_seekbar_icon); + zoomSeekbarIcon.setVisibility(View.INVISIBLE); // initialise state of on-screen icons mainUI.updateOnScreenIcons(); @@ -1684,11 +1689,11 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen } public void zoomIn() { - zoomByStep(1); + zoomByStep(-1); } public void zoomOut() { - zoomByStep(-1); + zoomByStep(1); } public void changeExposure(int change) { @@ -2243,6 +2248,13 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen applicationInterface.stopPanorama(true); } + public void clickedFinishPanorama(View view) { + if (MyDebug.LOG) { + Log.d(TAG, "clickedFinishPanorama"); + } + this.takePicture(false); + } + public void clickedCycleRaw(View view) { if( MyDebug.LOG ) Log.d(TAG, "clickedCycleRaw"); @@ -4670,7 +4682,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen private void updateGalleryIconToBlank() { if( MyDebug.LOG ) Log.d(TAG, "updateGalleryIconToBlank"); - ImageButton galleryButton = this.findViewById(R.id.gallery); + CircleImageView galleryButton = this.findViewById(R.id.gallery); int bottom = galleryButton.getPaddingBottom(); int top = galleryButton.getPaddingTop(); int right = galleryButton.getPaddingRight(); @@ -4678,7 +4690,8 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen /*if( MyDebug.LOG ) Log.d(TAG, "padding: " + bottom);*/ galleryButton.setImageBitmap(null); - galleryButton.setImageResource(R.drawable.baseline_photo_library_white_48); + galleryButton.setImageResource(R.drawable.ic_album); + galleryButton.setBorderWidth(0); // workaround for setImageResource also resetting padding, Android bug galleryButton.setPadding(left, top, right, bottom); gallery_bitmap = null; @@ -4698,8 +4711,9 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "cancel update_gallery_future"); update_gallery_future.cancel(true); } - ImageButton galleryButton = this.findViewById(R.id.gallery); + CircleImageView galleryButton = this.findViewById(R.id.gallery); galleryButton.setImageBitmap(thumbnail); + galleryButton.setBorderWidth(6); gallery_bitmap = thumbnail; } @@ -4872,7 +4886,7 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen this.runOnUiThread(new Runnable() { public void run() { - final ImageButton galleryButton = findViewById(R.id.gallery); + final CircleImageView galleryButton = findViewById(R.id.gallery); if( started ) { //galleryButton.setColorFilter(0x80ffffff, PorterDuff.Mode.MULTIPLY); if( gallery_save_anim == null ) { @@ -5908,36 +5922,38 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen Log.d(TAG, "set up zoom"); if( MyDebug.LOG ) Log.d(TAG, "has_zoom? " + preview.supportsZoom()); - ZoomControls zoomControls = findViewById(R.id.zoom); + View zoomControlHolder = findViewById(R.id.zoom); SeekBar zoomSeekBar = findViewById(R.id.zoom_seekbar); + View zoomSeekbarIcon = findViewById(R.id.zoom_seekbar_icon); if( preview.supportsZoom() ) { if( sharedPreferences.getBoolean(PreferenceKeys.ShowZoomControlsPreferenceKey, false) ) { - zoomControls.setIsZoomInEnabled(true); - zoomControls.setIsZoomOutEnabled(true); - zoomControls.setZoomSpeed(20); - - zoomControls.setOnZoomInClickListener(new View.OnClickListener(){ - public void onClick(View v){ - zoomIn(); - } - }); - zoomControls.setOnZoomOutClickListener(new View.OnClickListener(){ - public void onClick(View v){ - zoomOut(); - } - }); if( !mainUI.inImmersiveMode() ) { - zoomControls.setVisibility(View.VISIBLE); + View zoomInButton = findViewById(R.id.button_zoom_in); + View zoomOutButton = findViewById(R.id.button_zoom_out); + zoomInButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + zoomIn(); + } + }); + + zoomOutButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + zoomOut(); + } + }); + zoomControlHolder.setVisibility(View.VISIBLE); } } else { - zoomControls.setVisibility(View.GONE); + zoomControlHolder.setVisibility(View.GONE); } zoomSeekBar.setOnSeekBarChangeListener(null); // clear an existing listener - don't want to call the listener when setting up the progress bar to match the existing state zoomSeekBar.setMax(preview.getMaxZoom()); - zoomSeekBar.setProgress(preview.getMaxZoom()-preview.getCameraController().getZoom()); + zoomSeekBar.setProgress(preview.getCameraController().getZoom()); zoomSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { @@ -5947,9 +5963,8 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen // indirectly set zoom via this method, from setting the zoom slider // if hasSmoothZoom()==true, then the preview already handled zooming to the current value if( !preview.hasSmoothZoom() ) - preview.zoomTo(preview.getMaxZoom() - progress, false); - - updateMultiCameraIcon(); + preview.zoomTo(progress, false); + updateMultiCameraIcon(); } @Override @@ -5964,20 +5979,23 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen if( sharedPreferences.getBoolean(PreferenceKeys.ShowZoomSliderControlsPreferenceKey, false) ) { if( !mainUI.inImmersiveMode() ) { zoomSeekBar.setVisibility(View.VISIBLE); + zoomSeekbarIcon.setVisibility(View.VISIBLE); } } else { zoomSeekBar.setVisibility(View.INVISIBLE); // should be INVISIBLE not GONE, as the focus_seekbar is aligned to be left to this; in future we might want this similarly for exposure panel + zoomSeekbarIcon.setVisibility(View.INVISIBLE); } } else { - zoomControls.setVisibility(View.GONE); + zoomControlHolder.setVisibility(View.GONE); zoomSeekBar.setVisibility(View.INVISIBLE); // should be INVISIBLE not GONE, as the focus_seekbar is aligned to be left to this; in future we might want this similarly for the exposure panel + zoomSeekbarIcon.setVisibility(View.INVISIBLE); } if( MyDebug.LOG ) Log.d(TAG, "cameraSetup: time after setting up zoom: " + (System.currentTimeMillis() - debug_time)); - View takePhotoButton = findViewById(R.id.take_photo); + ImageButton takePhotoButton = findViewById(R.id.take_photo); if( sharedPreferences.getBoolean(PreferenceKeys.ShowTakePhotoPreferenceKey, true) ) { if( !mainUI.inImmersiveMode() ) { takePhotoButton.setVisibility(View.VISIBLE); @@ -6094,18 +6112,6 @@ public class MainActivity extends AppCompatActivity implements PreferenceFragmen public void onStopTrackingTouch(SeekBar seekBar) { } }); - - ZoomControls seek_bar_zoom = findViewById(R.id.exposure_seekbar_zoom); - seek_bar_zoom.setOnZoomInClickListener(new View.OnClickListener(){ - public void onClick(View v){ - changeExposure(1); - } - }); - seek_bar_zoom.setOnZoomOutClickListener(new View.OnClickListener(){ - public void onClick(View v){ - changeExposure(-1); - } - }); } } if( MyDebug.LOG ) diff --git a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java index 69c0b5de7..0ef85af2c 100644 --- a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java +++ b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java @@ -18,6 +18,7 @@ import net.sourceforge.opencamera.preview.ApplicationInterface; import net.sourceforge.opencamera.preview.BasicApplicationInterface; import net.sourceforge.opencamera.preview.Preview; import net.sourceforge.opencamera.preview.VideoProfile; +import net.sourceforge.opencamera.ui.CircleImageView; import net.sourceforge.opencamera.ui.DrawPreview; import android.annotation.TargetApi; @@ -1887,9 +1888,7 @@ public class MyApplicationInterface extends BasicApplicationInterface { panorama_pic_accepted = false; panorama_dir_left_to_right = true; - main_activity.getMainUI().setTakePhotoIcon(); - View cancelPanoramaButton = main_activity.findViewById(R.id.cancel_panorama); - cancelPanoramaButton.setVisibility(View.VISIBLE); + main_activity.getMainUI().handlePanoromaModeButtonsVisibility(); main_activity.getMainUI().closeExposureUI(); // close seekbars if open (popup is already closed when taking a photo) // taking the photo will end up calling MainUI.showGUI(), which will hide the other on-screen icons } @@ -1925,9 +1924,7 @@ public class MyApplicationInterface extends BasicApplicationInterface { if( is_cancelled ) { imageSaver.flushImageBatch(); } - main_activity.getMainUI().setTakePhotoIcon(); - View cancelPanoramaButton = main_activity.findViewById(R.id.cancel_panorama); - cancelPanoramaButton.setVisibility(View.GONE); + main_activity.getMainUI().handlePanoromaModeButtonsVisibility(); main_activity.getMainUI().showGUI(); // refresh UI icons now that we've stopped panorama } @@ -2352,6 +2349,9 @@ public class MyApplicationInterface extends BasicApplicationInterface { if( dategeo_subtitles && video_method != ApplicationInterface.VideoMethod.URI ) { startVideoSubtitlesTask(video_method); } + + ImageButton view = main_activity.findViewById(R.id.take_photo); + view.setImageResource(R.drawable.ic_camera_video_recording); } @Override @@ -2458,7 +2458,7 @@ public class MyApplicationInterface extends BasicApplicationInterface { } } if( thumbnail != null ) { - ImageButton galleryButton = main_activity.findViewById(R.id.gallery); + CircleImageView galleryButton = main_activity.findViewById(R.id.gallery); int width = thumbnail.getWidth(); int height = thumbnail.getHeight(); if( MyDebug.LOG ) diff --git a/app/src/main/java/net/sourceforge/opencamera/ScaleUtils.java b/app/src/main/java/net/sourceforge/opencamera/ScaleUtils.java new file mode 100644 index 000000000..0b50e16b8 --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ScaleUtils.java @@ -0,0 +1,17 @@ +package net.sourceforge.opencamera; + +import android.content.Context; + +public class ScaleUtils { + + private ScaleUtils() { + } + + public static float convertPxToDp(Context context, float px) { + return px / context.getResources().getDisplayMetrics().density; + } + + public static float convertDpToPx(Context context, float dp) { + return dp * context.getResources().getDisplayMetrics().density; + } +} diff --git a/app/src/main/java/net/sourceforge/opencamera/qr/QrImageAnalyzer.kt b/app/src/main/java/net/sourceforge/opencamera/qr/QrImageAnalyzer.kt index a9fde743a..e4676434e 100644 --- a/app/src/main/java/net/sourceforge/opencamera/qr/QrImageAnalyzer.kt +++ b/app/src/main/java/net/sourceforge/opencamera/qr/QrImageAnalyzer.kt @@ -153,8 +153,8 @@ class QrImageAnalyzer(private val activity: Activity, private val scope: Corouti )?.let { DrawableCompat.wrap(it.mutate()).apply { DrawableCompat.setTint( - this, activity.getThemeColor( - com.google.android.material.R.attr.colorOnBackground + this, activity.getColor( + R.color.e_icon_color ) ) } diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/CircleImageView.java b/app/src/main/java/net/sourceforge/opencamera/ui/CircleImageView.java new file mode 100644 index 000000000..5a545c62b --- /dev/null +++ b/app/src/main/java/net/sourceforge/opencamera/ui/CircleImageView.java @@ -0,0 +1,499 @@ +package net.sourceforge.opencamera.ui; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Matrix; +import android.graphics.Outline; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Shader; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewOutlineProvider; +import android.widget.ImageView; + +import net.sourceforge.opencamera.R; + +@SuppressWarnings("UnusedDeclaration") +public class CircleImageView extends ImageView { + + private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP; + + private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888; + private static final int COLORDRAWABLE_DIMENSION = 2; + + private static final int DEFAULT_BORDER_WIDTH = 0; + private static final int DEFAULT_BORDER_COLOR = Color.BLACK; + private static final int DEFAULT_CIRCLE_BACKGROUND_COLOR = Color.TRANSPARENT; + private static final int DEFAULT_IMAGE_ALPHA = 255; + private static final boolean DEFAULT_BORDER_OVERLAY = false; + + private final RectF mDrawableRect = new RectF(); + private final RectF mBorderRect = new RectF(); + + private final Matrix mShaderMatrix = new Matrix(); + private final Paint mBitmapPaint = new Paint(); + private final Paint mBorderPaint = new Paint(); + private final Paint mCircleBackgroundPaint = new Paint(); + + private int mBorderColor = DEFAULT_BORDER_COLOR; + private int mBorderWidth = DEFAULT_BORDER_WIDTH; + private int mCircleBackgroundColor = DEFAULT_CIRCLE_BACKGROUND_COLOR; + private int mImageAlpha = DEFAULT_IMAGE_ALPHA; + + private Bitmap mBitmap; + private Canvas mBitmapCanvas; + + private float mDrawableRadius; + private float mBorderRadius; + + private ColorFilter mColorFilter; + + private boolean mInitialized; + private boolean mRebuildShader; + private boolean mDrawableDirty; + + private boolean mBorderOverlay; + private boolean mDisableCircularTransformation; + + public CircleImageView(Context context) { + super(context); + + init(); + } + + public CircleImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CircleImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0); + + mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_civ_border_width, DEFAULT_BORDER_WIDTH); + mBorderColor = a.getColor(R.styleable.CircleImageView_civ_border_color, DEFAULT_BORDER_COLOR); + mBorderOverlay = a.getBoolean(R.styleable.CircleImageView_civ_border_overlay, DEFAULT_BORDER_OVERLAY); + mCircleBackgroundColor = a.getColor(R.styleable.CircleImageView_civ_circle_background_color, DEFAULT_CIRCLE_BACKGROUND_COLOR); + + a.recycle(); + + init(); + } + + private void init() { + mInitialized = true; + + super.setScaleType(SCALE_TYPE); + + mBitmapPaint.setAntiAlias(true); + mBitmapPaint.setDither(true); + mBitmapPaint.setFilterBitmap(true); + mBitmapPaint.setAlpha(mImageAlpha); + mBitmapPaint.setColorFilter(mColorFilter); + + mBorderPaint.setStyle(Paint.Style.STROKE); + mBorderPaint.setAntiAlias(true); + mBorderPaint.setColor(mBorderColor); + mBorderPaint.setStrokeWidth(mBorderWidth); + + mCircleBackgroundPaint.setStyle(Paint.Style.FILL); + mCircleBackgroundPaint.setAntiAlias(true); + mCircleBackgroundPaint.setColor(mCircleBackgroundColor); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + setOutlineProvider(new OutlineProvider()); + } + } + + @Override + public void setScaleType(ScaleType scaleType) { + if (scaleType != SCALE_TYPE) { + throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType)); + } + } + + @Override + public void setAdjustViewBounds(boolean adjustViewBounds) { + if (adjustViewBounds) { + throw new IllegalArgumentException("adjustViewBounds not supported."); + } + } + + @SuppressLint("CanvasSize") + @Override + protected void onDraw(Canvas canvas) { + if (mDisableCircularTransformation) { + super.onDraw(canvas); + return; + } + + if (mCircleBackgroundColor != Color.TRANSPARENT) { + canvas.drawCircle(mDrawableRect.centerX(), mDrawableRect.centerY(), mDrawableRadius, mCircleBackgroundPaint); + } + + if (mBitmap != null) { + if (mDrawableDirty && mBitmapCanvas != null) { + mDrawableDirty = false; + Drawable drawable = getDrawable(); + drawable.setBounds(0, 0, mBitmapCanvas.getWidth(), mBitmapCanvas.getHeight()); + drawable.draw(mBitmapCanvas); + } + + if (mRebuildShader) { + mRebuildShader = false; + + BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); + bitmapShader.setLocalMatrix(mShaderMatrix); + + mBitmapPaint.setShader(bitmapShader); + } + + canvas.drawCircle(mDrawableRect.centerX(), mDrawableRect.centerY(), mDrawableRadius, mBitmapPaint); + } + + if (mBorderWidth > 0) { + canvas.drawCircle(mBorderRect.centerX(), mBorderRect.centerY(), mBorderRadius, mBorderPaint); + } + } + + @Override + public void invalidateDrawable(@NonNull Drawable dr) { + mDrawableDirty = true; + invalidate(); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + updateDimensions(); + invalidate(); + } + + @Override + public void setPadding(int left, int top, int right, int bottom) { + super.setPadding(left, top, right, bottom); + updateDimensions(); + invalidate(); + } + + @Override + public void setPaddingRelative(int start, int top, int end, int bottom) { + super.setPaddingRelative(start, top, end, bottom); + updateDimensions(); + invalidate(); + } + + public int getBorderColor() { + return mBorderColor; + } + + public void setBorderColor(@ColorInt int borderColor) { + if (borderColor == mBorderColor) { + return; + } + + mBorderColor = borderColor; + mBorderPaint.setColor(borderColor); + invalidate(); + } + + public int getCircleBackgroundColor() { + return mCircleBackgroundColor; + } + + public void setCircleBackgroundColor(@ColorInt int circleBackgroundColor) { + if (circleBackgroundColor == mCircleBackgroundColor) { + return; + } + + mCircleBackgroundColor = circleBackgroundColor; + mCircleBackgroundPaint.setColor(circleBackgroundColor); + invalidate(); + } + + /** + * @deprecated Use {@link #setCircleBackgroundColor(int)} instead + */ + @Deprecated + public void setCircleBackgroundColorResource(@ColorRes int circleBackgroundRes) { + setCircleBackgroundColor(getContext().getResources().getColor(circleBackgroundRes)); + } + + public int getBorderWidth() { + return mBorderWidth; + } + + public void setBorderWidth(int borderWidth) { + if (borderWidth == mBorderWidth) { + return; + } + + mBorderWidth = borderWidth; + mBorderPaint.setStrokeWidth(borderWidth); + updateDimensions(); + invalidate(); + } + + public boolean isBorderOverlay() { + return mBorderOverlay; + } + + public void setBorderOverlay(boolean borderOverlay) { + if (borderOverlay == mBorderOverlay) { + return; + } + + mBorderOverlay = borderOverlay; + updateDimensions(); + invalidate(); + } + + public boolean isDisableCircularTransformation() { + return mDisableCircularTransformation; + } + + public void setDisableCircularTransformation(boolean disableCircularTransformation) { + if (disableCircularTransformation == mDisableCircularTransformation) { + return; + } + + mDisableCircularTransformation = disableCircularTransformation; + + if (disableCircularTransformation) { + mBitmap = null; + mBitmapCanvas = null; + mBitmapPaint.setShader(null); + } else { + initializeBitmap(); + } + + invalidate(); + } + + @Override + public void setImageBitmap(Bitmap bm) { + super.setImageBitmap(bm); + initializeBitmap(); + invalidate(); + } + + @Override + public void setImageDrawable(Drawable drawable) { + super.setImageDrawable(drawable); + initializeBitmap(); + invalidate(); + } + + @Override + public void setImageResource(@DrawableRes int resId) { + super.setImageResource(resId); + initializeBitmap(); + invalidate(); + } + + @Override + public void setImageURI(Uri uri) { + super.setImageURI(uri); + initializeBitmap(); + invalidate(); + } + + @Override + public void setImageAlpha(int alpha) { + alpha &= 0xFF; + + if (alpha == mImageAlpha) { + return; + } + + mImageAlpha = alpha; + + // This might be called during ImageView construction before + // member initialization has finished on API level >= 16. + if (mInitialized) { + mBitmapPaint.setAlpha(alpha); + invalidate(); + } + } + + @Override + public int getImageAlpha() { + return mImageAlpha; + } + + @Override + public void setColorFilter(ColorFilter cf) { + if (cf == mColorFilter) { + return; + } + + mColorFilter = cf; + + // This might be called during ImageView construction before + // member initialization has finished on API level <= 19. + if (mInitialized) { + mBitmapPaint.setColorFilter(cf); + invalidate(); + } + } + + @Override + public ColorFilter getColorFilter() { + return mColorFilter; + } + + private Bitmap getBitmapFromDrawable(Drawable drawable) { + if (drawable == null) { + return null; + } + + if (drawable instanceof BitmapDrawable) { + return ((BitmapDrawable) drawable).getBitmap(); + } + + try { + Bitmap bitmap; + + if (drawable instanceof ColorDrawable) { + bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG); + } else { + bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG); + } + + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + return bitmap; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private void initializeBitmap() { + mBitmap = getBitmapFromDrawable(getDrawable()); + + if (mBitmap != null && mBitmap.isMutable()) { + mBitmapCanvas = new Canvas(mBitmap); + } else { + mBitmapCanvas = null; + } + + if (!mInitialized) { + return; + } + + if (mBitmap != null) { + updateShaderMatrix(); + } else { + mBitmapPaint.setShader(null); + } + } + + private void updateDimensions() { + mBorderRect.set(calculateBounds()); + mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2.0f, (mBorderRect.width() - mBorderWidth) / 2.0f); + + mDrawableRect.set(mBorderRect); + if (!mBorderOverlay && mBorderWidth > 0) { + mDrawableRect.inset(mBorderWidth - 1.0f, mBorderWidth - 1.0f); + } + mDrawableRadius = Math.min(mDrawableRect.height() / 2.0f, mDrawableRect.width() / 2.0f); + + updateShaderMatrix(); + } + + private RectF calculateBounds() { + int availableWidth = getWidth() - getPaddingLeft() - getPaddingRight(); + int availableHeight = getHeight() - getPaddingTop() - getPaddingBottom(); + + int sideLength = Math.min(availableWidth, availableHeight); + + float left = getPaddingLeft() + (availableWidth - sideLength) / 2f; + float top = getPaddingTop() + (availableHeight - sideLength) / 2f; + + return new RectF(left, top, left + sideLength, top + sideLength); + } + + private void updateShaderMatrix() { + if (mBitmap == null) { + return; + } + + float scale; + float dx = 0; + float dy = 0; + + mShaderMatrix.set(null); + + int bitmapHeight = mBitmap.getHeight(); + int bitmapWidth = mBitmap.getWidth(); + + if (bitmapWidth * mDrawableRect.height() > mDrawableRect.width() * bitmapHeight) { + scale = mDrawableRect.height() / (float) bitmapHeight; + dx = (mDrawableRect.width() - bitmapWidth * scale) * 0.5f; + } else { + scale = mDrawableRect.width() / (float) bitmapWidth; + dy = (mDrawableRect.height() - bitmapHeight * scale) * 0.5f; + } + + mShaderMatrix.setScale(scale, scale); + mShaderMatrix.postTranslate((int) (dx + 0.5f) + mDrawableRect.left, (int) (dy + 0.5f) + mDrawableRect.top); + + mRebuildShader = true; + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouchEvent(MotionEvent event) { + if (mDisableCircularTransformation) { + return super.onTouchEvent(event); + } + + return inTouchableArea(event.getX(), event.getY()) && super.onTouchEvent(event); + } + + private boolean inTouchableArea(float x, float y) { + if (mBorderRect.isEmpty()) { + return true; + } + + return Math.pow(x - mBorderRect.centerX(), 2) + Math.pow(y - mBorderRect.centerY(), 2) <= Math.pow(mBorderRadius, 2); + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private class OutlineProvider extends ViewOutlineProvider { + + @Override + public void getOutline(View view, Outline outline) { + if (mDisableCircularTransformation) { + ViewOutlineProvider.BACKGROUND.getOutline(view, outline); + } else { + Rect bounds = new Rect(); + mBorderRect.roundOut(bounds); + outline.setRoundRect(bounds, bounds.width() / 2.0f); + } + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java index 0f70450a6..3e49690a9 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java @@ -45,6 +45,7 @@ import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Typeface; +import android.graphics.drawable.Drawable; import android.location.Location; import android.net.Uri; import android.os.BatteryManager; @@ -58,6 +59,8 @@ import android.view.Surface; import android.view.View; import android.widget.RelativeLayout; +import androidx.annotation.NonNull; + public class DrawPreview { private static final String TAG = "DrawPreview"; @@ -246,7 +249,7 @@ public class DrawPreview { private Bitmap location_off_bitmap; private Bitmap raw_jpeg_bitmap; private Bitmap raw_only_bitmap; - private Bitmap auto_stabilise_bitmap; + private Drawable auto_stabilise_drawable; private Bitmap dro_bitmap; private Bitmap hdr_bitmap; private Bitmap panorama_bitmap; @@ -259,8 +262,8 @@ public class DrawPreview { private Bitmap x_bokeh_bitmap; private Bitmap x_beauty_bitmap; private Bitmap photostamp_bitmap; - private Bitmap flash_bitmap; - private Bitmap face_detection_bitmap; + private Drawable flash_drawable; + private Drawable face_detection_drawable; private Bitmap audio_disabled_bitmap; private Bitmap high_speed_fps_bitmap; private Bitmap slow_motion_bitmap; @@ -347,7 +350,7 @@ public class DrawPreview { location_off_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_gps_off_white_48dp); raw_jpeg_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.raw_icon); raw_only_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.raw_only_icon); - auto_stabilise_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.auto_stabilise_icon); + auto_stabilise_drawable = getContext().getResources().getDrawable(R.drawable.ic_preference_auto_stabilise); dro_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.dro_icon); hdr_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_hdr_on_white_48dp); panorama_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.baseline_panorama_horizontal_white_48); @@ -359,8 +362,8 @@ public class DrawPreview { x_bokeh_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.baseline_portrait_white_48); x_beauty_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.baseline_face_retouching_natural_white_48); photostamp_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_text_format_white_48dp); - flash_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.flash_on); - face_detection_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_face_white_48dp); + flash_drawable = getContext().getResources().getDrawable(R.drawable.ic_camera_flash_on); + face_detection_drawable = getContext().getResources().getDrawable(R.drawable.ic_face); audio_disabled_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_mic_off_white_48dp); high_speed_fps_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_fast_forward_white_48dp); slow_motion_bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_slow_motion_video_white_48dp); @@ -396,9 +399,8 @@ public class DrawPreview { raw_only_bitmap.recycle(); raw_only_bitmap = null; } - if( auto_stabilise_bitmap != null ) { - auto_stabilise_bitmap.recycle(); - auto_stabilise_bitmap = null; + if( auto_stabilise_drawable != null ) { + auto_stabilise_drawable = null; } if( dro_bitmap != null ) { dro_bitmap.recycle(); @@ -444,13 +446,9 @@ public class DrawPreview { photostamp_bitmap.recycle(); photostamp_bitmap = null; } - if( flash_bitmap != null ) { - flash_bitmap.recycle(); - flash_bitmap = null; - } - if( face_detection_bitmap != null ) { - face_detection_bitmap.recycle(); - face_detection_bitmap = null; + + if( face_detection_drawable != null ) { + face_detection_drawable = null; } if( audio_disabled_bitmap != null ) { audio_disabled_bitmap.recycle(); @@ -1183,7 +1181,7 @@ public class DrawPreview { int ui_rotation = preview.getUIRotation(); // set up text etc for the multiple lines of "info" (time, free mem, etc) - p.setTextSize(16 * scale_font + 0.5f); // convert dps to pixels + p.setTextSize(12.6f * scale_font + 0.5f); // convert dps to pixels p.setTextAlign(Paint.Align.LEFT); int location_x = top_x; int location_y = top_y; @@ -1314,7 +1312,7 @@ public class DrawPreview { Color.WHITE, Color.BLACK, location_x, bottom_y, MyApplicationInterface.Alignment.ALIGNMENT_BOTTOM, null, MyApplicationInterface.Shadow.SHADOW_OUTLINE); } - p.setTextSize(16 * scale_font + 0.5f); // Restore text size + p.setTextSize(12.6f * scale_font + 0.5f); // Restore text size if( camera_controller != null && show_iso_pref ) { if( iso_exposure_string == null || time_ms > last_iso_exposure_time + 500 ) { @@ -1457,7 +1455,7 @@ public class DrawPreview { p.setAlpha(64); canvas.drawRect(icon_dest, p); p.setAlpha(255); - canvas.drawBitmap(face_detection_bitmap, null, icon_dest, p); + face_detection_drawable.draw(canvas); if( device_ui_rotation == 180 ) { location_x2 -= icon_size + flash_padding; @@ -1474,7 +1472,7 @@ public class DrawPreview { p.setAlpha(64); canvas.drawRect(icon_dest, p); p.setAlpha(255); - canvas.drawBitmap(auto_stabilise_bitmap, null, icon_dest, p); + auto_stabilise_drawable.draw(canvas); if( device_ui_rotation == 180 ) { location_x2 -= icon_size + flash_padding; @@ -1630,7 +1628,7 @@ public class DrawPreview { p.setAlpha((int)(64*alpha)); canvas.drawRect(icon_dest, p); p.setAlpha((int)(255*alpha)); - canvas.drawBitmap(flash_bitmap, null, icon_dest, p); + flash_drawable.draw(canvas); p.setAlpha(255); } else { @@ -2107,7 +2105,7 @@ public class DrawPreview { // Convert the dps to pixels, based on density scale p.setTextSize(14 * scale_font + 0.5f); // convert dps to pixels p.setTextAlign(Paint.Align.CENTER); - applicationInterface.drawTextWithBackground(canvas, p, getContext().getResources().getString(R.string.zoom) + ": " + zoom_ratio +"x", Color.WHITE, Color.BLACK, canvas.getWidth() / 2, text_base_y - text_y, MyApplicationInterface.Alignment.ALIGNMENT_BOTTOM, ybounds_text, MyApplicationInterface.Shadow.SHADOW_OUTLINE); + applicationInterface.drawTextWithBackground(canvas, p, getZoomText(zoom_ratio), Color.WHITE, Color.BLACK, canvas.getWidth() / 2, text_base_y - text_y - 100, MyApplicationInterface.Alignment.ALIGNMENT_BOTTOM, ybounds_text, MyApplicationInterface.Shadow.SHADOW_OUTLINE); } } @@ -2148,7 +2146,7 @@ public class DrawPreview { } int top_x = (int) (5 * scale_dp + 0.5f); // convert dps to pixels - int top_y = (int) (5 * scale_dp + 0.5f); // convert dps to pixels + int top_y = (int) (15 * scale_dp + 0.5f); // convert dps to pixels View top_icon = main_activity.getMainUI().getTopIcon(); if( top_icon != null ) { if( last_top_icon_shift_time == 0 || time_ms > last_top_icon_shift_time + 1000 ) { @@ -2190,73 +2188,6 @@ public class DrawPreview { } } - { - /*int focus_seekbars_margin_left_dp = 85; - if( want_histogram ) - focus_seekbars_margin_left_dp += DrawPreview.histogram_height_dp;*/ - // 135 needed to make room for on-screen info lines in DrawPreview.onDrawInfoLines(), including the histogram - // but we also need to take the top_icon_shift into account, for widescreen aspect ratios and "icons along top" UI placement - int focus_seekbars_margin_left_dp = 135; - int new_focus_seekbars_margin_left = (int) (focus_seekbars_margin_left_dp * scale_dp + 0.5f); // convert dps to pixels - if( top_icon_shift > 0 ) { - //noinspection SuspiciousNameCombination - new_focus_seekbars_margin_left += top_icon_shift; - } - - if( focus_seekbars_margin_left == -1 || new_focus_seekbars_margin_left != focus_seekbars_margin_left ) { - // we check whether focus_seekbars_margin_left has changed, in case there is a performance cost for setting layoutparams - this.focus_seekbars_margin_left = new_focus_seekbars_margin_left; - if( MyDebug.LOG ) - Log.d(TAG, "set focus_seekbars_margin_left to " + focus_seekbars_margin_left); - - // "left" and "right" here are written assuming we're in landscape system orientation - - View view = main_activity.findViewById(R.id.focus_seekbar); - RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - preview.getView().getLocationOnScreen(gui_location); - int preview_left = gui_location[system_orientation_portrait ? 1 : 0]; - if( system_orientation == MainActivity.SystemOrientation.REVERSE_LANDSCAPE ) - preview_left += preview.getView().getWidth(); // actually want preview-right for reverse landscape - - view.getLocationOnScreen(gui_location); - int seekbar_right = gui_location[system_orientation_portrait ? 1 : 0]; - if( system_orientation == MainActivity.SystemOrientation.LANDSCAPE || system_orientation == MainActivity.SystemOrientation.PORTRAIT ) { - // n.b., we read view.getWidth() even if system_orientation is portrait, because the seekbar is rotated in portrait orientation - seekbar_right += view.getWidth(); - } - else { - // and for reversed landscape, the seekbar is rotated 180 degrees, and getLocationOnScreen() returns the location after the rotation - seekbar_right -= view.getWidth(); - } - - int min_seekbar_width = (int) (150 * scale_dp + 0.5f); // convert dps to pixels - int new_seekbar_width; - if( system_orientation == MainActivity.SystemOrientation.LANDSCAPE || system_orientation == MainActivity.SystemOrientation.PORTRAIT ) { - new_seekbar_width = seekbar_right - (preview_left+focus_seekbars_margin_left); - } - else { - // reversed landscape - new_seekbar_width = preview_left - focus_seekbars_margin_left - seekbar_right; - } - new_seekbar_width = Math.max(new_seekbar_width, min_seekbar_width); - /*if( MyDebug.LOG ) { - Log.d(TAG, "preview_left: " + preview_left); - Log.d(TAG, "seekbar_right: " + seekbar_right); - Log.d(TAG, "new_seekbar_width: " + new_seekbar_width); - }*/ - layoutParams.width = new_seekbar_width; - view.setLayoutParams(layoutParams); - - view = main_activity.findViewById(R.id.focus_bracketing_target_seekbar); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.width = new_seekbar_width; - view.setLayoutParams(layoutParams); - - // need to update due to changing width of focus seekbars - main_activity.getMainUI().setFocusSeekbarsRotation(); - } - } - int battery_x = top_x; int battery_y = top_y + (int) (5 * scale_dp + 0.5f); int battery_width = (int) (5 * scale_dp + 0.5f); // convert dps to pixels @@ -2324,6 +2255,11 @@ public class DrawPreview { return angle_step; } + @NonNull + private String getZoomText(float zoom_ratio) { + return "· " + zoom_ratio + "X" + " ·"; + } + private void drawAngleLines(Canvas canvas, int device_ui_rotation, long time_ms) { Preview preview = main_activity.getPreview(); CameraController camera_controller = preview.getCameraController(); diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java index 3e1307103..21cb642ee 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/MainUI.java @@ -1,6 +1,7 @@ package net.sourceforge.opencamera.ui; import net.sourceforge.opencamera.MyApplicationInterface; +import net.sourceforge.opencamera.ScaleUtils; import net.sourceforge.opencamera.cameracontroller.CameraController; import net.sourceforge.opencamera.MainActivity; import net.sourceforge.opencamera.MyDebug; @@ -41,6 +42,11 @@ import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.ZoomControls; +import androidx.annotation.IdRes; +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; + import java.util.ArrayList; import java.util.Hashtable; import java.util.List; @@ -428,17 +434,6 @@ public class MainUI { if( ui_placement == UIPlacement.UIPLACEMENT_TOP ) { // not part of the icon panel in TOP mode view = main_activity.findViewById(R.id.gallery); - layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams(); - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_bottom, 0); - layoutParams.addRule(above, 0); - layoutParams.addRule(below, 0); - layoutParams.addRule(left_of, 0); - layoutParams.addRule(right_of, 0); - setMarginsForSystemUI(layoutParams, 0, gallery_top_gap, gallery_navigation_gap, 0); - view.setLayoutParams(layoutParams); setViewRotation(view, ui_rotation); } else { @@ -516,6 +511,7 @@ public class MainUI { }*/ int total_button_size = count*button_size; int margin = 0; + int topMargin = (int) ScaleUtils.convertDpToPx(main_activity, 8.0f); if( total_button_size > display_height ) { if( MyDebug.LOG ) Log.d(TAG, "need to reduce button size"); @@ -525,7 +521,7 @@ public class MainUI { if( MyDebug.LOG ) Log.d(TAG, "need to increase margin"); if( count > 1 ) - margin = (display_height - total_button_size) / (count-1); + margin = (display_height - total_button_size - (2 * topMargin)) / (count - 1); } if( MyDebug.LOG ) { Log.d(TAG, "button_size: " + button_size); @@ -546,15 +542,16 @@ public class MainUI { // is displayed (when taking a photo) if it is still shown left-most, rather than centred; also // needed for "pause preview" trash/icons to be shown properly (test by rotating the phone to update // the layout) - int margin_first = this_view==first_visible_view ? 0 : margin/2; - int margin_last = this_view==last_visible_view ? 0 : margin/2; + int margin_first = this_view==first_visible_view ? topMargin : margin/2; + int margin_last = this_view==last_visible_view ? topMargin : margin/2; setMarginsForSystemUI(layoutParams, 0, margin_first, 0, margin_last); layoutParams.width = button_size; layoutParams.height = button_size; this_view.setLayoutParams(layoutParams); } } - top_icon = first_visible_view; + + top_icon = setUpTopBarHolderUI(system_orientation_portrait, system_orientation_reversed_landscape, button_size); } } else { @@ -578,166 +575,40 @@ public class MainUI { // end icon panel + int navigationBarSideMargin = (int) ScaleUtils.convertDpToPx(main_activity, 23.0f); + navigationBarSideMargin += navigation_gap; + + setUpBottomBarHolderUI(system_orientation_portrait, system_orientation_reversed_landscape, navigationBarSideMargin); + view = main_activity.findViewById(R.id.take_photo); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, 0); - layoutParams.addRule(center_vertical, RelativeLayout.TRUE); - layoutParams.addRule(center_horizontal, 0); - setMarginsForSystemUI(layoutParams, 0, 0, navigation_gap, 0); - view.setLayoutParams(layoutParams); setViewRotation(view, ui_rotation); view = main_activity.findViewById(R.id.switch_camera); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, 0); - layoutParams.addRule(ui_independent_above, R.id.take_photo); - layoutParams.addRule(ui_independent_below, 0); - layoutParams.addRule(ui_independent_left_of, 0); - layoutParams.addRule(ui_independent_right_of, 0); - setMarginsForSystemUI(layoutParams, 0, 0, navigation_gap, 0); - view.setLayoutParams(layoutParams); setViewRotation(view, ui_rotation); - view = main_activity.findViewById(R.id.switch_multi_camera); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(ui_independent_above, 0); - layoutParams.addRule(ui_independent_below, 0); - layoutParams.addRule(ui_independent_left_of, R.id.switch_camera); - layoutParams.addRule(ui_independent_right_of, 0); - layoutParams.addRule(align_top, R.id.switch_camera); - layoutParams.addRule(align_bottom, R.id.switch_camera); - layoutParams.addRule(align_left, 0); - layoutParams.addRule(align_right, 0); - { - int margin = (int) (5 * scale + 0.5f); // convert dps to pixels - setMarginsForSystemUI(layoutParams, 0, 0, margin, 0); - } - view.setLayoutParams(layoutParams); - setViewRotation(view, ui_rotation); + setupMultiCameraUI(ui_rotation, system_orientation_portrait, system_orientation_reversed_landscape); view = main_activity.findViewById(R.id.pause_video); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, 0); - layoutParams.addRule(ui_independent_above, R.id.take_photo); - layoutParams.addRule(ui_independent_below, 0); - layoutParams.addRule(ui_independent_left_of, 0); - layoutParams.addRule(ui_independent_right_of, 0); - setMarginsForSystemUI(layoutParams, 0, 0, navigation_gap, 0); - view.setLayoutParams(layoutParams); setViewRotation(view, ui_rotation); view = main_activity.findViewById(R.id.cancel_panorama); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, 0); - layoutParams.addRule(above, R.id.take_photo); - layoutParams.addRule(below, 0); - layoutParams.addRule(left_of, 0); - layoutParams.addRule(right_of, 0); - setMarginsForSystemUI(layoutParams, 0, 0, navigation_gap, 0); - view.setLayoutParams(layoutParams); + setViewRotation(view, ui_rotation); + + view = main_activity.findViewById(R.id.finish_panorama); setViewRotation(view, ui_rotation); view = main_activity.findViewById(R.id.switch_video); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, 0); - layoutParams.addRule(ui_independent_above, 0); - layoutParams.addRule(ui_independent_below, R.id.take_photo); - layoutParams.addRule(ui_independent_left_of, 0); - layoutParams.addRule(ui_independent_right_of, 0); - setMarginsForSystemUI(layoutParams, 0, 0, navigation_gap, 0); - view.setLayoutParams(layoutParams); setViewRotation(view, ui_rotation); view = main_activity.findViewById(R.id.take_photo_when_video_recording); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, 0); - layoutParams.addRule(ui_independent_above, 0); - layoutParams.addRule(ui_independent_below, R.id.take_photo); - layoutParams.addRule(ui_independent_left_of, 0); - layoutParams.addRule(ui_independent_right_of, 0); - setMarginsForSystemUI(layoutParams, 0, 0, navigation_gap, 0); - view.setLayoutParams(layoutParams); setViewRotation(view, ui_rotation); - view = main_activity.findViewById(R.id.zoom); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, RelativeLayout.TRUE); - view.setLayoutParams(layoutParams); - setFixedRotation(main_activity.findViewById(R.id.zoom), 0, 0, navigation_gap, 0); - view.setRotation(view.getRotation()+180.0f); // should always match the zoom_seekbar, so that zoom in and out are in the same directions + setUpZoomControlUI(ui_rotation, system_orientation_portrait, system_orientation_reversed_landscape); - view = main_activity.findViewById(R.id.zoom_seekbar); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - // if we are showing the zoom control, the align next to that; otherwise have it aligned close to the edge of screen - if( sharedPreferences.getBoolean(PreferenceKeys.ShowZoomControlsPreferenceKey, false) ) { - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, 0); - layoutParams.addRule(above, R.id.zoom); - layoutParams.addRule(below, 0); - layoutParams.addRule(left_of, 0); - layoutParams.addRule(right_of, 0); - // margins set below in setFixedRotation() - } - else { - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, RelativeLayout.TRUE); - // margins set below in setFixedRotation() - // need to clear the others, in case we turn zoom controls on/off - layoutParams.addRule(above, 0); - layoutParams.addRule(below, 0); - layoutParams.addRule(left_of, 0); - layoutParams.addRule(right_of, 0); - } - view.setLayoutParams(layoutParams); - int margin = (int) (20 * scale + 0.5f); // convert dps to pixels - setFixedRotation(main_activity.findViewById(R.id.zoom_seekbar), 0, 0, margin+navigation_gap, 0); - - view = main_activity.findViewById(R.id.focus_seekbar); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(left_of, R.id.zoom_seekbar); - layoutParams.addRule(right_of, 0); - layoutParams.addRule(above, 0); - layoutParams.addRule(below, 0); - layoutParams.addRule(align_parent_top, 0); - layoutParams.addRule(align_parent_bottom, RelativeLayout.TRUE); - layoutParams.addRule(align_parent_left, 0); - layoutParams.addRule(align_parent_right, 0); - view.setLayoutParams(layoutParams); - - view = main_activity.findViewById(R.id.focus_bracketing_target_seekbar); - layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams(); - layoutParams.addRule(left_of, R.id.zoom_seekbar); - layoutParams.addRule(right_of, 0); - layoutParams.addRule(above, R.id.focus_seekbar); - layoutParams.addRule(below, 0); - view.setLayoutParams(layoutParams); + view = main_activity.findViewById(R.id.zoom_seekbar_holder); + setViewRotation(view, ui_rotation); - setFocusSeekbarsRotation(); + setupFocusSeekBarUI(ui_rotation, system_orientation_portrait, system_orientation_reversed_landscape); } if( !popup_container_only ) @@ -844,9 +715,6 @@ public class MainUI { lp.height = height_pixels; view.setLayoutParams(lp); - view = main_activity.findViewById(R.id.exposure_seekbar_zoom); - view.setAlpha(0.5f); - view = main_activity.findViewById(R.id.iso_seekbar); lp = (RelativeLayout.LayoutParams)view.getLayoutParams(); lp.width = width_pixels; @@ -878,19 +746,19 @@ public class MainUI { layoutParams.addRule(above, 0); layoutParams.addRule(below, 0); layoutParams.addRule(left_of, 0); - layoutParams.addRule(right_of, R.id.popup); + layoutParams.addRule(right_of, R.id.top_bg); layoutParams.addRule(align_parent_top, system_orientation_portrait ? 0 : RelativeLayout.TRUE); layoutParams.addRule(align_parent_bottom, system_orientation_portrait ? 0 : RelativeLayout.TRUE); layoutParams.addRule(align_parent_left, 0); layoutParams.addRule(align_parent_right, 0); } else { - layoutParams.addRule(align_right, R.id.popup); + layoutParams.addRule(align_right, R.id.top_bg); layoutParams.addRule(align_bottom, 0); layoutParams.addRule(align_left, 0); layoutParams.addRule(align_top, 0); layoutParams.addRule(above, 0); - layoutParams.addRule(below, R.id.popup); + layoutParams.addRule(below, R.id.top_bg); layoutParams.addRule(left_of, 0); layoutParams.addRule(right_of, 0); layoutParams.addRule(align_parent_top, 0); @@ -941,6 +809,298 @@ public class MainUI { } } + private void setupMultiCameraUI(int ui_rotation, boolean orientationPortrait, boolean orientationReverseLandscape) { + View multiCamera = main_activity.findViewById(R.id.switch_multi_camera); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(multiCamera.getLayoutParams().width, multiCamera.getLayoutParams().height); + + int size21dp = (int) ScaleUtils.convertDpToPx(main_activity, 21.0f); + int size20dp = (int) ScaleUtils.convertDpToPx(main_activity, 20.0f); + + if (orientationPortrait) { + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE); + layoutParams.addRule(RelativeLayout.ABOVE, R.id.bottom_buttons_holder); + layoutParams.setMargins(0, 0, size21dp, size20dp); + } else if (orientationReverseLandscape) { + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); + layoutParams.addRule(RelativeLayout.END_OF, R.id.bottom_buttons_holder); + layoutParams.setMargins(size20dp, 0, 0, size21dp); + } else { + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); + layoutParams.addRule(RelativeLayout.START_OF, R.id.bottom_buttons_holder); + layoutParams.setMargins(0, size21dp, size20dp, 0); + } + + multiCamera.setLayoutParams(layoutParams); + setViewRotation(multiCamera, ui_rotation); + } + + private void setupFocusSeekBarUI(int rotation, boolean orientationPortrait, boolean orientationReverseLandscape) { + View focusSeekBarHolder = main_activity.findViewById(R.id.focus_seekbar_holder); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + + if (orientationPortrait) { + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE); + layoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); + } else if (orientationReverseLandscape) { + layoutParams.addRule(RelativeLayout.END_OF, R.id.bottom_buttons_holder); + layoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); + } else { + layoutParams.addRule(RelativeLayout.START_OF, R.id.bottom_buttons_holder); + layoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); + } + + focusSeekBarHolder.setLayoutParams(layoutParams); + setViewRotation(focusSeekBarHolder, rotation + 90); + } + + private void setUpZoomControlUI(int rotation, boolean orientationPortrait, boolean orientationReverseLandscape) { + int margin = (int) ScaleUtils.convertDpToPx(main_activity, 60.0f); + + View zoom = main_activity.findViewById(R.id.zoom); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(zoom.getLayoutParams().width, zoom.getLayoutParams().height); + + if (orientationPortrait) { + layoutParams.addRule(RelativeLayout.BELOW, R.id.top_bg); + layoutParams.setMargins(0, margin, 0, 0); + layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); + } else if (orientationReverseLandscape) { + layoutParams.addRule(RelativeLayout.START_OF, R.id.top_bg); + layoutParams.setMargins(0, 0, margin, 0); + layoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); + } else { + layoutParams.addRule(RelativeLayout.END_OF, R.id.top_bg); + layoutParams.setMargins(margin, 0, 0, 0); + layoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); + } + + zoom.setLayoutParams(layoutParams); + setViewRotation(zoom, rotation); + } + + private View setUpTopBarHolderUI(boolean orientationPortrait, boolean orientationReverseLandscape, int topButtonSize) { + int width = orientationPortrait ? ViewGroup.LayoutParams.MATCH_PARENT : topButtonSize; + int height = orientationPortrait ? topButtonSize : ViewGroup.LayoutParams.MATCH_PARENT; + int topBarAlignment = orientationPortrait ? RelativeLayout.ALIGN_PARENT_TOP : (orientationReverseLandscape ? RelativeLayout.ALIGN_PARENT_END : RelativeLayout.ALIGN_PARENT_START); + + View topBar = main_activity.findViewById(R.id.top_bg); + RelativeLayout.LayoutParams topBarLayoutParams = new RelativeLayout.LayoutParams(width, height); + topBarLayoutParams.addRule(topBarAlignment, RelativeLayout.TRUE); + topBar.setLayoutParams(topBarLayoutParams); + return topBar; + } + + private void setUpBottomBarHolderUI(boolean orientationPortrait, boolean orientationReverseLandscape, int navigationBarSideMargin) { + ConstraintLayout bottomBar = main_activity.findViewById(R.id.bottom_buttons_holder); + // set up layoutParam + int bottomBarWidth = orientationPortrait ? ViewGroup.LayoutParams.MATCH_PARENT : ViewGroup.LayoutParams.WRAP_CONTENT; + int bottomBarHeight = orientationPortrait ? ViewGroup.LayoutParams.WRAP_CONTENT : ViewGroup.LayoutParams.MATCH_PARENT; + int bottomBarAlignment = orientationPortrait ? RelativeLayout.ALIGN_PARENT_BOTTOM : (orientationReverseLandscape ? RelativeLayout.ALIGN_PARENT_START : RelativeLayout.ALIGN_PARENT_END); + RelativeLayout.LayoutParams bottomBarLayoutParams = new RelativeLayout.LayoutParams(bottomBarWidth, bottomBarHeight); + bottomBarLayoutParams.addRule(bottomBarAlignment, RelativeLayout.TRUE); + bottomBar.setLayoutParams(bottomBarLayoutParams); + + // set up padding + int size20dp = (int) ScaleUtils.convertDpToPx(main_activity, 20.0f); + int size23dp = (int) ScaleUtils.convertDpToPx(main_activity, 23.0f); + + int bottomBarLeftPadding = orientationPortrait ? size20dp : (orientationReverseLandscape ? navigationBarSideMargin : size23dp); + int bottomBarRightPadding = orientationPortrait ? size20dp : (orientationReverseLandscape ? size23dp : navigationBarSideMargin); + int bottomBarTopPadding = orientationPortrait ? size23dp : size20dp; + int bottomBarBottomPadding = orientationPortrait ? navigationBarSideMargin : size20dp; + bottomBar.setPadding(bottomBarLeftPadding, bottomBarTopPadding, bottomBarRightPadding, bottomBarBottomPadding); + + setUpBottomItemsUI(bottomBar, orientationPortrait, orientationReverseLandscape); + } + + private void setUpBottomItemsUI(ConstraintLayout bottomHolder, boolean orientationPortrait, boolean orientationReverseLandscape) { + ConstraintSet constraintSet = new ConstraintSet(); + constraintSet.clone(bottomHolder); + + clearAllDynamicBottomBarItemConstraint(constraintSet); + + if (orientationPortrait) { + connectPortraitConstraintForBottomItems(constraintSet); + } else if (orientationReverseLandscape) { + connectReverseLandscapeConstraintForBottomItems(constraintSet); + } else { + connectLandscapeConstraintForBottomItems(constraintSet); + } + + constraintSet.applyTo(bottomHolder); + } + + private void clearAllDynamicBottomBarItemConstraint(@NonNull ConstraintSet constraintSet) { + clearAllConstraint(constraintSet, R.id.place_holder_view); + clearAllConstraint(constraintSet, R.id.gallery); + clearAllConstraint(constraintSet, R.id.switch_camera); + clearAllConstraint(constraintSet, R.id.pause_video); + clearAllConstraint(constraintSet, R.id.switch_video); + clearAllConstraint(constraintSet, R.id.take_photo_when_video_recording); + clearAllConstraint(constraintSet, R.id.cancel_panorama); + clearAllConstraint(constraintSet, R.id.finish_panorama); + } + + private void clearAllConstraint(@NonNull ConstraintSet constraintSet, @IdRes int id) { + constraintSet.clear(id, ConstraintSet.TOP); + constraintSet.clear(id, ConstraintSet.BOTTOM); + constraintSet.clear(id, ConstraintSet.START); + constraintSet.clear(id, ConstraintSet.END); + } + + private void connectConstraintParentTopBottom(@NonNull ConstraintSet constraintSet, @IdRes int id) { + constraintSet.connect(id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP); + constraintSet.connect(id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM); + } + + private void connectConstraintParentStartEnd(@NonNull ConstraintSet constraintSet, @IdRes int id) { + constraintSet.connect(id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START); + constraintSet.connect(id, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END); + } + + private void connectPortraitConstraintForBottomItems(@NonNull ConstraintSet constraintSet) { + int id; + + //placeHolderView + id = R.id.place_holder_view; + connectConstraintParentTopBottom(constraintSet, id); + constraintSet.connect(id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START); + + //gallery + id = R.id.gallery; + connectConstraintParentTopBottom(constraintSet, id); + constraintSet.connect(id, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END); + + //switchCamera + id = R.id.switch_camera; + connectConstraintParentTopBottom(constraintSet, id); + constraintSet.connect(id, ConstraintSet.END, R.id.gallery, ConstraintSet.START); + constraintSet.connect(id, ConstraintSet.START, R.id.take_photo, ConstraintSet.END); + + //pauseVideo + id = R.id.pause_video; + connectConstraintParentTopBottom(constraintSet, id); + constraintSet.connect(id, ConstraintSet.END, R.id.gallery, ConstraintSet.START); + constraintSet.connect(id, ConstraintSet.START, R.id.take_photo, ConstraintSet.END); + + //switchVideo + id = R.id.switch_video; + connectConstraintParentTopBottom(constraintSet, id); + constraintSet.connect(id, ConstraintSet.END, R.id.take_photo, ConstraintSet.START); + constraintSet.connect(id, ConstraintSet.START, R.id.place_holder_view, ConstraintSet.END); + + //takePhotoOnVideo + id = R.id.take_photo_when_video_recording; + connectConstraintParentTopBottom(constraintSet, id); + constraintSet.connect(id, ConstraintSet.END, R.id.take_photo, ConstraintSet.START); + constraintSet.connect(id, ConstraintSet.START, R.id.place_holder_view, ConstraintSet.END); + + //cancelPanorama + id = R.id.cancel_panorama; + connectConstraintParentTopBottom(constraintSet, id); + constraintSet.connect(id, ConstraintSet.START, R.id.place_holder_center_view, ConstraintSet.END); + + //finishPanorama + id = R.id.finish_panorama; + connectConstraintParentTopBottom(constraintSet, id); + constraintSet.connect(id, ConstraintSet.END, R.id.place_holder_center_view, ConstraintSet.START); + } + + private void connectReverseLandscapeConstraintForBottomItems(@NonNull ConstraintSet constraintSet) { + int id; + + //placeHolderView + id = R.id.place_holder_view; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP); + + //gallery + id = R.id.gallery; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM); + + //switchCamera + id = R.id.switch_camera; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.gallery, ConstraintSet.TOP); + constraintSet.connect(id, ConstraintSet.TOP, R.id.take_photo, ConstraintSet.BOTTOM); + + //pauseVideo + id = R.id.pause_video; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.gallery, ConstraintSet.TOP); + constraintSet.connect(id, ConstraintSet.TOP, R.id.take_photo, ConstraintSet.BOTTOM); + + //switchVideo + id = R.id.switch_video; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.take_photo, ConstraintSet.TOP); + constraintSet.connect(id, ConstraintSet.TOP, R.id.place_holder_view, ConstraintSet.BOTTOM); + + //takePhotoOnVideo + id = R.id.take_photo_when_video_recording; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.take_photo, ConstraintSet.TOP); + constraintSet.connect(id, ConstraintSet.TOP, R.id.place_holder_view, ConstraintSet.BOTTOM); + + //cancelPanorama + id = R.id.cancel_panorama; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.TOP, R.id.place_holder_center_view, ConstraintSet.BOTTOM); + + //finishPanorama + id = R.id.finish_panorama; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.place_holder_center_view, ConstraintSet.TOP); + } + + private void connectLandscapeConstraintForBottomItems(@NonNull ConstraintSet constraintSet) { + int id; + + //placeHolderView + id = R.id.place_holder_view; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM); + + //gallery + id = R.id.gallery; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP); + + //switchCamera + id = R.id.switch_camera; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.TOP, R.id.gallery, ConstraintSet.BOTTOM); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.take_photo, ConstraintSet.TOP); + + //pauseVideo + id = R.id.pause_video; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.TOP, R.id.gallery, ConstraintSet.BOTTOM); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.take_photo, ConstraintSet.TOP); + + //switchVideo + id = R.id.switch_video; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.TOP, R.id.take_photo, ConstraintSet.BOTTOM); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.place_holder_view, ConstraintSet.TOP); + + //takePhotoOnVideo + id = R.id.take_photo_when_video_recording; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.TOP, R.id.take_photo, ConstraintSet.BOTTOM); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.place_holder_view, ConstraintSet.TOP); + + //cancelPanorama + id = R.id.cancel_panorama; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.BOTTOM, R.id.place_holder_center_view, ConstraintSet.TOP); + + //finishPanorama + id = R.id.finish_panorama; + connectConstraintParentStartEnd(constraintSet, id); + constraintSet.connect(id, ConstraintSet.TOP, R.id.place_holder_center_view, ConstraintSet.BOTTOM); + } + /** Wrapper for layoutParams.setMargins, but where the margins are supplied for landscape orientation, * and if in portrait these are automatically rotated. */ @@ -1086,7 +1246,7 @@ public class MainUI { if( main_activity.getPreview().isVideo() ) { if( MyDebug.LOG ) Log.d(TAG, "set icon to video"); - resource = main_activity.getPreview().isVideoRecording() ? R.drawable.take_video_recording : R.drawable.take_video_selector; + resource = main_activity.getPreview().isVideoRecording() ? R.drawable.ic_camera_video_recording : R.drawable.ic_camera_video; content_description = main_activity.getPreview().isVideoRecording() ? R.string.stop_video : R.string.start_video; switch_video_content_description = R.string.switch_to_qrcode; } else if (isQrMode) { @@ -1095,14 +1255,7 @@ public class MainUI { resource = R.drawable.empty; content_description = 0; switch_video_content_description = R.string.switch_to_photo; - } else if( panorama_recording ) { - if( MyDebug.LOG ) - Log.d(TAG, "set icon to recording panorama"); - resource = R.drawable.baseline_check_white_48; - content_description = R.string.finish_panorama; - switch_video_content_description = R.string.switch_to_video; - } - else { // Camera case + } else { // Camera case if( MyDebug.LOG ) Log.d(TAG, "set icon to photo"); resource = R.drawable.take_photo_selector; @@ -1122,9 +1275,9 @@ public class MainUI { if (main_activity.getPreview().isVideo()) { resource = R.drawable.ic_switch_qrcode; } else if (isQrMode) { - resource = R.drawable.ic_photo_camera_white_48dp; + resource = R.drawable.ic_switch_camera; } else { // camera - resource = R.drawable.ic_videocam_white_48dp; + resource = R.drawable.ic_switch_video; } view.setImageResource(resource); view.setTag(resource); // for testing @@ -1135,6 +1288,32 @@ public class MainUI { showGalleryAndSwitch ? View.INVISIBLE : View.VISIBLE); main_activity.findViewById(R.id.switch_camera).setVisibility( showGalleryAndSwitch ? View.INVISIBLE : View.VISIBLE); + } + } + /** + * Show/hide photoShutter, panorama cancel & finish buttons on photoMode. + * If user save not to show photoShutter button, don't show photoShutter & panorama finish buttons. + * If user wants to view the shutter button, update the shutterButton's icon to the appropriate one. + */ + public void handlePanoromaModeButtonsVisibility() { + boolean isPanoramaRunning = (main_activity.getApplicationInterface().getPhotoMode() == MyApplicationInterface.PhotoMode.Panorama && + main_activity.getApplicationInterface().getGyroSensor().isRecording()); + + View view = main_activity.findViewById(R.id.cancel_panorama); + view.setVisibility(isPanoramaRunning ? View.VISIBLE : View.GONE); + + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(main_activity); + if (!sharedPreferences.getBoolean(PreferenceKeys.ShowTakePhotoPreferenceKey, true)) { + return; + } + + view = main_activity.findViewById(R.id.finish_panorama); + view.setVisibility(isPanoramaRunning ? View.VISIBLE : View.GONE); + + view = main_activity.findViewById(R.id.take_photo); + view.setVisibility(isPanoramaRunning ? View.INVISIBLE : View.VISIBLE); + if (!isPanoramaRunning) { + setTakePhotoIcon(); } } @@ -1176,11 +1355,11 @@ public class MainUI { int content_description; if( main_activity.getPreview().isVideoRecordingPaused() ) { content_description = R.string.resume_video; - pauseVideoButton.setImageResource(R.drawable.ic_play_circle_outline_white_48dp); + pauseVideoButton.setImageResource(R.drawable.ic_play); } else { content_description = R.string.pause_video; - pauseVideoButton.setImageResource(R.drawable.ic_pause_circle_outline_white_48dp); + pauseVideoButton.setImageResource(R.drawable.ic_pause); } if( MyDebug.LOG ) Log.d(TAG, "content_description: " + main_activity.getResources().getString(content_description)); @@ -1374,6 +1553,7 @@ public class MainUI { View settingsButton = main_activity.findViewById(R.id.settings); View zoomControls = main_activity.findViewById(R.id.zoom); View zoomSeekBar = main_activity.findViewById(R.id.zoom_seekbar); + View zoomSeekbarIcon = main_activity.findViewById(R.id.zoom_seekbar_icon); View focusSeekBar = main_activity.findViewById(R.id.focus_seekbar); View focusBracketingTargetSeekBar = main_activity.findViewById(R.id.focus_bracketing_target_seekbar); if( main_activity.getPreview().getCameraControllerManager().getNumberOfCameras() > 1 ) @@ -1416,6 +1596,7 @@ public class MainUI { } if( main_activity.getPreview().supportsZoom() && sharedPreferences.getBoolean(PreferenceKeys.ShowZoomSliderControlsPreferenceKey, false) ) { zoomSeekBar.setVisibility(visibility); + zoomSeekbarIcon.setVisibility(visibility); } if( main_activity.showManualFocusSeekbar(false) ) focusSeekBar.setVisibility(visibility); @@ -1438,6 +1619,12 @@ public class MainUI { if( main_activity.getApplicationInterface().getGyroSensor().isRecording() ) { View cancelPanoramaButton = main_activity.findViewById(R.id.cancel_panorama); cancelPanoramaButton.setVisibility(visibility); + + if (sharedPreferences.getBoolean(PreferenceKeys.ShowTakePhotoPreferenceKey, true)) { + View finishPanoramaButton = main_activity.findViewById(R.id.finish_panorama); + finishPanoramaButton.setVisibility(visibility); + } + } } if( !immersive_mode ) { @@ -1552,14 +1739,15 @@ public class MainUI { public void updateExposureLockIcon() { ImageButton view = main_activity.findViewById(R.id.exposure_lock); boolean enabled = main_activity.getPreview().isExposureLocked(); - view.setImageResource(enabled ? R.drawable.exposure_locked : R.drawable.exposure_unlocked); + view.setImageResource(enabled ? R.drawable.ic_camera_exposure_locked : R.drawable.ic_camera_exposure_unlocked); view.setContentDescription( main_activity.getResources().getString(enabled ? R.string.exposure_unlock : R.string.exposure_lock) ); } public void updateWhiteBalanceLockIcon() { ImageButton view = main_activity.findViewById(R.id.white_balance_lock); boolean enabled = main_activity.getPreview().isWhiteBalanceLocked(); - view.setImageResource(enabled ? R.drawable.white_balance_locked : R.drawable.white_balance_unlocked); + view.setImageResource(R.drawable.ic_white_balance_unlocked); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(enabled ? R.color.color_default_accent : R.color.white))); view.setContentDescription( main_activity.getResources().getString(enabled ? R.string.white_balance_unlock : R.string.white_balance_lock) ); } @@ -1572,7 +1760,7 @@ public class MainUI { view.setImageResource(R.drawable.raw_only_icon); } else { - view.setImageResource(R.drawable.raw_icon); + view.setImageResource(R.drawable.ic_raw); } } else { @@ -1583,34 +1771,39 @@ public class MainUI { public void updateStoreLocationIcon() { ImageButton view = main_activity.findViewById(R.id.store_location); boolean enabled = main_activity.getApplicationInterface().getGeotaggingPref(); - view.setImageResource(enabled ? R.drawable.ic_gps_fixed_red_48dp : R.drawable.ic_gps_fixed_white_48dp); + view.setImageResource(R.drawable.ic_gps_fixed_white_48dp); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(enabled ? R.color.color_default_accent : R.color.white))); view.setContentDescription( main_activity.getResources().getString(enabled ? R.string.preference_location_disable : R.string.preference_location_enable) ); } public void updateTextStampIcon() { ImageButton view = main_activity.findViewById(R.id.text_stamp); boolean enabled = !main_activity.getApplicationInterface().getTextStampPref().isEmpty(); - view.setImageResource(enabled ? R.drawable.baseline_text_fields_red_48 : R.drawable.baseline_text_fields_white_48); + view.setImageResource(R.drawable.ic_text_stamp); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(enabled ? R.color.color_default_accent : R.color.white))); } public void updateStampIcon() { ImageButton view = main_activity.findViewById(R.id.stamp); boolean enabled = main_activity.getApplicationInterface().getStampPref().equals("preference_stamp_yes"); - view.setImageResource(enabled ? R.drawable.ic_text_format_red_48dp : R.drawable.ic_text_format_white_48dp); + view.setImageResource(R.drawable.ic_preference_text_format); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(enabled ? R.color.color_default_accent : R.color.white))); view.setContentDescription( main_activity.getResources().getString(enabled ? R.string.stamp_disable : R.string.stamp_enable) ); } public void updateFocusPeakingIcon() { ImageButton view = main_activity.findViewById(R.id.focus_peaking); boolean enabled = main_activity.getApplicationInterface().getFocusPeakingPref(); - view.setImageResource(enabled ? R.drawable.key_visualizer_red : R.drawable.key_visualizer); + view.setImageResource(R.drawable.ic_preference_focus_peaking); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(enabled ? R.color.color_default_accent : R.color.white))); view.setContentDescription( main_activity.getResources().getString(enabled ? R.string.focus_peaking_disable : R.string.focus_peaking_enable) ); } public void updateAutoLevelIcon() { ImageButton view = main_activity.findViewById(R.id.auto_level); boolean enabled = main_activity.getApplicationInterface().getAutoStabilisePref(); - view.setImageResource(enabled ? R.drawable.auto_stabilise_icon_red : R.drawable.auto_stabilise_icon); + view.setImageResource(R.drawable.ic_preference_auto_stabilise); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(enabled ? R.color.color_default_accent : R.color.white))); view.setContentDescription( main_activity.getResources().getString(enabled ? R.string.auto_level_disable : R.string.auto_level_enable) ); } @@ -1622,40 +1815,41 @@ public class MainUI { ImageButton view = main_activity.findViewById(R.id.cycle_flash); switch( flash_value ) { case "flash_off": - view.setImageResource(R.drawable.flash_off); + view.setImageResource(R.drawable.ic_camera_flash_off); break; case "flash_auto": case "flash_frontscreen_auto": - view.setImageResource(R.drawable.flash_auto); + view.setImageResource(R.drawable.ic_camera_flash_auto); break; case "flash_on": case "flash_frontscreen_on": - view.setImageResource(R.drawable.flash_on); + view.setImageResource(R.drawable.ic_camera_flash_on); break; case "flash_torch": case "flash_frontscreen_torch": - view.setImageResource(R.drawable.baseline_highlight_white_48); + view.setImageResource(R.drawable.ic_camera_highlight); break; case "flash_red_eye": - view.setImageResource(R.drawable.baseline_remove_red_eye_white_48); + view.setImageResource(R.drawable.ic_camera_remove_red_eye); break; default: // just in case?? Log.e(TAG, "unknown flash value " + flash_value); - view.setImageResource(R.drawable.flash_off); + view.setImageResource(R.drawable.ic_camera_flash_off); break; } } else { ImageButton view = main_activity.findViewById(R.id.cycle_flash); - view.setImageResource(R.drawable.flash_off); + view.setImageResource(R.drawable.ic_camera_flash_off); } } public void updateFaceDetectionIcon() { ImageButton view = main_activity.findViewById(R.id.face_detection); boolean enabled = main_activity.getApplicationInterface().getFaceDetectionPref(); - view.setImageResource(enabled ? R.drawable.ic_face_red_48dp : R.drawable.ic_face_white_48dp); + view.setImageResource(R.drawable.ic_face); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(enabled ? R.color.color_default_accent : R.color.white))); view.setContentDescription( main_activity.getResources().getString(enabled ? R.string.face_detection_disable : R.string.face_detection_enable) ); } @@ -1676,13 +1870,15 @@ public class MainUI { public void audioControlStarted() { ImageButton view = main_activity.findViewById(R.id.audio_control); - view.setImageResource(R.drawable.ic_mic_red_48dp); + view.setImageResource(R.drawable.ic_mic); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(R.color.color_default_accent))); view.setContentDescription( main_activity.getResources().getString(R.string.audio_control_stop) ); } public void audioControlStopped() { ImageButton view = main_activity.findViewById(R.id.audio_control); - view.setImageResource(R.drawable.ic_mic_white_48dp); + view.setImageResource(R.drawable.ic_mic); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(R.color.white))); view.setContentDescription( main_activity.getResources().getString(R.string.audio_control_start) ); } @@ -2092,7 +2288,8 @@ public class MainUI { final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(main_activity); final Preview preview = main_activity.getPreview(); ImageButton view = main_activity.findViewById(R.id.exposure); - view.setImageResource(R.drawable.ic_exposure_red_48dp); + view.setImageResource(R.drawable.ic_camera_exposure); + view.setImageTintList(ColorStateList.valueOf(main_activity.getResources().getColor(R.color.color_default_accent))); View sliders_container = main_activity.findViewById(R.id.sliders_container); sliders_container.setVisibility(View.VISIBLE); ViewGroup iso_buttons_container = main_activity.findViewById(R.id.iso_buttons); @@ -2261,8 +2458,6 @@ public class MainUI { if( main_activity.getPreview().supportsExposures() ) { exposure_seek_bar.setVisibility(View.VISIBLE); - ZoomControls seek_bar_zoom = main_activity.findViewById(R.id.exposure_seekbar_zoom); - seek_bar_zoom.setVisibility(View.VISIBLE); } else { exposure_seek_bar.setVisibility(View.GONE); @@ -2353,7 +2548,7 @@ public class MainUI { SeekBar zoomSeekBar = main_activity.findViewById(R.id.zoom_seekbar); if( MyDebug.LOG ) Log.d(TAG, "progress was: " + zoomSeekBar.getProgress()); - zoomSeekBar.setProgress(main_activity.getPreview().getMaxZoom()-new_zoom); + zoomSeekBar.setProgress(new_zoom); if( MyDebug.LOG ) Log.d(TAG, "progress is now: " + zoomSeekBar.getProgress()); } @@ -2382,8 +2577,8 @@ public class MainUI { */ public void closeExposureUI() { ImageButton image_button = main_activity.findViewById(R.id.exposure); - image_button.setImageResource(R.drawable.ic_exposure_white_48dp); - + image_button.setImageResource(R.drawable.ic_camera_exposure); + image_button.setImageTintList(ColorStateList.valueOf(Color.WHITE)); clearRemoteControlForExposureUI(); // must be called before we actually close the exposure panel View view = main_activity.findViewById(R.id.sliders_container); view.setVisibility(View.GONE); @@ -2405,25 +2600,25 @@ public class MainUI { if( MyDebug.LOG ) Log.d(TAG, "flash_value: " + flash_value); if( main_activity.getMainUI().showCycleFlashIcon() ) { - popup.setImageResource(R.drawable.popup); + popup.setImageResource(R.drawable.ic_more); } else if( flash_value != null && flash_value.equals("flash_off") ) { - popup.setImageResource(R.drawable.popup_flash_off); + popup.setImageResource(R.drawable.popup_camera_flash_off); } else if( flash_value != null && ( flash_value.equals("flash_torch") || flash_value.equals("flash_frontscreen_torch") ) ) { - popup.setImageResource(R.drawable.popup_flash_torch); + popup.setImageResource(R.drawable.popup_camera_flash_torch); } else if( flash_value != null && ( flash_value.equals("flash_auto") || flash_value.equals("flash_frontscreen_auto") ) ) { - popup.setImageResource(R.drawable.popup_flash_auto); + popup.setImageResource(R.drawable.popup_camera_flash_auto); } else if( flash_value != null && ( flash_value.equals("flash_on") || flash_value.equals("flash_frontscreen_on") ) ) { - popup.setImageResource(R.drawable.popup_flash_on); + popup.setImageResource(R.drawable.popup_camera_flash_on); } else if( flash_value != null && flash_value.equals("flash_red_eye") ) { - popup.setImageResource(R.drawable.popup_flash_red_eye); + popup.setImageResource(R.drawable.popup_camera_flash_red_eye); } else { - popup.setImageResource(R.drawable.popup); + popup.setImageResource(R.drawable.ic_more); } } diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/PopupView.java b/app/src/main/java/net/sourceforge/opencamera/ui/PopupView.java index 6aa0ca0c5..0a70381a8 100644 --- a/app/src/main/java/net/sourceforge/opencamera/ui/PopupView.java +++ b/app/src/main/java/net/sourceforge/opencamera/ui/PopupView.java @@ -44,6 +44,7 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.ImageView.ScaleType; +import androidx.appcompat.widget.AppCompatImageButton; import androidx.appcompat.widget.SwitchCompat; /** This defines the UI for the "popup" button, that provides quick access to a @@ -356,7 +357,7 @@ public class PopupView extends LinearLayout { LayoutParams.MATCH_PARENT ); final int left_padding = (int) (10 * scale + 0.5f); // convert dps to pixels - params.setMargins(left_padding, 0, 0, 0); + params.setMargins(left_padding, 20, 0, 40); checkBox.setLayoutParams(params); } @@ -1090,6 +1091,8 @@ public class PopupView extends LinearLayout { if( MyDebug.LOG ) Log.d(TAG, "Overall PopupView time: " + (System.nanoTime() - debug_time)); + + setBackgroundColor(getResources().getColor(R.color.color_popup_bg)); } int getTotalWidth() { @@ -1322,7 +1325,7 @@ public class PopupView extends LinearLayout { actual_max_per_row = Math.min(actual_max_per_row, max_buttons_per_row); int button_width_dp = total_width_dp/actual_max_per_row; boolean use_scrollview = false; - final int min_button_width_dp = 48; // needs to be at least 48dp to avoid Google Play pre-launch accessibility report warnings + final int min_button_width_dp = 24; // needs to be at least 48dp to avoid Google Play pre-launch accessibility report warnings if( button_width_dp < min_button_width_dp && max_buttons_per_row == 0 ) { button_width_dp = min_button_width_dp; use_scrollview = true; @@ -1348,6 +1351,13 @@ public class PopupView extends LinearLayout { if( MyDebug.LOG ) Log.d(TAG, "addButtonOptionsToPopup time 2.05: " + (System.nanoTime() - debug_time)); + int padding_dp = 0; + if (button_width_dp > min_button_width_dp) { + padding_dp = button_width_dp - min_button_width_dp; + padding_dp /= 2; + } + final int imageButtonPadding = (int) (padding_dp * scale + 0.5f); + for(int button_indx=0;button_indx"); - next_button.setTextSize(TypedValue.COMPLEX_UNIT_SP, arrow_text_size_dip); - next_button.setTypeface(null, Typeface.BOLD); next_button.setPadding(padding, padding, padding, padding); vg_params = next_button.getLayoutParams(); vg_params.width = arrow_button_w; diff --git a/app/src/main/res/drawable/bg_rounded_corner.xml b/app/src/main/res/drawable/bg_rounded_corner.xml new file mode 100644 index 000000000..a89f1dc37 --- /dev/null +++ b/app/src/main/res/drawable/bg_rounded_corner.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_zoom_control.xml b/app/src/main/res/drawable/bg_zoom_control.xml new file mode 100644 index 000000000..b183ccab1 --- /dev/null +++ b/app/src/main/res/drawable/bg_zoom_control.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_album.xml b/app/src/main/res/drawable/ic_album.xml new file mode 100644 index 000000000..0d405e1b1 --- /dev/null +++ b/app/src/main/res/drawable/ic_album.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_arrow_down.xml b/app/src/main/res/drawable/ic_arrow_down.xml new file mode 100644 index 000000000..96e51169c --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_down.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_left.xml b/app/src/main/res/drawable/ic_arrow_left.xml new file mode 100644 index 000000000..b6a971563 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_left.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_right.xml b/app/src/main/res/drawable/ic_arrow_right.xml new file mode 100644 index 000000000..206dd4fde --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_right.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth.xml b/app/src/main/res/drawable/ic_bluetooth.xml new file mode 100644 index 000000000..85527b80d --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_camera_exposure.xml b/app/src/main/res/drawable/ic_camera_exposure.xml new file mode 100644 index 000000000..a8c73ded0 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_exposure.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_camera_exposure_locked.xml b/app/src/main/res/drawable/ic_camera_exposure_locked.xml new file mode 100644 index 000000000..7df526457 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_exposure_locked.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_camera_exposure_unlocked.xml b/app/src/main/res/drawable/ic_camera_exposure_unlocked.xml new file mode 100644 index 000000000..1bb92e9b1 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_exposure_unlocked.xml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_camera_flash_auto.xml b/app/src/main/res/drawable/ic_camera_flash_auto.xml new file mode 100644 index 000000000..05695cc5f --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_flash_auto.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_camera_flash_off.xml b/app/src/main/res/drawable/ic_camera_flash_off.xml new file mode 100644 index 000000000..4f9de8fe8 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_flash_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_camera_flash_on.xml b/app/src/main/res/drawable/ic_camera_flash_on.xml new file mode 100644 index 000000000..f730d3487 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_flash_on.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_camera_highlight.xml b/app/src/main/res/drawable/ic_camera_highlight.xml new file mode 100644 index 000000000..9a40bbed8 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_highlight.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_camera_remove_red_eye.xml b/app/src/main/res/drawable/ic_camera_remove_red_eye.xml new file mode 100644 index 000000000..b2f4b848b --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_remove_red_eye.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_camera_shutter.xml b/app/src/main/res/drawable/ic_camera_shutter.xml new file mode 100644 index 000000000..9abbe1d59 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_shutter.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_camera_toggle.xml b/app/src/main/res/drawable/ic_camera_toggle.xml new file mode 100644 index 000000000..56a26f6f0 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_toggle.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_camera_video.xml b/app/src/main/res/drawable/ic_camera_video.xml new file mode 100644 index 000000000..25ba545e7 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_video.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_camera_video_recording.xml b/app/src/main/res/drawable/ic_camera_video_recording.xml new file mode 100644 index 000000000..6742eb620 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_video_recording.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_cancel.xml b/app/src/main/res/drawable/ic_cancel.xml new file mode 100644 index 000000000..9421788a2 --- /dev/null +++ b/app/src/main/res/drawable/ic_cancel.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_colorize.xml b/app/src/main/res/drawable/ic_colorize.xml new file mode 100644 index 000000000..62843bbfa --- /dev/null +++ b/app/src/main/res/drawable/ic_colorize.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 000000000..e2425de88 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_done.xml b/app/src/main/res/drawable/ic_done.xml new file mode 100644 index 000000000..3b41c7d3b --- /dev/null +++ b/app/src/main/res/drawable/ic_done.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_face.xml b/app/src/main/res/drawable/ic_face.xml new file mode 100644 index 000000000..237304b83 --- /dev/null +++ b/app/src/main/res/drawable/ic_face.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_focus_mode_auto.xml b/app/src/main/res/drawable/ic_focus_mode_auto.xml new file mode 100644 index 000000000..d1e5e09b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_focus_mode_auto.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_focus_mode_infinity.xml b/app/src/main/res/drawable/ic_focus_mode_infinity.xml new file mode 100644 index 000000000..2aa6de863 --- /dev/null +++ b/app/src/main/res/drawable/ic_focus_mode_infinity.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_focus_mode_locked.xml b/app/src/main/res/drawable/ic_focus_mode_locked.xml new file mode 100644 index 000000000..2de1215b8 --- /dev/null +++ b/app/src/main/res/drawable/ic_focus_mode_locked.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_focus_mode_macro.xml b/app/src/main/res/drawable/ic_focus_mode_macro.xml new file mode 100644 index 000000000..83d8320cb --- /dev/null +++ b/app/src/main/res/drawable/ic_focus_mode_macro.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_iso.xml b/app/src/main/res/drawable/ic_iso.xml new file mode 100644 index 000000000..91a357038 --- /dev/null +++ b/app/src/main/res/drawable/ic_iso.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mic.xml b/app/src/main/res/drawable/ic_mic.xml new file mode 100644 index 000000000..4f1fe082e --- /dev/null +++ b/app/src/main/res/drawable/ic_mic.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_more.xml b/app/src/main/res/drawable/ic_more.xml new file mode 100644 index 000000000..97dc40fe7 --- /dev/null +++ b/app/src/main/res/drawable/ic_more.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 000000000..7e719d8e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_play.xml b/app/src/main/res/drawable/ic_play.xml new file mode 100644 index 000000000..c1997c450 --- /dev/null +++ b/app/src/main/res/drawable/ic_play.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_preference_auto_stabilise.xml b/app/src/main/res/drawable/ic_preference_auto_stabilise.xml new file mode 100644 index 000000000..71b5fe40d --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_auto_stabilise.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_camera_flash_on.xml b/app/src/main/res/drawable/ic_preference_camera_flash_on.xml new file mode 100644 index 000000000..58b60758f --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_camera_flash_on.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_preference_camera_preview.xml b/app/src/main/res/drawable/ic_preference_camera_preview.xml new file mode 100644 index 000000000..dff67e47f --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_camera_preview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_cog.xml b/app/src/main/res/drawable/ic_preference_cog.xml new file mode 100644 index 000000000..394f1a119 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_cog.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_exposure_unlocked.xml b/app/src/main/res/drawable/ic_preference_exposure_unlocked.xml new file mode 100644 index 000000000..847fac1ee --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_exposure_unlocked.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_preference_face.xml b/app/src/main/res/drawable/ic_preference_face.xml new file mode 100644 index 000000000..fa07ae306 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_face.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_preference_focus_peaking.xml b/app/src/main/res/drawable/ic_preference_focus_peaking.xml new file mode 100644 index 000000000..ac106bbfc --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_focus_peaking.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_folder_open.xml b/app/src/main/res/drawable/ic_preference_folder_open.xml new file mode 100644 index 000000000..7b88044b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_folder_open.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_help.xml b/app/src/main/res/drawable/ic_preference_help.xml new file mode 100644 index 000000000..290197c05 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_help.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_info.xml b/app/src/main/res/drawable/ic_preference_info.xml new file mode 100644 index 000000000..a9e537021 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_info.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_location.xml b/app/src/main/res/drawable/ic_preference_location.xml new file mode 100644 index 000000000..a3e877e76 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_location.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_mic.xml b/app/src/main/res/drawable/ic_preference_mic.xml new file mode 100644 index 000000000..c1046645e --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_mic.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_preference_more_horizontal.xml b/app/src/main/res/drawable/ic_preference_more_horizontal.xml new file mode 100644 index 000000000..b3663c74d --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_more_horizontal.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_on_screen_gui.xml b/app/src/main/res/drawable/ic_preference_on_screen_gui.xml new file mode 100644 index 000000000..4b6796e49 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_on_screen_gui.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_photo_settings.xml b/app/src/main/res/drawable/ic_preference_photo_settings.xml new file mode 100644 index 000000000..fae1ec549 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_photo_settings.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_photo_size_select.xml b/app/src/main/res/drawable/ic_preference_photo_size_select.xml new file mode 100644 index 000000000..5d40ece83 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_photo_size_select.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_power.xml b/app/src/main/res/drawable/ic_preference_power.xml new file mode 100644 index 000000000..2c4b973fb --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_power.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_processing.xml b/app/src/main/res/drawable/ic_preference_processing.xml new file mode 100644 index 000000000..af29186f0 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_processing.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_preference_save.xml b/app/src/main/res/drawable/ic_preference_save.xml new file mode 100644 index 000000000..560333a54 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_save.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_text_format.xml b/app/src/main/res/drawable/ic_preference_text_format.xml new file mode 100644 index 000000000..f8ad413e1 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_text_format.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_text_stamp.xml b/app/src/main/res/drawable/ic_preference_text_stamp.xml new file mode 100644 index 000000000..162807993 --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_text_stamp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_timer.xml b/app/src/main/res/drawable/ic_preference_timer.xml new file mode 100644 index 000000000..d71a2d7da --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_timer.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_touch_app.xml b/app/src/main/res/drawable/ic_preference_touch_app.xml new file mode 100644 index 000000000..30a1ec5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_touch_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_preference_video_settings.xml b/app/src/main/res/drawable/ic_preference_video_settings.xml new file mode 100644 index 000000000..761ecc0fb --- /dev/null +++ b/app/src/main/res/drawable/ic_preference_video_settings.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_raw.xml b/app/src/main/res/drawable/ic_raw.xml new file mode 100644 index 000000000..7020a3f07 --- /dev/null +++ b/app/src/main/res/drawable/ic_raw.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 000000000..5ff6fec08 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_share.xml b/app/src/main/res/drawable/ic_share.xml new file mode 100644 index 000000000..fcb75da98 --- /dev/null +++ b/app/src/main/res/drawable/ic_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_shutter_speed.xml b/app/src/main/res/drawable/ic_shutter_speed.xml new file mode 100644 index 000000000..074469888 --- /dev/null +++ b/app/src/main/res/drawable/ic_shutter_speed.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_switch_camera.xml b/app/src/main/res/drawable/ic_switch_camera.xml new file mode 100644 index 000000000..3c2171f74 --- /dev/null +++ b/app/src/main/res/drawable/ic_switch_camera.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_switch_multi_camera.xml b/app/src/main/res/drawable/ic_switch_multi_camera.xml new file mode 100644 index 000000000..8d17d9266 --- /dev/null +++ b/app/src/main/res/drawable/ic_switch_multi_camera.xml @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_switch_video.xml b/app/src/main/res/drawable/ic_switch_video.xml new file mode 100644 index 000000000..07b801e2c --- /dev/null +++ b/app/src/main/res/drawable/ic_switch_video.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_text_stamp.xml b/app/src/main/res/drawable/ic_text_stamp.xml new file mode 100644 index 000000000..c8116a086 --- /dev/null +++ b/app/src/main/res/drawable/ic_text_stamp.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_white_balance_unlocked.xml b/app/src/main/res/drawable/ic_white_balance_unlocked.xml new file mode 100644 index 000000000..6f2d66a44 --- /dev/null +++ b/app/src/main/res/drawable/ic_white_balance_unlocked.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_zoom_in.xml b/app/src/main/res/drawable/ic_zoom_in.xml new file mode 100644 index 000000000..3871a062c --- /dev/null +++ b/app/src/main/res/drawable/ic_zoom_in.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_zoom_out.xml b/app/src/main/res/drawable/ic_zoom_out.xml new file mode 100644 index 000000000..097729743 --- /dev/null +++ b/app/src/main/res/drawable/ic_zoom_out.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/popup_camera_flash_auto.xml b/app/src/main/res/drawable/popup_camera_flash_auto.xml new file mode 100644 index 000000000..b724899fb --- /dev/null +++ b/app/src/main/res/drawable/popup_camera_flash_auto.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/main/res/drawable/popup_camera_flash_off.xml b/app/src/main/res/drawable/popup_camera_flash_off.xml new file mode 100644 index 000000000..a20462a3a --- /dev/null +++ b/app/src/main/res/drawable/popup_camera_flash_off.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/popup_camera_flash_on.xml b/app/src/main/res/drawable/popup_camera_flash_on.xml new file mode 100644 index 000000000..c73583d0b --- /dev/null +++ b/app/src/main/res/drawable/popup_camera_flash_on.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/popup_camera_flash_red_eye.xml b/app/src/main/res/drawable/popup_camera_flash_red_eye.xml new file mode 100644 index 000000000..ccbbeb3fc --- /dev/null +++ b/app/src/main/res/drawable/popup_camera_flash_red_eye.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/popup_camera_flash_torch.xml b/app/src/main/res/drawable/popup_camera_flash_torch.xml new file mode 100644 index 000000000..c7be3adbe --- /dev/null +++ b/app/src/main/res/drawable/popup_camera_flash_torch.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/main/res/drawable/shortcut_gallery.xml b/app/src/main/res/drawable/shortcut_gallery.xml index bfe1492cf..81c87d31a 100644 --- a/app/src/main/res/drawable/shortcut_gallery.xml +++ b/app/src/main/res/drawable/shortcut_gallery.xml @@ -1,9 +1,9 @@ - - - + + + - + diff --git a/app/src/main/res/drawable/shortcut_ic_face_white_48dp.xml b/app/src/main/res/drawable/shortcut_ic_face_white_48dp.xml index 61087dd69..b79d90eae 100644 --- a/app/src/main/res/drawable/shortcut_ic_face_white_48dp.xml +++ b/app/src/main/res/drawable/shortcut_ic_face_white_48dp.xml @@ -1,9 +1,9 @@ - - - + + + - + diff --git a/app/src/main/res/drawable/shortcut_ic_photo_camera_white_48dp.xml b/app/src/main/res/drawable/shortcut_ic_photo_camera_white_48dp.xml index aa0ca23e1..51f8a1a91 100644 --- a/app/src/main/res/drawable/shortcut_ic_photo_camera_white_48dp.xml +++ b/app/src/main/res/drawable/shortcut_ic_photo_camera_white_48dp.xml @@ -1,9 +1,9 @@ - - - + + + - + diff --git a/app/src/main/res/drawable/shortcut_ic_videocam_white_48dp.xml b/app/src/main/res/drawable/shortcut_ic_videocam_white_48dp.xml index abc44e2aa..683456743 100644 --- a/app/src/main/res/drawable/shortcut_ic_videocam_white_48dp.xml +++ b/app/src/main/res/drawable/shortcut_ic_videocam_white_48dp.xml @@ -1,9 +1,9 @@ - - - + + + diff --git a/app/src/main/res/drawable/shortcut_settings.xml b/app/src/main/res/drawable/shortcut_settings.xml index 244cf6533..9bcdd00f2 100644 --- a/app/src/main/res/drawable/shortcut_settings.xml +++ b/app/src/main/res/drawable/shortcut_settings.xml @@ -1,9 +1,9 @@ - - - + + + - + diff --git a/app/src/main/res/drawable/take_photo_selector.xml b/app/src/main/res/drawable/take_photo_selector.xml index 09f412724..4b0116440 100644 --- a/app/src/main/res/drawable/take_photo_selector.xml +++ b/app/src/main/res/drawable/take_photo_selector.xml @@ -1,6 +1,6 @@ - + android:drawable="@drawable/ic_camera_shutter" /> + diff --git a/app/src/main/res/drawable/take_photo_when_video_recording.xml b/app/src/main/res/drawable/take_photo_when_video_recording.xml new file mode 100644 index 000000000..8e740588f --- /dev/null +++ b/app/src/main/res/drawable/take_photo_when_video_recording.xml @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/take_video_recording.xml b/app/src/main/res/drawable/take_video_recording.xml index de5143a63..91c73c165 100644 --- a/app/src/main/res/drawable/take_video_recording.xml +++ b/app/src/main/res/drawable/take_video_recording.xml @@ -1,11 +1,4 @@ - - - - - + + + diff --git a/app/src/main/res/drawable/take_video_selector.xml b/app/src/main/res/drawable/take_video_selector.xml index e49fd08e6..4b0116440 100644 --- a/app/src/main/res/drawable/take_video_selector.xml +++ b/app/src/main/res/drawable/take_video_selector.xml @@ -1,6 +1,6 @@ - + android:drawable="@drawable/ic_camera_shutter" /> + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b425a5580..835ba282a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,140 +11,246 @@ android:layout_height="wrap_content" android:layout_centerInParent="true" /> - - - + + + + + + + + + + + + + + + + + + + + + + + + +