Aplikacje na Androida działają na różnych urządzeniach, nie tylko na telefonach trzymanych w trybie pionowym. Wraz z wprowadzeniem trybu okien na pulpicie, podłączonych wyświetlaczy i urządzeń składanych aplikacja aparatu musi dostosowywać się do dynamicznych rozmiarów okien, różnych proporcji i sprzętu zewnętrznego.
Dlaczego logika telefonu nie działa
Aplikacje do obsługi aparatu często przyjmują założenia, które powodują poważne błędy w środowiskach o różnych formatach.
Naturalna orientacja
- Założenie: naturalna orientacja urządzenia
ROTATION_0to zawsze orientacja pionowa. - Rzeczywistość: na tabletach, wewnętrznych ekranach niektórych urządzeń składanych i monitorach komputerów stacjonarnych
ROTATION_0jest często wyświetlany w orientacji poziomej. - Wynik: podgląd jest nieprawidłowo obrócony o 90 stopni.
Wyrównanie czujnika
- Założenie: dłuższy bok czujnika aparatu jest równoległy do dłuższego boku ekranu.
- Rzeczywistość: okno o zmienianym rozmiarze może być kwadratowe lub poziome, a sensor pozostaje nieruchomy (zwykle 4:3).
- Wynik: rozciągnięte lub w inny sposób zniekształcone obrazy.
Gęstość i rozmiar ekranu
- Założenie: gęstość i rozmiar ekranu nie zmieniają się w czasie działania.
- Fakt: w środowiskach komputerowych użytkownicy mogą dowolnie zmieniać rozmiar okien.
- Skutek: ponowne uruchamianie sesji kamery przy każdym zdarzeniu przeciągania zakłóca działanie aplikacji i może powodować awarie.
Rozwiązanie 1. Używanie intencji systemowych
Jeśli aplikacja musi zrobić zdjęcie lub nagrać film, ale nie wymaga specjalistycznego interfejsu kamery, najlepszym sposobem na obsługę różnych formatów jest uruchomienie preinstalowanej kamery systemowej urządzenia (patrz Intencje kamery).
Użycie intencji systemowej przekazuje całą funkcję przechwytywania do aplikacji aparatu opracowanej przez producenta oryginalnego sprzętu (OEM). W ten sposób zlecasz na zewnątrz obsługę złożonych kwestii związanych z obsługą różnych formatów, takich jak:
- Wbudowana obsługa zmiany rozmiaru i obracania – domyślna aplikacja Aparat na urządzeniu składanym lub tablecie jest specjalnie tworzona przez producenta, aby obsługiwać geometrię tego konkretnego urządzenia. Aplikacja jest zaprojektowana tak, aby działać prawidłowo po rozłożeniu, obróceniu lub przełączeniu urządzenia w tryb wielu okien.
- Dostęp do zaawansowanych funkcji sprzętowych – aplikacje aparatu OEM mają wyłączny dostęp do algorytmów dostosowanych do sprzętu (tryb nocny, HDR, przełączanie obiektywów), które trudno lub wręcz niemożliwe jest odtworzenie ręcznie.
Rozwiązanie 2. Użyj biblioteki Jetpack CameraX
CameraX to biblioteka Jetpack, która ułatwia tworzenie aplikacji aparatu. CameraX uwzględnia cykl życia i jest zorientowana na powierzchnię. W przeciwieństwie do Camera2, która wymaga ręcznego ponownego obliczania orientacji czujnika i rozmiarów powierzchni za każdym razem, gdy urządzenie jest składane, obracane lub zmieniane, CameraX automatycznie obsługuje ponowną konfigurację sesji aparatu podczas zmiany rozmiaru w trybie wielu okien lub gdy aplikacja przenosi się na podłączony wyświetlacz. Dzięki temu strumień podglądu dostosowuje się bez przeskoków i rozciągania.
Komponenty takie jak PreviewView inteligentnie zarządzają formatem obrazu i rodzajami skalowania w różnych stanach, np. gdy urządzenie składane przechodzi z ekranu zewnętrznego na wewnętrzny. Dzięki temu możesz obsługiwać różnorodny sprzęt za pomocą jednej, spójnej implementacji, a nie skomplikowanego zbioru przypadków brzegowych specyficznych dla poszczególnych urządzeń.
Compose
W przypadku Jetpack Compose użyj biblioteki androidx.camera:camera-compose. Biblioteka udostępnia komponent CameraXViewfinder, który został zaprojektowany specjalnie do obsługi złożonej geometrii zmiany rozmiaru, obrotu i proporcji w cyklu życia Compose.
Komponent CameraXViewfinder eliminuje najczęstsze źródła błędów w aplikacjach aparatu:
- Automatyczna transformacja współrzędnych – jednym z najtrudniejszych elementów tworzenia aplikacji aparatu jest mapowanie dotknięcia użytkownika (współrzędne x, y na ekranie) na układ współrzędnych czujnika aparatu (0–1, 0–1 obrócone) na potrzeby ustawiania ostrości i pomiaru światła.
CameraXViewfinderudostępniaCoordinateTransformer, który automatycznie wykonuje obliczenia matematyczne, nawet gdy okno jest zmieniane lub urządzenie jest składane. - Prawidłowe działanie układu – w przeciwieństwie do
SurfaceViewlubTextureViewelementCameraXViewfinderdziała prawidłowo z kolejnością z w Compose. Możesz nakładać elementy interfejsu (pierścienie zaznaczenia, elementy sterujące) lub stosować modyfikatory (zaokrąglanie rogów, animacje) bez artefaktów renderowania. - Zmiana rozmiaru i format obrazu:
CameraXViewfinderwewnętrznie obsługuje logikę przycinania do środka w porównaniu z dopasowaniem do środka, dzięki czemu podgląd nie rozciąga się, gdy rozmiar okna aplikacji jest zmieniany na niestandardowe formaty obrazu (np. w trybie podzielonego ekranu lub trybie okien na pulpicie).
Wyświetlenia
W przypadku aplikacji opartych na widokach użyj PreviewView lub ViewFinderView. Jeśli używasz bezpośrednio SurfaceView lub TextureView, musisz samodzielnie obliczyć współczynnik proporcji i zastosować odpowiednią macierz przekształceń.
Rozwiązanie 3. Dynamiczne obsługiwanie orientacji i zmiany rozmiaru
Jeśli korzystasz bezpośrednio z interfejsów API platformy, pamiętaj o obracaniu urządzenia, ponownym uruchamianiu aktywności i proporcjach obrazu.
Wyłączanie obracania urządzenia
Nie polegaj wyłącznie na Display#getRotation() ani na orientacji czujnika fizycznego, aby określić układ interfejsu.
- Używaj danych okna – określ układ (poziomy lub pionowy interfejs) przez porównanie szerokości i wysokości okna aplikacji za pomocą
WindowManager#getCurrentWindowMetrics(). - Ignoruj naturalną orientację – aplikacja może być wyświetlana w oknie w orientacji pionowej na monitorze w orientacji poziomej. Orientacja urządzenia nie ma znaczenia dla granic interfejsu.
Unikanie ponownego uruchamiania aktywności
Domyślne działanie Androida powoduje zniszczenie aktywności aplikacji podczas zmian konfiguracji (np. zmiany rozmiaru okna). W przypadku aplikacji aparatu objawia się to migotaniem ekranu lub przerwaniem połączenia podczas rozmów wideo.
- Konfiguracja pliku manifestu – zadeklaruj zmiany konfiguracji w pliku manifestu, aby obsługiwać zmianę rozmiaru bez ponownego uruchamiania.
- Dynamiczne aktualizacje – w
onConfigurationChanged()zaktualizuj parametry układu podglądu z kamery, aby dopasować je do nowego rozmiaru okna.
Format obrazu i przycinanie
Częstym problemem na urządzeniach składanych i w oknach na komputerach jest rozciąganie podglądu, w którym przekaz z kamery w formacie 4:3 jest wymuszany w oknie 16:9 lub 1:1.
- Nie rozciągaj – nigdy nie wymuszaj dopasowania bufora kamery do granic widoku, jeśli formaty obrazu podglądu i okna są różne.
- Przytnij do środka (zalecane): skaluj podgląd, aby wypełnić krótszy wymiar okna, i przytnij nadmiar. Dzięki temu obiekt pozostaje niezakłócony i wypełnia kadr.
- Dopasuj do środka (alternatywnie): jeśli wyświetlanie pełnego pola widzenia jest kluczowe (np. podczas skanowania dokumentu), umieść podgląd w ramce w oknie.
Bonus: obsługa urządzeń składanych
Składane urządzenia to nie tylko telefony, które można zgiąć. Oferują też unikalne stany sprzętowe, które mogą zasadniczo poprawić sposób robienia zdjęć i nagrywania filmów. Zamiast traktować zgięcie jako problem do rozwiązania, wykorzystaj je do tworzenia funkcji, które są niemożliwe na urządzeniach bez możliwości składania.
Tryb stołu (nagrywanie bez użycia rąk)
Tryb stołu umożliwia użytkownikom złożenie urządzenia na pół i ustawienie go na powierzchni do długich rozmów wideo, fotografii poklatkowej i nocnej z długim czasem naświetlania.
Tryb tylnego wyświetlacza (selfie wysokiej jakości)
- W przypadku urządzeń składanych tylne aparaty są zwykle lepszej jakości niż aparaty skierowane na użytkownika. Tryb tylnego wyświetlacza umożliwia rozłożenie urządzenia i obrócenie go, aby używać małego ekranu zewnętrznego jako wizjera na żywo dla głównego aparatu tylnego.
- Tryb tylnego wyświetlacza umożliwia robienie selfie w rozdzielczości ponad 50 Mpix, ultraszerokokątnych zdjęć grupowych i wysokiej jakości vlogów bez konieczności noszenia dodatkowego sprzętu.
Tryb dwóch ekranów (podgląd obiektu)
- Tryb dwóch ekranów umożliwia wyświetlanie podglądu z aparatu jednocześnie na ekranie wewnętrznym i zewnętrznym. To idealne rozwiązanie do fotografowania osób: fotografowane osoby mogą zobaczyć siebie na ekranie zewnętrznym i dopasować pozę, podczas gdy Ty kadrujesz ujęcie na ekranie wewnętrznym.
- W przeciwieństwie do trybu tylnego wyświetlacza (który przenosi całą aplikację) tryb dwóch ekranów tworzy dodatkowe okno prezentacji na ekranie zewnętrznym.