Migracja do Camera2

Na tej stronie znajdziesz różnice między systemem Extended View System (EVS) a interfejsem Camera2. Wyjaśniamy też, jak skonfigurować implementację Camera2.

Otwieranie i zamykanie aparatu

EVS

openCamera – łączy otwieranie urządzenia i konfigurowanie pojedynczego strumienia.

Camera2

Aby otworzyć i zamknąć urządzenie za pomocą Camera2:

  1. Wybierz jeden z tych trybów:

  2. Aby skonfigurować strumienie, utwórz sesję przechwytywania z odpowiednimi powierzchniami wyjściowymi. Na przykład z klasy ImageReader lub SurfaceView za pomocą funkcji CameraDevice.createCaptureSession() (Java) lub ACameraDevice_createCaptureSession() (NDK).

    Camera2 obsługuje wiele strumieni jednocześnie. Tworzenie wielu strumieni na potrzeby podglądu, nagrywania i przetwarzania obrazu. Strumienie działają jak równoległe potoki, które sekwencyjnie przetwarzają surowe klatki z kamery.

  3. Aby zamknąć urządzenie z aparatem, użyj CameraDevice.close() (Java) lub ACameraDevice_close() (NDK).

Oto przykładowe fragmenty kodu:

Java

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    manager.openCamera(cameraId, new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            // Camera opened, now create session
        }
        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {}
        @Override
        public void onError(@NonNull CameraDevice camera, int error) {}
    }, handler);
} catch (CameraAccessException e) {
    // Handle exception
}

NDK

ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
    cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);

Przesyłanie strumieniowe danych z kamery

W tej sekcji opisujemy, jak przesyłać strumieniowo dane z kamery.

EVS

W przypadku EVS:

  1. Aby rozpocząć transmisję, użyj startVideoStream.
  2. Aby zatrzymać transmisję, użyj ikony stopVideoStream.

Camera2

W przypadku Camera2:

  1. Utwórz obiekt CaptureRequest, którego można użyć do wyświetlania podglądu. Użyj TEMPLATE_PREVIEWCameraDevice.createCaptureRequest() w Java lub ACameraDevice_createCaptureRequest() w NDK.

  2. Prześlij żądanie ciągłego odtwarzania strumieniowego, używając CameraCaptureSession.setSingleRepeatingRequest (Java) lub ACameraCaptureSession_setRepeatingRequestV2 (NDK).

  3. Zatrzymaj transmisję, używając CameraCaptureSession.stopRepeating (Java) lub ACameraCaptureSession_stopRepeating (NDK).

Zarządzanie buforem

  • W przypadku EVS parametr setMaxFramesInFlight wcześniej kontrolował liczbę buforów, która mogła zostać zmieniona w trakcie transmisji. Po rozpoczęciu przesyłania strumieniowego z kamery system EVS udostępniał identyfikator bufora dla każdej klatki obrazu, który był powiązany z tym samym adresem bufora sprzętowego w pamięci.

  • W przypadku Camera2 maksymalna liczba zdjęć dla AImageReader lub ImageReader jest ustawiana za pomocą AImageReader_new lub ImageReader.newInstance podczas inicjowania sesji. Po rozpoczęciu sesji nie można dynamicznie zmieniać tego ustawienia. Aby uzyskać identyfikator bufora dla każdej klatki, klienci mogą prowadzić mapę, która koreluje adres bufora sprzętowego uzyskany z obiektu Image z niepowtarzalnym identyfikatorem.

Wstrzymywanie i wznawianie przesyłania strumieniowego

Parametry aparatu

  • EVS używało metod takich jak setIntParameter, aby zmienić parametr żądania przechwytywania obrazu z kamery.

  • Aby zmodyfikować parametry w interfejsie Camera2, wywołaj interfejs API set dla CaptureRequest konstruktora, a następnie prześlij go.

Oto przykładowe fragmenty kodu:

Java

CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request

NDK

ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);

