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 współczynników proporcji i sprzętu zewnętrznego.

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

Dlaczego logika telefonu nie działa

Aplikacje aparatu często przyjmują założenia, które powodują krytyczne błędy w środowiskach z wieloma rodzajami urządzeń.

Naturalna orientacja

  • Założenie: naturalna orientacja urządzenia ROTATION_0 to zawsze orientacja pionowa.
  • Rzeczywistość: na tabletach, wewnętrznych wyświetlaczach 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. Widok z aparatu przed zastosowaniem prawidłowego obrotu i po jego zastosowaniu.

Wyrównanie czujnika

  • Założenie: dłuższa krawędź czujnika aparatu jest wyrównana z dłuższą krawędzią ekranu.
  • Rzeczywistość: rozmiar okna można zmieniać, może ono być kwadratowe lub poziome, a czujnik 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.
  • Wynik: ponowne uruchamianie sesji kamery przy każdym zdarzeniu przeciągnięcia zakłóca wygodę użytkownika 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 wielu oknach lub gdy aplikacja przenosi się na podłączony wyświetlacz. Dzięki temu strumień podglądu dostosowuje się bez zacinania i rozciągania.

Komponenty takie jak PreviewView inteligentnie zarządzają współczynnikiem proporcji 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óżne urządzenia 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 jest specjalnie zaprojektowany 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 współczynnik proporcji: CameraXViewfinder wewnętrznie obsługuje logikę przycinania do środkadopasowywania do środka, dzięki czemu podgląd nie rozciąga się, gdy rozmiar okna aplikacji jest zmieniany na niestandardowe współczynniki proporcji (np. w trybie podzielonego ekranu lub okna na komputerze).

Wyświetlenia

W aplikacjach opartych na widokach używaj 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 (interfejs w trybie poziomym lub pionowym), porównując szerokość i wysokość 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 obraz 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 pozostanie niezakłócony i wypełni 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.
  • 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ą one wyjątkowe 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 pozwala użytkownikom złożyć urządzenie na pół i postawić je na powierzchni, aby prowadzić dłuższe rozmowy wideo, robić zdjęcia poklatkowe i zdjęcia nocne z długim czasem naświetlania.

Rysunek 5. Aplikacja do komunikacji 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 użytkownikowi 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 podwójnego ekranu 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ę, a Ty możesz ustawić kadr 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.