Google 致力于为黑人社区推动种族平等。查看具体举措
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Kamera

Android Kamera HAL simgesi

Android'in kamera donanımı soyutlama katmanı (HAL), Kamera 2'deki üst düzey kamera çerçevesi API'lerini temel kamera sürücünüze ve donanımınıza bağlar. Kamera alt sistemi, kamera boru hattı bileşenleri için uygulamalar içerirken, kamera HAL, bu bileşenlerin sürümünün uygulanmasında kullanılmak üzere arayüzler sağlar.

Mimari

Aşağıdaki şekil ve liste HAL bileşenlerini açıklamaktadır.

Android kamera mimarisi

Şekil 1. Kamera mimarisi

uygulama çerçevesi
Uygulama çerçevesi düzeyinde, kamera donanımı ile etkileşim kurmak için Camera 2 API'sini kullanan uygulamanın kodu bulunur. Dahili olarak, bu kod kamera ile etkileşime giren yerel koda erişmek için karşılık gelen Binder arayüzlerini çağırır.
AIDL
CameraService ile ilişkili bağlayıcı arayüzü, frameworks / av / camera / aidl / android / hardware adresinde bulunabilir . Oluşturulan kod, fiziksel kameraya erişim sağlamak için daha düşük seviyeli yerel kodu çağırır ve CameraDevice ve nihayetinde çerçeve seviyesinde CameraCaptureSession nesnelerini oluşturmak için kullanılan verileri döndürür.
yerel çerçeve
frameworks/av/ bulunan bu frameworks/av/ , CameraDevice ve CameraCaptureSession sınıflarına yerel bir eşdeğer sağlar. Ayrıca bkz. NDK kamera2 referansı .
bağlayıcı IPC arayüzü
IPC bağlayıcı arayüzü, işlem sınırları üzerinden iletişimi kolaylaştırır. Kamera hizmetini çağıran frameworks/av/camera/camera/aidl/android/hardware dizininde bulunan birkaç kamera bağlayıcı sınıfı vardır. ICameraService , kamera hizmetinin arabirimidir; ICameraDeviceUser , belirli bir açık kamera cihazının arabirimidir; ve ICameraServiceListener ve ICameraDeviceCallbacks ilgili olan CameraService ve CameraDevice uygulama çerçevesi için geri çağırma.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp bulunan kamera hizmeti, HAL ile etkileşime giren gerçek koddur.
HAL
Donanım soyutlama katmanı, kamera servisinin çağırdığı ve kamera donanımınızın doğru çalışması için uygulamanız gereken standart arayüzü tanımlar.

HAL'nin Uygulanması

HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında oturur ve uygulamaların kamera donanımını doğru şekilde çalıştırabilmesi için uygulamanız gereken bir arayüz tanımlar. Kamera HAL için HIDL arayüzleri, donanım / arayüzler / kamerada tanımlanmıştır.

Tipik bir ciltlenmiş HAL, aşağıdaki HIDL arayüzlerini uygulamalıdır:

Referans HIDL uygulamaları için kullanılabilir CameraProvider.cpp , CameraDevice.cpp , ve CameraDeviceSession.cpp . Uygulama, hala eski API'yi kullanan eski HAL'leri sarar. Android 8.0'dan başlayarak, Kamera HAL uygulamaları HIDL API'sini kullanmalıdır; eski arayüzün kullanımı desteklenmez.

Eski HAL bileşenleri

Bu bölüm, eski HAL bileşenlerinin mimarisini ve HAL'nin nasıl uygulanacağını açıklamaktadır. Android 8.0 ve sonraki sürümlerdeki kamera HAL uygulamaları, yukarıda açıklanan bunun yerine HIDL API'yi kullanmalıdır.

Mimari (eski)

Aşağıdaki şekil ve liste eski kamera HAL bileşenlerini açıklamaktadır.

Android kamera mimarisi

Şekil 2. Eski kamera mimarisi

