Google, Siyah topluluklar için ırksal eşitliği ilerletmeye kararlıdır. Nasıl olduğunu gör.
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'larını 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üzü uygulamak için arabirimler sağlar.

Mimari

Aşağıdaki şekil ve listede HAL bileşenleri açıklanmaktadı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 Kamera 2 API'sını kullanan uygulamanın kodu bulunur. Dahili olarak, bu kod kamera ile etkileşen yerel koda erişmek için karşılık gelen Bağlayıcı arayüzlerini çağırır.
AIDL
CameraService ile ilişkili ciltleme arayüzü frameworks / av / camera / aidl / android / donanımında bulunabilir . Oluşturulan kod, fiziksel kameraya erişim elde etmek için alt düzey yerel kodu çağırır ve CameraDevice ve nihayetinde CameraCaptureSession nesnelerini çerçeve düzeyinde oluşturmak için kullanılan verileri döndürür.
yerel çerçeve
frameworks/av/ CameraDevice 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ü süreç 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 servisinin arayüzüdür; 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 içinde bulunan kamera servisi 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 bir şekilde çalışması için uygulamanız gereken standart arayüzü tanımlar.

HAL Uygulanması

HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında bulunur ve uygulamaların kamera donanımını doğru bir şekilde çalıştırabilmesi için uygulamanız gereken bir arabirim tanımlar. Camera HAL için HIDL arabirimleri donanım / arabirimler / kamerada tanımlanır.

Tipik bir bağlayıcı hale getirilmiş 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'yı 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ı desteklenmemektedir.

Eski HAL bileşenleri

Bu bölümde eski HAL bileşenlerinin mimarisi ve HAL'ın nasıl uygulanacağı açıklanmaktadır. Android 8.0 ve sonraki sürümlerde Camera HAL uygulamaları yukarıda açıklanan HIDL API'sini kullanmalıdır.

Mimarlık (eski)

Aşağıdaki şekil ve listede eski kamera HAL bileşenleri açıklanmaktadı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 vardır. Dahili olarak, bu kod kamera ile etkileşen yerel koda erişmek için karşılık gelen bir JNI tutkal sınıfını çağırır.
JNI'yı
İ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 içinde 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şmek için IPC bağlayıcı proxy'lerini çağırır.
bağlayıcı IPC vekil sunucuları
IPC bağlayıcı vekil sunucuları süreç sınırları üzerinden 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 arabirimi, ICamera , belirli bir açık kamera cihazının arabirimi ve ICameraClient , cihazın uygulama çerçevesine geri arabirimi.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp içinde bulunan kamera servisi 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 bir şekilde ç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ızla etkileşime girer. Kamera görüntüsünün ekranda ve video kaydında önizleme desteği sağlamak için kamera ve sürücünün YV12 ve NV21 görüntü formatlarını desteklemesi gerekir.

HAL (eski) uygulama

HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında bulunur ve uygulamaların kamera donanımını doğru bir şekilde çalıştırabilmesi için uygulamanız gereken bir arabirim tanımlar. HAL arabirimi 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 camera.h karşılık gelen kod 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 parametreleriyle ilgili belgeler için bkz. frameworks/av/include/camera/CameraParameters.h . Bu parametreler int (*set_parameters)(struct camera_device *, const char *parms) ile gösterilen fonksiyonla ayarlanır.

HAL uygulamasına bir örnek için, hardware/ti/omap4xxx/camera Galaxy Nexus HAL uygulamasına bakın.

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

HAL uygulamasını bir paylaşılan kitaplığa doğru şekilde paketlemek için Android derleme sistemini ayarlayın ve bir Android.mk dosyası oluşturarak uygun konuma kopyalayı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. Marka dosyasının aşağıdaki satırları içerdiğinden emin olun:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Kitaplığınıza camera.<device_name> adı verilmelidir camera.<device_name> ( .so otomatik olarak eklenir), böylece Android kitaplığı doğru şekilde yükleyebilir. Örneğin, hardware/ti/omap4xxx/Android.mk bulunan Galaxy Nexus fotoğraf makinesinin hardware/ti/omap4xxx/Android.mk .

  3. frameworks/native/data/etc dizinindeki gerekli özellik XML dosyalarını cihazınızın markasıyla kopyalayarak cihazınızın kamera özelliklerine sahip olduğunu belirtin. Örneğin, cihazınızın kamera flaşı olduğunu ve otomatik netleme yapabileceğini belirtmek için cihazınızın <device>/<company_name>/<device_name>/device.mk dosyasına aşağıdaki satırları ekleyin:
    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 \
    

    device/samsung/tuna/device.mk örneği için bkz. device/samsung/tuna/device.mk .

  4. Fotoğraf makinenizin medya kodek, biçim ve çözünürlük özelliklerini device/<company_name>/<device_name>/media_profiles.xml ve device/<company_name>/<device_name>/media_codecs.xml XML dosyalarında device/<company_name>/<device_name>/media_codecs.xml . Ayrıntılar için bkz. Codec bileşenlerini çerçeveye açma .
  5. media_profiles.xml ve media_codecs.xml dosyalarını uygun bir konuma kopyalamak için device/<company_name>/<device_name>/device.mk makefile dosyalarına 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 uygulamayı cihazınızın cihazındaki PRODUCT_PACKAGES değişkeninde belirtin device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...