Kamery logiczne

  • EVS: w przypadku kamer logicznych, takich jak Surround View, menedżer EVS otwierał wszystkie powiązane kamery fizyczne, inicjował strumienie wideo i zapewniał spójną tablicę obrazów.

  • Camera2: jeśli podobna funkcjonalność jest potrzebna w przypadku interfejsu Camera2, aplikacje muszą zarządzać kamerami logicznymi, co wymaga:

    • Określ fizyczne aparaty pomocnicze powiązane z aparatem logicznym.
    • Otwórz każdy potrzebny aparat fizyczny.
    • Uruchom strumienie na każdej kamerze.
    • W razie potrzeby zsynchronizuj klatki. Optymalnie jest to obsługiwane na poziomie HAL w przypadku synchronizacji na poziomie sprzętu.

Obecnym klientom EVS udostępnimy bibliotekę zgodności (warstwę pośrednią), aby ułatwić im przejście na nową wersję. Celem jest obsługa interfejsów API Camera2 przy minimalnych zmianach w kodzie.

Uprawnienia

EVS

Dostęp jest ograniczony do uprzywilejowanych unikalnych identyfikatorów (UID). Na przykład: AID_AUTOMOTIVE_EVS. Wycofane uprawnienia obejmująandroid.car.permission.USE_CAR_EVS_CAMERA.

Camera2

Camera2 wymaga android.permission.CAMERA. W przypadku szczególnych sytuacji:

  • android.permission.SYSTEM_CAMERA: aby uzyskać dostęp do kamer ukrytych przed aplikacjami innych firm. Wymaga też uprawnień CAMERA. Więcej informacji znajdziesz w artykule Kamery systemowe.

  • android.permission.CAMERA_HEADLESS_SYSTEM_USER: zezwala na dostęp z User 0, co jest kluczowe w przypadku usług takich jak kamery cofania, które muszą działać niezależnie od tego, czy użytkownik przełącza się między profilami. Wymaga wstępnie przyznanych uprawnień do korzystania z aparatu.

  • android.permission.CAMERA_PRIVACY_ALLOWLIST: umożliwia producentom OEM wyłączenie niektórych aplikacji o krytycznym znaczeniu dla bezpieczeństwa z ustawienia prywatności kamery kontrolowanego przez użytkownika.

Aplikacje korzystające z kamery, które mają kluczowe znaczenie dla bezpieczeństwa, muszą być zgodne z zasadami Google dotyczącymi wstępnego przyznawania uprawnień, które są dostępne w tym artykule.

Klienci główni i dodatkowi

W przypadku udostępnionego dostępu do kamery:

  • EVS oferował jawne interfejsy API setPrimaryClientforcePrimaryClient do zarządzania klientem głównym, który miał uprawnienia do modyfikowania parametrów.

  • W przypadku Camera2, gdy kamera jest otwarta w trybie udostępniania (Android 16 i nowszy), priorytet klienta uzyskującego dostęp do kamery określa klienta głównego. Klient o najwyższym priorytecie (zwykle aplikacja działająca na pierwszym planie) może modyfikować parametry żądania przechwytywania. Do wymuszenia stanu podstawowego nie są używane żadne bezpośrednie interfejsy API. Stan podstawowy jest zarządzany przez platformę.

Aparaty systemowe

Aby ograniczyć dostęp do urządzenia z kamerą tylko do aplikacji systemowych lub aplikacji własnych, zadeklaruj w warstwie HAL aparatu dla tego urządzenia funkcję ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA. Klienci muszą mieć android.permission.SYSTEM_CAMERA oraz android.permission.CAMERA, aby połączyć się z tym urządzeniem.

CarEVSManager i CarEVSService

W przypadku dostępu do interfejsu API aplikacje Java powinny używać standardowego kodu android.hardware.camera2.CameraManager zamiast CarEVSManager.

W przypadku kamery cofania logika w CarEVSService, która monitoruje właściwość VHAL i uruchamia aktywność, musi zostać przeniesiona do aplikacji należącej do producenta OEM. Ta aplikacja:GEAR_SELECTION

  • Monitoruje właściwość VHAL GEAR_SELECTION.
  • Uruchamia widok z kamery cofania po włączeniu biegu wstecznego.
  • Wyświetla obraz z kamery za pomocą interfejsów API Camera2.

