Obsługa aparatu na różnych urządzeniach

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.

Rysunek 1. Przykład aplikacji aparatu na różnych wyświetlaczach.

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_0 to zawsze orientacja pionowa.
  • Rzeczywistość: na tabletach, wewnętrznych ekranach niektórych urządzeń składanych i monitorach komputerów stacjonarnych ROTATION_0 jest często wyświetlany w orientacji poziomej.
  • Wynik: podgląd jest nieprawidłowo obrócony o 90 stopni.
Rysunek 2. Wizjer aparatu przed zastosowaniem prawidłowego obrotu i po jego zastosowaniu.

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.
Rysunek 3. Wizjer aparatu przed zastosowaniem prawidłowego współczynnika skalowania i po jego zastosowaniu.

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. CameraXViewfinder udostępnia CoordinateTransformer, 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 SurfaceView lub TextureView element CameraXViewfinder dział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: CameraXViewfinder wewnę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.

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.

Rysunek 5. Aplikacja komunikacyjna w trybie stołu: wizjer aparatu znajduje się u góry zawiasu, a elementy sterujące u dołu.

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.
Rysunek 5. Aplikacja aparatu w trybie dwóch ekranów.