uygulama çerçevesi
Uygulama çerçevesi düzeyinde, kamera donanımı ile etkileşim kurmak için android.hardware.Camera API'sini kullanan uygulamanın kodu bulunur. Dahili olarak, bu kod, kamera ile etkileşime giren yerel koda erişmek için karşılık gelen bir JNI glue sınıfını çağırır.
JNI
İle ilişkili JNI'yı kodu android.hardware.Camera bulunan frameworks/base/core/jni/android_hardware_Camera.cpp . Bu kod, fiziksel kameraya erişim elde etmek için alt düzey yerel kodu çağırır ve çerçeve düzeyinde android.hardware.Camera nesnesini oluşturmak için kullanılan verileri döndürür.
yerel çerçeve
frameworks/av/camera/Camera.cpp çerçevelerinde tanımlanan yerel çerçeve, android.hardware.Camera sınıfına yerel bir eşdeğer sağlar. Bu sınıf, kamera hizmetine erişim elde etmek için IPC bağlayıcı vekillerini çağırır.
bağlayıcı IPC proxy'leri
IPC bağlayıcı vekilleri, süreç sınırları üzerinde iletişimi kolaylaştırır. Kamera hizmetini çağıran frameworks/av/camera dizininde bulunan üç kamera bağlayıcı sınıfı vardır. ICameraService , kamera hizmetinin arabirimidir, ICamera , belirli bir açık kamera aygıtının arabirimidir ve ICameraClient , aygıtın uygulama çerçevesine geri dönen arabirimidir.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp bulunan kamera hizmeti, HAL ile etkileşime giren gerçek koddur.
HAL
Donanım soyutlama katmanı, kamera servisinin çağırdığı ve kamera donanımınızın doğru çalışması için uygulamanız gereken standart arayüzü tanımlar.
çekirdek sürücüsü
Kameranın sürücüsü, gerçek kamera donanımı ve HAL uygulamanız ile etkileşime girer. Kamera ve sürücü, kamera görüntüsünün ekranda önizlenmesi ve video kaydı için destek sağlamak üzere YV12 ve NV21 görüntü formatlarını desteklemelidir.

HAL'nin (eski) uygulanması

HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında oturur ve uygulamaların kamera donanımını doğru şekilde çalıştırabilmesi için uygulamanız gereken bir arayüz tanımlar. HAL arayüzü, hardware/libhardware/include/hardware/camera.h ve hardware/libhardware/include/hardware/camera_common.h başlık dosyalarında tanımlanır.

camera_common.h tanımlar camera_module , standart bir yapı, (bir ön veya arka tarafa bakan kamera olup olmadığı, yani) her kamera için kamera İD ve özellikleri ortak olarak kamera ile ilgili genel bilgiler elde edilmiştir.

camera.h , android.hardware.Camera karşılık gelen kodu içerir. Bu başlık dosyası beyan camera_device sırayla bir içerdiğini yapı camera_device_ops HAL arabirimini uygulamak işlevlerine işaretçiler ile yapı. Geliştiricilerin ayarlayabileceği kamera parametreleri ile ilgili belgeler için, frameworks/av/include/camera/CameraParameters.h . Bu parametreler, int (*set_parameters)(struct camera_device *, const char *parms) ile gösterilen fonksiyonla ayarlanır.

Bir HAL uygulaması örneği için, hardware/ti/omap4xxx/camera içindeki Galaxy Nexus HAL uygulamasına bakın.

Paylaşılan kitaplığı yapılandırma

HAL uygulamasını doğru bir şekilde paylaşılan bir kitaplıkta paketlemek ve bir Android.mk dosyası oluşturarak uygun konuma kopyalamak için Android yapı sistemini ayarlayın:

  1. Kitaplığınızın kaynak dosyalarını içerecek bir device/<company_name>/<device_name>/camera dizini oluşturun.
  2. Paylaşılan kitaplığı oluşturmak için bir Android.mk dosyası oluşturun. Makefile'ın aşağıdaki satırları içerdiğinden emin olun:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Kitaplığınız camera.<device_name> olarak adlandırılmalıdır camera.<device_name> ( .so otomatik olarak eklenir), böylece Android kitaplığı doğru şekilde yükleyebilir. Bir örnek için, hardware/ti/omap4xxx/Android.mk içinde bulunan Galaxy Nexus kamera makefile bakın.

  3. Cihazınızın makefile ile frameworks/native/data/etc dizinindeki gerekli özellik XML dosyalarını kopyalayarak cihazınızın kamera özelliklerine sahip olduğunu belirtin. Örneğin, cihazınızın bir kamera flaşı olduğunu ve otomatik odaklama yapabildiğini belirtmek için, cihazınızın <device>/<company_name>/<device_name>/device.mk makefile:
    PRODUCT_COPY_FILES := \ ...
    
    PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    

    Bir cihaz makefile örneği için, bakınız device/samsung/tuna/device.mk .

  4. device/<company_name>/<device_name>/media_profiles.xml ve device/<company_name>/<device_name>/media_codecs.xml XML dosyalarında kameranızın ortam codec bileşenini, biçimini ve çözünürlük yeteneklerini device/<company_name>/<device_name>/media_codecs.xml . Ayrıntılar için bkz. Kodekleri çerçeveye açığa çıkarma .
  5. media_profiles.xml ve media_codecs.xml dosyalarını uygun konuma kopyalamak için cihazınızın device/<company_name>/<device_name>/device.mk makefile 'a aşağıdaki satırları ekleyin:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. Kamera uygulamasını cihazınızın sistem görüntüsüne dahil etmek için, bunu cihazınızın device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...
    
    'deki PRODUCT_PACKAGES değişkeninde belirtin