Aby zapewnić spójne i niezakłócone wyświetlanie obrazu z kamery tylnej, zwłaszcza podczas przełączania się użytkownika między aplikacjami lub gdy inne aplikacje mogą zasłaniać podgląd, zalecamy stosowanie tych wytycznych podczas wdrażania funkcji kamery tylnej za pomocą Camera2:

Renderowanie wyświetlania

wyświetlacz EVS i usługa wyświetlacza samochodowego;

Te funkcje zostały wycofane.

Camera2

Użyj standardowych metod renderowania na Androidzie z elementami Surface,android.hardware.display.DisplayManagerandroid.view.Display.

W przypadku scenariuszy wymagających wczesnego wyświetlania obrazu z kamery interfejs Camera2 ImageReader może zapewnić bezpośredni dostęp do bufora sprzętowego, dzięki czemu możesz zintegrować go z dotychczasowymi implementacjami wyświetlania opartymi na DRM.

Wcześniejszy dostęp do aparatu jest dozwolony wyłącznie w przypadku klientów o podwyższonych uprawnieniach, którzy mają AID_AUTOMOTIVE_EVS_UID, i jest ograniczony do kamer systemowych znajdujących się na zewnątrz pojazdu.

Warstwa HAL emulatora (mock HAL EVS)

Planujemy wycofać EVS Mock HAL. Zamiast tego producenci OEM powinni używać emulowanego interfejsu HAL aparatu Camera2, hardware/google/camera/devices/EmulatedCamera/, który zostanie ulepszony, aby obsługiwać:

  • Konfigurowalna liczba kamer.
  • Wzorce testowe pasków kolorów.
  • emulacja pliku wideo,

Aby uwzględnić tę warstwę HAL w kompilacji:

# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal

Aby umożliwić cameraserver interakcję z usługą Emulated Camera HAL, wymagane są też odpowiednie zasady SELinux.

Warstwa HAL kamery V4L2 UVC

Planujemy wycofać EVS V4L2 HAL. Używaj obsługi kamer zewnętrznych Camera2 w przypadku kamer USB (UVC). Więcej informacji znajdziesz w sekcji Zewnętrzne kamery USB.

Wcześniejszy dostęp do aparatu

Dostęp do kamery EVS był ograniczony do uprzywilejowanych klientów z identyfikatorem UID AID_AUTOMOTIVE_EVS. Dostęp do kamery przed zakończeniem procesu uruchamiania Androida, pod warunkiem że identyfikator UID pozostanie AID_AUTOMOTIVE_EVS. Wczesny dostęp do kamery jest jednak ograniczony do kamer systemowych znajdujących się na zewnątrz pojazdu.

Interfejsy API ultradźwięków

Planujemy wycofać interfejsy API EVS Ultrasonics. Zamiast tego używaj tych właściwości VHAL wprowadzonych w Androidzie 15 do wykrywania przez czujnik ultradźwiękowy.

Właściwość Typ Definicja
ULTRASONICS_SENSOR_POSITION Statyczny {<x>, <y>, <z>}

W milimetrach, każda wartość reprezentuje położenie czujnika wzdłuż powiązanej osi względem układu współrzędnych czujnika AAOS.

ULTRASONICS_SENSOR_ORIENTATION Statyczny {<qw>, <qx>, <qy>, <qz>}

Który z tych obrotów kwaternionowych czujnika jest względny w stosunku do układu współrzędnych czujnika AAOS: $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW Statyczny {<horizontal>, <vertical>}

Poziome i pionowe pole widzenia czujnika w stopniach.

ULTRASONICS_SENSOR_DETECTION_RANGE Statyczny {<minimum>, <maximum>}

Zasięg wykrywania czujnika w milimetrach.

ULTRASONICS_SENSOR_DETECTION_RANGES Statyczny {<range_min_1>, <range_max_1>, <range_min_2>, <range_max_2>}

W milimetrach, włącznie z wartościami granicznymi, tablica obsługiwanych zakresów wykrywania czujnika.

ULTRASONICS_SENSOR_DETECTION_RANGES Ciągły {<distance>, <distance_error>}

W milimetrach: zmierzona odległość i błąd pomiaru czujnika. Jeśli obsługiwany jest tylko zakres, jest to minimalna odległość w wykrytym zakresie.