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:
Wybierz jeden z tych trybów:
W trybie wyłącznym użyj
CameraManager.openCamera
(Java) lubACameraManager_openCamera
w pakiecie Native Development Kit (NDK).W trybie udostępniania użyj
openSharedCamera
lubACameraManager_openSharedCamera
. Gdy włączysz udostępnianie kamery, podaj konfigurację sesji udostępnionej.
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) lubACameraDevice_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.
Aby zamknąć urządzenie z aparatem, użyj
CameraDevice.close()
(Java) lubACameraDevice_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:
- Aby rozpocząć transmisję, użyj
startVideoStream
. - Aby zatrzymać transmisję, użyj ikony
stopVideoStream
.
Camera2
W przypadku Camera2:
Utwórz obiekt
CaptureRequest
, którego można użyć do wyświetlania podglądu. UżyjTEMPLATE_PREVIEW
zCameraDevice.createCaptureRequest()
w Java lubACameraDevice_createCaptureRequest()
w NDK.Prześlij żądanie ciągłego odtwarzania strumieniowego, używając
CameraCaptureSession.setSingleRepeatingRequest
(Java) lubACameraCaptureSession_setRepeatingRequestV2
(NDK).Zatrzymaj transmisję, używając
CameraCaptureSession.stopRepeating
(Java) lubACameraCaptureSession_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
lubImageReader
jest ustawiana za pomocąAImageReader_new
lubImageReader.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 obiektuImage
z niepowtarzalnym identyfikatorem.
Wstrzymywanie i wznawianie przesyłania strumieniowego
EVS używa
pauseVideoStream
iresumeVideoStream
.Camera2 nie ma bezpośrednich odpowiedników. Zamiast tego:
- Wstrzymaj, użyj
stopRepeating
- Wznów, użyj
setSingleRepeatingRequest
- Wstrzymaj, użyj
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 zUser 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
setPrimaryClient
iforcePrimaryClient
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:
Oznacz kamerę cofania jako kamerę systemową.
Uruchom usługę lub aplikację, która uzyskuje dostęp do aparatu, jako
User 0
z uprawnieniamiCAMERA_HEADLESS_SYSTEM_USER
.Dodaj aplikację do listy dozwolonych w zakresie prywatności kamery.
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.DisplayManager
i android.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. |