Camera2'ye geçiş

Bu sayfada, Extended View System (EVS) ile Camera2 arasındaki farklar açıklanmaktadır. Ayrıca, Camera2 uygulamanızı nasıl ayarlayacağınız da açıklanmaktadır.

Kamerayı açma ve kapatma

EVS

openCamera, cihazı açma ve tek bir akışı yapılandırma işlemlerini birleştirir.

Camera2

Camera2 ile bir cihazı açmak ve kapatmak için:

  1. Aşağıdaki modlardan birini seçin:

  2. Akışları yapılandırmak için ilgili çıkış yüzeyleriyle bir yakalama oturumu oluşturun. Örneğin, CameraDevice.createCaptureSession() (Java) veya ACameraDevice_createCaptureSession() (NDK) ile ImageReader veya SurfaceView'dan.

    Camera2, eşzamanlı birden fazla yayını destekler. Önizleme, kayıt ve görüntü işleme gibi amaçlar için birden fazla akış oluşturun. Akışlar, paralel işlem hatları gibi çalışarak kameradan gelen ham kareleri sırayla işler.

  3. Kamera cihazını kapatmak için CameraDevice.close() (Java) veya ACameraDevice_close() (NDK) kullanın.

Aşağıdaki örnek kod snippet'lerini inceleyin:

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);

Kamera verilerini yayınlama

Bu bölümde, kamera verilerinin nasıl yayınlanacağı açıklanmaktadır.

EVS

EVS'de:

  1. Yayını başlatmak için startVideoStream simgesini kullanın.
  2. Yayını durdurmak için stopVideoStream simgesini kullanın.

Camera2

Camera2'de:

  1. Önizlemeye uygun bir CaptureRequest oluşturun, Java'da TEMPLATE_PREVIEW ile CameraDevice.createCaptureRequest()'ı veya NDK'da ACameraDevice_createCaptureRequest()'ı kullanın.

  2. Sürekli akış isteğini gönderin, CameraCaptureSession.setSingleRepeatingRequest (Java) veya ACameraCaptureSession_setRepeatingRequestV2 (NDK) kullanın.

  3. Yayını durdurmak için CameraCaptureSession.stopRepeating (Java) veya ACameraCaptureSession_stopRepeating (NDK) kullanın.

Arabellek yönetimi

  • EVS'de setMaxFramesInFlight daha önce arabellek sayısını kontrol ediyordu. Bu sayı, yayın ortasında değiştirilebiliyordu. Kamera yayını başladığında EVS, her görüntü karesi için bir arabellek kimliği sağladı. Bu kimlik, bellekteki aynı donanım arabellek adresiyle ilişkiliydi.

  • Camera2'de, bir AImageReader veya ImageReader için maksimum resim sayısı, bir oturum başlatıldığında AImageReader_new veya ImageReader.newInstance ile ayarlanır. Bu, oturum başladıktan sonra dinamik olarak değiştirilemez. Her kare için arabellek kimliği almak üzere istemciler, Image nesnesinden alınan donanım arabellek adresini benzersiz bir tanımlayıcıyla ilişkilendiren bir harita tutabilir.

Yayınları duraklatma ve devam ettirme

  • EVS, pauseVideoStream ve resumeVideoStream özelliklerini kullanır.

  • Camera2'nin doğrudan eşdeğeri yoktur. Bunun yerine:

Kamera parametreleri

  • EVS, kamera yakalama isteği parametresini değiştirmek için setIntParameter gibi yöntemler kullanır.

  • Camera2'de parametreleri değiştirmek için CaptureRequest oluşturucu için set API'sini çağırın ve ardından gönderin.

Aşağıdaki kod örneklerini inceleyin:

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);

Mantıksal kameralar

  • EVS: Surround View gibi mantıksal kameralar için EVS Yöneticisi, ilişkili tüm fiziksel kameraları açar, video akışlarını başlatır ve tutarlı bir görüntü dizisi sağlar.

  • Camera2: Camera2 ile benzer işlevsellik gerektiğinde uygulamaların mantıksal kameraları yönetmesi gerekir. Bunun için şunları yapmanız gerekir:

    • Mantıksal bir kamerayla ilişkili fiziksel alt kameraları tanımlayın.
    • Gerekli olan her fiziksel kamerayı açın.
    • Her kamerada yayın başlatın.
    • Gerekirse kareleri senkronize edin. Bu işlem, donanım düzeyinde senkronizasyon için en iyi şekilde HAL'de gerçekleştirilir.

Geçişi kolaylaştırmak için mevcut EVS müşterilerine bir uyumluluk kitaplığı (shim katmanı) sağlayacağız. Amaç, Camera2 API'lerini kodda minimum değişiklikle desteklemektir.

İzinler

EVS

Erişim, ayrıcalıklı benzersiz tanımlayıcılarla (UID) sınırlıdır. Örneğin, AID_AUTOMOTIVE_EVS. Desteği sonlandırılan izinler arasında android.car.permission.USE_CAR_EVS_CAMERA yer alır.

Camera2

Camera2 için android.permission.CAMERA gerekir. Özel durumlar için:

Güvenlik açısından kritik öneme sahip kamera uygulamaları, Sürüş için Tasarım'da sağlanan Google'ın yerleşik ön izin politikalarına uymalıdır.

Birincil ve ikincil istemciler

Paylaşılan kamera erişimi için:

  • EVS, parametreleri değiştirme yetkisine sahip olan birincil istemciyi yönetmek için açık API'ler setPrimaryClient ve forcePrimaryClient sunuyordu.

  • Kamera, paylaşılan modda açıldığında (Android 16 ve sonraki sürümlerde) Camera2, kameraya erişen istemcinin önceliği birincil istemciyi belirler. En yüksek önceliğe sahip istemci (genellikle ön plandaki uygulama), yakalama isteği parametrelerini değiştirebilir. Birincil durumu zorlamak için doğrudan API'ler kullanılmaz. Birincil durum, çerçeve tarafından yönetilir.

Sistem kameraları

Bir kamera cihazının yalnızca sistem veya 1. taraf uygulamaları tarafından erişilmesini kısıtlamak için bu cihazın Kamera HAL'sinde ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA özelliğini bildirin. Müşterilerin bu kamera cihazına bağlanmanın yanı sıra android.permission.SYSTEM_CAMERA'a da sahip olması gerekir.android.permission.CAMERA

CarEVSManager ve CarEVSService

API erişimi için Java uygulamaları, CarEVSManager yerine standart android.hardware.camera2.CameraManager öğesini kullanmalıdır.

Arka görüş kamerası için CarEVSService içindeki GEAR_SELECTION VHAL özelliğini izleyen ve bir etkinlik başlatan mantık, OEM'e ait bir uygulamaya taşınmalıdır. Bu uygulama:

  • GEAR_SELECTION VHAL özelliğini izler.
  • Geri vitese geçildiğinde arka görüş kamerası etkinliğini başlatır.
  • Kamera feed'ini göstermek için Camera2 API'lerini kullanır.

Arka görünüm kamerasının tutarlı ve engelsiz bir şekilde gösterilmesi için, özellikle kullanıcı geçişleri sırasında veya diğer uygulamalar önizlemeyi kapatabileceğinde, Camera2 ile arka görünüm kamerası işlevini uygularken aşağıdaki yönergeleri uygulamanızı öneririz:

Ekran oluşturma

EVS ekranı ve otomotiv ekranı hizmeti.

Bu işlevlerin desteği sonlandırılmıştır.

Camera2

Surface, android.hardware.display.DisplayManager ve android.view.Display ile standart Android oluşturma yöntemlerini kullanın.

Kameranın erken gösterilmesinin gerektiği senaryolarda Camera2 ImageReader, donanım arabelleğine doğrudan erişim sağlayabilir. Böylece, oluşturma için mevcut DRM tabanlı ekran uygulamalarıyla entegre edebilirsiniz.

Bu erken kamera erişimine yalnızca AID_AUTOMOTIVE_EVS_UID sahibi ayrıcalıklı müşteriler izin verilir ve bu erişim, aracın dış kısmında bulunan sistem kameralarıyla sınırlıdır.

Emülatör HAL'si (EVS sahte HAL'si)

EVS Mock HAL'nin desteğini sonlandırmayı planlıyoruz. Bunun yerine, OEM'ler Camera2 emulated camera HAL'ı, hardware/google/camera/devices/EmulatedCamera/ kullanmalıdır. Bu HAL, aşağıdakileri destekleyecek şekilde geliştirilecektir:

  • Yapılandırılabilir kamera sayısı.
  • Renk çubuğu test desenleri.
  • Video dosyası emülasyonu.

Bu HAL'yi derlemeye dahil etmek için:

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

cameraserver uygulamasının Emulated Camera HAL hizmetiyle etkileşime girmesine izin vermek için uygun güvenlik açısından geliştirilmiş Linux (SELinux) politikaları da gereklidir.

V4L2 UVC Camera HAL

EVS V4L2 HAL'nin desteğini sonlandırmayı planlıyoruz. USB kameralar (UVC) için Camera2 harici kamera desteğini kullanın. Daha fazla bilgi için Harici USB Kameralar başlıklı makaleyi inceleyin.

Kameraya erken erişim

EVS kamerasına erişim, AID_AUTOMOTIVE_EVS UID'si olan ayrıcalıklı istemcilerle sınırlıydı. Android başlatma işlemi tamamlanmadan önce kamera erişimi için UID AID_AUTOMOTIVE_EVS olarak kalmalıdır. Ancak erken kamera erişimi, aracın dış kısmında bulunan sistem kameralarıyla sınırlıdır.

Ultrasonik API'ler

EVS Ultrasonics API'lerinin desteğini sonlandırmayı planlıyoruz. Bunun yerine, ultrasonik sensör algılamaları için Android 15'te kullanıma sunulan bu VHAL özelliklerini kullanın.

Özellik Tür Tanım
ULTRASONICS_SENSOR_POSITION Statik {<x>, <y>, <z>}

Sensörün AAOS sensör koordinat çerçevesine göre ilişkili eksen boyunca konumunu temsil eden her değer milimetre cinsindendir.

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

Bu, AAOS sensör koordinat çerçevesine göre sensörün hangi kuaterniyon dönüşüdür: $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW Statik {<horizontal>, <vertical>}

Sensörün yatay ve dikey görüş alanı (derece cinsinden).

ULTRASONICS_SENSOR_DETECTION_RANGE Statik {<minimum>, <maximum>}

Sensörün algılama aralığı (milimetre cinsinden).

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

Milimetre cinsinden, dahil olmak üzere, sensörün desteklenen algılama aralıkları dizisi.

ULTRASONICS_SENSOR_DETECTION_RANGES Sürekli {<distance>, <distance_error>}

Sensörün ölçtüğü mesafe ve mesafe hatası (milimetre cinsinden). Yalnızca bir aralık destekleniyorsa bu, algılanan aralıktaki minimum mesafedir.