Produsen perangkat dapat mengekspos ekstensi seperti bokeh, mode malam, dan HDR kepada developer pihak ketiga melalui antarmuka Ekstensi Kamera yang disediakan oleh library vendor OEM. Developer dapat menggunakan Camera2 Extensions API dan CameraX Extensions API untuk mengakses ekstensi yang diterapkan di library vendor OEM.
Untuk daftar ekstensi yang didukung, yang sama di Camera2 dan CameraX, lihat CameraX Extensions API. Jika Anda ingin menambahkan ekstensi, laporkan bug dengan Issue Tracker.
Halaman ini menjelaskan cara menerapkan dan mengaktifkan library vendor OEM di perangkat.
Arsitektur
Diagram berikut menjelaskan arsitektur antarmuka Ekstensi Kamera atau extensions-interface
:
Gambar 1. Diagram arsitektur Ekstensi Kamera
Seperti yang ditunjukkan dalam diagram, untuk mendukung Ekstensi Kamera, Anda perlu menerapkan extensions-interface
yang disediakan oleh library vendor OEM. Library vendor OEM Anda mengaktifkan dua API:
CameraX Extensions API dan
Camera2 Extensions API,
yang masing-masing digunakan oleh aplikasi CameraX dan Camera2 untuk mengakses
ekstensi vendor.
Menerapkan library vendor OEM
Untuk menerapkan library vendor OEM, salin file
camera-extensions-stub
ke dalam project library sistem. File ini menentukan antarmuka Ekstensi Kamera.
File camera-extensions-stub
dibagi menjadi kategori berikut:
File antarmuka penting (jangan dimodifikasi)
PreviewExtenderImpl.java
ImageCaptureExtenderImpl.java
ExtenderStateListener.java
ProcessorImpl.java
PreviewImageProcessorImpl.java
CaptureProcessorImpl.java
CaptureStageImpl.java
RequestUpdateProcessorImpl.java
ProcessResultImpl.java
advanced/AdvancedExtenderImpl.java
advanced/Camera2OutputConfigImpl.java
advanced/Camera2SessionConfigImpl.java
advanced/ImageProcessorImpl.java
advanced/ImageReaderOutputConfigImpl.java
advanced/ImageReferenceImpl.java
advanced/MultiResolutionImageReaderOutputConfigImpl.java
advanced/OutputSurfaceImpl.java
advanced/RequestProcessorImpl.java
advanced/SessionProcessorImpl.java
advanced/SurfaceOutputConfigImpl.java
Penerapan wajib (tambahkan penerapan Anda)
ExtensionVersionImpl.java
InitializerImpl.java
Class ekstensi bokeh (terapkan jika ekstensi Bokeh didukung)
BokehImageCaptureExtenderImpl.java
BokehPreviewExtenderImpl.java
advanced/BokehAdvancedExtenderImpl.java
Kelas perpanjangan malam (terapkan jika Perpanjangan malam didukung)
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
advanced/NightAdvancedExtenderImpl.java
Class perpanjangan otomatis (terapkan jika Ekstensi otomatis didukung)
AutoImageCaptureExtenderImpl.java
AutoPreviewExtenderImpl.java
advanced/AutoAdvancedExtenderImpl.java
Kelas pengubah HDR (terapkan jika ekstensi HDR didukung)
HdrImageCaptureExtenderImpl.java
HdrPreviewExtenderImpl.java
advanced/HdrAdvancedExtenderImpl.java
Class ekstender Retouch Wajah (terapkan jika ekstensi Retouch Wajah didukung)
BeautyImageCaptureExtenderImpl.java
BeautyPreviewExtenderImpl.java
advanced/BeautyAdvancedExtenderImpl.java
Utilitas (opsional, dapat dihapus)
advanced/Camera2OutputConfigImplBuilder.java
advanced/Camera2SessionConfigImplBuilder.java
Anda tidak diwajibkan untuk menyediakan implementasi untuk setiap ekstensi. Jika Anda tidak menerapkan ekstensi, tetapkan isExtensionAvailable()
untuk menampilkan false
atau hapus class Extender yang sesuai. API Camera2 dan CameraX Extensions melaporkan kepada aplikasi bahwa ekstensi tidak tersedia.
Mari kita bahas cara Camera2 dan CameraX Extensions API berinteraksi dengan library vendor untuk mengaktifkan ekstensi. Diagram berikut mengilustrasikan alur end-to-end menggunakan ekstensi Malam sebagai contoh:
Gambar 2. Penerapan ekstensi malam
Verifikasi versi:
Panggilan Camera2/X
ExtensionVersionImpl.checkApiVersion()
untuk memastikan bahwa versiextensions-interface
yang diterapkan OEM kompatibel dengan versi yang didukung Camera2/X.Inisialisasi library vendor:
InitializerImpl
memiliki metodeinit()
yang menginisialisasi library vendor. Camera2/X menyelesaikan inisialisasi sebelum mengakses class Extender.Buat instance class Extender:
Membuat instance class Extender untuk ekstensi. Ada dua jenis Extender: Extender Dasar dan Extender Lanjutan. Anda harus menerapkan satu jenis Extender untuk semua Ekstensi. Untuk mengetahui informasi selengkapnya, lihat Extender Dasar versus Extender Lanjutan.
Camera2/X membuat instance dan berinteraksi dengan class Extender untuk mengambil informasi dan mengaktifkan ekstensi. Untuk ekstensi tertentu, Camera2/X dapat membuat instance class Extender beberapa kali. Akibatnya, jangan lakukan inisialisasi berat di konstruktor atau panggilan
init()
. Lakukan tugas berat hanya saat sesi kamera akan dimulai, seperti saatonInit()
dipanggil di Basic Extender atauinitSession()
dipanggil di Advanced Extender.Untuk ekstensi Malam, class Extender berikut di-instantiate untuk jenis Extender Dasar:
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
Untuk jenis Advanced Extender:
NightAdvancedExtenderImpl.java
Periksa ketersediaan ekstensi:
Sebelum mengaktifkan ekstensi,
isExtensionAvailable()
memeriksa apakah ekstensi tersedia di ID kamera yang ditentukan melalui instance Extender.Lakukan inisialisasi Extender dengan informasi kamera:
Camera2/X memanggil
init()
pada instance Extender dan meneruskan ID kamera danCameraCharacteristics
.Informasi kueri:
Memanggil class Extender untuk mengambil informasi seperti resolusi yang didukung, perkiraan latensi pengambilan gambar diam, dan kunci permintaan pengambilan gambar dari Extender sebagai persiapan untuk mengaktifkan ekstensi.
Aktifkan ekstensi di Extender:
Class Extender menyediakan semua antarmuka yang diperlukan untuk mengaktifkan class. API ini menawarkan mekanisme untuk mengaitkan implementasi OEM ke pipeline Camera2 seperti menyuntikkan parameter permintaan pengambilan atau mengaktifkan post processor.
Untuk jenis Extender Lanjutan, Camera2/X berinteraksi dengan
SessionProcessorImpl
untuk mengaktifkan ekstensi. Camera2/X mengambil instanceSessionProcessorImpl
dengan memanggilcreateSessionProcessor()
di Extender.
Bagian berikut menjelaskan alur ekstensi secara lebih mendetail.
Verifikasi versi
Saat memuat library vendor OEM dari perangkat saat runtime, Camera2/X memverifikasi apakah library kompatibel dengan versi extensions-interface
.
extensions-interface
menggunakan pembuatan versi semantik, atau MAJOR.MINOR.PATCH, misalnya, 1.1.0 atau 1.2.0. Namun, hanya
versi utama dan minor yang digunakan selama verifikasi versi.
Untuk memverifikasi versi, Camera2/X memanggil
ExtensionVersionImpl.checkApiVersion()
dengan versi
extensions-interface
yang didukung. Camera2/X kemudian menggunakan versi yang dilaporkan oleh
library OEM untuk menentukan apakah ekstensi dapat diaktifkan dan kemampuan apa yang
harus dipanggilnya.
Kompatibilitas versi utama
Jika versi utama extension-interface berbeda antara Camera2/X dan library vendor, maka dianggap tidak kompatibel dan ekstensi dinonaktifkan.
Kompatibilitas mundur
Selama versi utamanya identik, Camera2/X memastikan kompatibilitas mundur dengan library vendor OEM yang di-build dengan versi extensions-interface
sebelumnya. Misalnya, jika Camera2/X mendukung
extensions-interface
1.3.0, library vendor OEM yang menerapkan 1.0.0,
1.1.0, dan 1.2.0 tetap kompatibel. Hal ini juga berarti bahwa setelah Anda menerapkan
versi tertentu dari library vendor, Camera2/X memastikan library
kompatibel mundur dengan versi extension-interface
mendatang.
Kompatibilitas dengan versi baru
Kompatibilitas maju dengan library vendor extensions-interface
yang lebih baru bergantung pada Anda, OEM. Jika Anda memerlukan beberapa fitur untuk menerapkan ekstensi, sebaiknya aktifkan ekstensi mulai dari versi tertentu. Dalam
kasus ini, Anda dapat menampilkan versi extensions-interface
yang didukung saat
versi library Camera2/X memenuhi persyaratan. Jika versi Camera2/X tidak didukung, Anda dapat menampilkan versi yang tidak kompatibel seperti 99.0.0 untuk menonaktifkan ekstensi.
Inisialisasi library vendor
Setelah memverifikasi versi extensions-interface
yang diterapkan oleh library OEM, Camera2/X akan memulai proses inisialisasi. Metode
InitializerImpl.init()
memberi sinyal ke library OEM bahwa aplikasi sedang mencoba
menggunakan ekstensi.
Camera2/X tidak melakukan panggilan lain ke library OEM (selain pemeriksaan versi)
hingga library vendor OEM memanggil OnExtensionsInitializedCallback.onSuccess()
untuk memberi tahu penyelesaian inisialisasi.
Anda harus menerapkan
InitializerImpl
mulai dari extensions-interface
1.1.0. Camera2/X melewati langkah inisialisasi library jika library vendor OEM menerapkan extensions-interface
1.0.0.
Ekstensi Dasar versus Ekstensi Lanjutan
Ada dua jenis penerapan extensions-interface
: Extender Dasar dan Extender Lanjutan. Advanced Extender telah didukung sejak
extensions-interface
1.2.0.
Terapkan Basic Extender untuk ekstensi yang memproses gambar di HAL kamera atau menggunakan post-prosesor yang dapat memproses aliran YUV.
Terapkan Advanced Extender untuk ekstensi yang perlu menyesuaikan konfigurasi streaming Camera2 dan mengirim permintaan pengambilan sesuai kebutuhan.
Lihat tabel berikut untuk perbandingan:
Ekstensi Dasar | Advanced Extender | |
---|---|---|
Konfigurasi streaming | Tetap Pratinjau: PRIVATE atau YUV_420_888 (jika ada prosesor) Pengambilan gambar diam: JPEG atau YUV_420_888 (jika ada prosesor)
|
Dapat disesuaikan oleh OEM. |
Mengirim permintaan pengambilan gambar | Hanya Camera2/X yang dapat mengirim permintaan pengambilan. Anda dapat menetapkan parameter untuk permintaan ini. Saat prosesor disediakan untuk pengambilan gambar, Camera2/X dapat mengirim beberapa permintaan pengambilan dan mengirim semua gambar dan hasil pengambilan ke prosesor. | Instance RequestProcessorImpl diberikan kepada Anda untuk
menjalankan permintaan pengambilan camera2 dan mendapatkan hasil serta Gambar.
Camera2/X memanggil |
Hook di pipeline kamera |
|
|
Cocok untuk | Ekstensi yang diterapkan di HAL kamera atau di prosesor yang memproses gambar YUV. |
|
Versi API yang didukung | Ekstensi Camera2: Android 13 atau yang lebih tinggi Ekstensi CameraX: camera-extensions 1.1.0 atau yang lebih tinggi |
Ekstensi Camera2: Android 12L atau yang lebih tinggi Ekstensi CameraX: camera-extensions 1.2.0-alpha03 atau yang lebih tinggi |
Alur aplikasi
Tabel berikut menunjukkan tiga jenis alur aplikasi dan panggilan Camera Extensions API yang sesuai. Meskipun Camera2/X menyediakan API ini, Anda harus menerapkan library vendor dengan benar untuk mendukung alur ini, yang akan kami jelaskan lebih mendetail di bagian selanjutnya.
Ekstensi Camera2 | Ekstensi CameraX | |
---|---|---|
Kueri ketersediaan ekstensi | CameraExtensionCharacteristics
.getSupportedExtensions
|
ExtensionsManager.
isExtensionAvailable
|
Informasi kueri | CameraExtensionCharacteristics.
getExtensionSupportedSizes
CameraExtensionCharacteristics.
getEstimatedCaptureLatencyRangeMillis
CameraExtensionCharacteristics.
getAvailableCaptureRequestKeys
CameraExtensionCharacteristics.
getAvailableCaptureResultKeys
|
ExtensionsManager.
getEstimatedCaptureLatencyRange
CameraX menangani informasi lainnya dalam library. |
Melihat pratinjau dan mengambil foto dengan ekstensi diaktifkan | CameraDevice.
createExtensionSession
|
val cameraSelector = ExtensionsManager.
getExtensionEnabledCameraSelector
|
Ekstensi Dasar
Antarmuka Basic Extender menyediakan hook ke beberapa tempat di pipeline kamera. Setiap jenis ekstensi memiliki class Extender yang sesuai yang perlu diterapkan oleh OEM.
Tabel berikut mencantumkan class Extender yang perlu diterapkan OEM untuk setiap ekstensi:
Class extender yang akan diterapkan | |
---|---|
Malam | NightPreviewExtenderImpl.java
|
HDR | HdrPreviewExtenderImpl.java
|
Otomatis | AutoPreviewExtenderImpl.java
|
Bokeh | BokehPreviewExtenderImpl.java
|
Retouch wajah | BeautyPreviewExtenderImpl.java
|
Kami menggunakan PreviewExtenderImpl
dan ImageCaptureExtenderImpl
sebagai placeholder
dalam contoh berikut. Ganti ini dengan nama file sebenarnya yang Anda terapkan.
Basic Extender memiliki kemampuan berikut:
- Sertakan parameter sesi saat mengonfigurasi
CameraCaptureSession
(onPresetSession
). - Memberi tahu Anda tentang peristiwa mulai dan penutupan sesi pengambilan dan mengirim satu
permintaan untuk memberi tahu HAL dengan parameter yang ditampilkan (
onEnableSession
,onDisableSession
). - Suntikkan parameter pengambilan untuk permintaan
(
PreviewExtenderImpl.getCaptureStage
,ImageCaptureExtenderImpl.getCaptureStages
). - Tambahkan pemroses untuk pratinjau dan pengambilan gambar diam yang dapat memproses aliran
YUV_420_888
.
Mari kita lihat cara Camera2/X memanggil extensions-interface
untuk mencapai tiga alur aplikasi yang disebutkan di atas.
Alur aplikasi 1: Memeriksa ketersediaan ekstensi
Gambar 3. Alur aplikasi 1 di Basic Extender
Dalam alur ini, Camera2/X memanggil metode isExtensionAvailable()
secara langsung dari
PreviewExtenderImpl
dan ImageCaptureExtenderImpl
tanpa memanggil
init()
. Kedua class Extender harus menampilkan true
untuk mengaktifkan ekstensi.
Ini sering kali menjadi langkah pertama bagi aplikasi untuk memeriksa apakah jenis ekstensi tertentu didukung untuk ID kamera tertentu sebelum mengaktifkan ekstensi. Hal ini karena beberapa ekstensi hanya didukung di ID kamera tertentu.
Alur aplikasi 2: Informasi kueri
Gambar 4. Alur aplikasi 2 di Basic Extender
Setelah menentukan apakah ekstensi tersedia, aplikasi harus mengkueri informasi berikut sebelum mengaktifkan ekstensi.
Rentang latensi pengambilan gambar diam:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
menampilkan rentang latensi pengambilan gambar untuk aplikasi guna mengevaluasi apakah sesuai untuk mengaktifkan ekstensi untuk skenario saat ini.Ukuran yang didukung untuk pratinjau dan pengambilan gambar:
ImageCaptureExtenderImpl.getSupportedResolutions
danPreviewExtenderImpl.getSupportedResolutions
menampilkan daftar format gambar dan ukuran yang didukung untuk format dan ukuran permukaan.Kunci permintaan dan hasil yang didukung: Camera2/X memanggil metode berikut untuk mengambil kunci permintaan pengambilan dan kunci hasil yang didukung dari penerapan Anda:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
Camera2/X selalu memanggil init()
terlebih dahulu pada class Extender ini sebelum meminta informasi lebih lanjut.
Alur aplikasi 3: Pratinjau/pengambilan gambar diam dengan ekstensi diaktifkan (penerapan HAL)
Gambar 5. Alur aplikasi 3 di Extender Dasar
Diagram di atas mengilustrasikan alur utama untuk mengaktifkan pratinjau dan pengambilan gambar diam dengan ekstensi tanpa prosesor. Artinya, HAL kamera memproses ekstensi.
Dalam alur ini, Camera2/X pertama-tama memanggil init()
, lalu onInit
, yang memberi tahu Anda bahwa sesi kamera akan dimulai dengan ekstensi yang ditentukan.
Anda dapat melakukan inisialisasi berat di onInit()
.
Saat mengonfigurasi CameraCaptureSession
, Camera2/X memanggil
onPresetSession
untuk mendapatkan parameter sesi. Setelah sesi pengambilan gambar dikonfigurasi dengan berhasil, Camera2/X akan memanggil onEnableSession
yang menampilkan instance CaptureStageImpl
yang berisi parameter pengambilan gambar. Camera2/X
segera mengirimkan satu permintaan dengan parameter pengambilan ini untuk memberi tahu
HAL. Demikian pula, sebelum sesi pengambilan ditutup, Camera2/X memanggil
onDisableSession
lalu mengirimkan satu permintaan dengan parameter pengambilan
yang ditampilkan.
Permintaan berulang yang dipicu oleh Camera2/X berisi parameter permintaan
yang ditampilkan oleh PreviewExtenderImpl.getCaptureStage()
. Selain itu, permintaan pengambilan gambar
masih berisi parameter yang ditampilkan oleh
ImageCaptureExtenderImpl.getCaptureStages()
.
Terakhir, Camera2/X memanggil onDeInit()
setelah sesi kamera selesai.
Anda dapat melepaskan fasilitas di onDeinit()
.
Prosesor pratinjau
Selain HAL kamera, Anda juga dapat menerapkan ekstensi di prosesor.
Terapkan PreviewExtenderImpl.getProcessorType
untuk menentukan jenis prosesor
seperti yang dijelaskan di bawah:
PROCESSOR_TYPE_NONE
: Tidak ada pemroses. Gambar diproses di HAL kamera.PROCESSOR_TYPE_REQUEST_UPDATE_ONLY
: Jenis pemroses memungkinkan Anda memperbarui permintaan berulang dengan parameter permintaan pengambilan baru berdasarkanTotalCaptureResult
terbaru.PreviewExtenderImpl.getProcessor
harus menampilkan instanceRequestUpdateProcessorImpl
yang memproses instanceTotalCaptureResult
dan menampilkan instanceCaptureStageImpl
untuk memperbarui permintaan berulang.PreviewExtenderImpl.getCaptureStage()
juga harus mencerminkan hasil pemrosesan dan menampilkanCaptureStageImpl
terbaru.PROCESSOR_TYPE_IMAGE_PROCESSOR
: Jenis ini memungkinkan Anda menerapkan pemroses untuk memproses gambarYUV_420_888
dan menulis output ke permukaanPRIVATE
.Anda perlu mengimplementasikan dan menampilkan instance
PreviewImageProcessorImpl
diPreviewExtenderImpl.getProcessor
. Prosesor bertanggung jawab untuk memproses gambar inputYUV_420_888
. Output harus ditulis ke format pratinjauPRIVATE
. Camera2/X menggunakan platformYUV_420_888
, bukanPRIVATE
, untuk mengonfigurasiCameraCaptureSession
untuk pratinjau.Lihat ilustrasi berikut untuk alurnya:
Gambar 6. Alur pratinjau dengan PreviewImageProcessorImpl
Antarmuka PreviewImageProcessorImpl
memperluas ProcessImpl
dan memiliki
tiga metode penting:
onOutputSurface(Surface surface, int imageFormat)
menetapkan permukaan output untuk prosesor. UntukPreviewImageProcessorImpl
,imageFormat
adalah format piksel sepertiPixelFormat.RGBA_8888
.onResolutionUpdate(Size size)
menetapkan ukuran gambar input.onImageFormatUpdate(int imageFormat)
menetapkan format gambar dari gambar input. Saat ini, hanya dapat berupaYUV_420_888
.
Prosesor pengambilan gambar
Untuk pengambilan gambar diam, Anda dapat menerapkan pemroses dengan menampilkan instance
CaptureProcessorImpl
menggunakan ImageCaptureExtenderImpl.getCaptureProcessor
. Prosesor bertanggung jawab untuk memproses daftar gambar YUV_420_888
yang diambil dan instance TotalCaptureResult
serta menulis output ke platform YUV_420_888
.
Anda dapat dengan aman mengasumsikan bahwa pratinjau diaktifkan dan berjalan sebelum mengirimkan permintaan pengambilan gambar diam.
Lihat alur dalam diagram di bawah:
Gambar 7. Alur pengambilan gambar tetap dengan CaptureProcessorImpl
Camera2/X menggunakan permukaan format
YUV_420_888
untuk pengambilan gambar diam guna mengonfigurasi sesi pengambilan gambar. Camera2/X menyiapkanCaptureProcessorImpl
dengan memanggil:CaptureProcessorImpl.onImageFormatUpdate()
denganYUV_420_888
.CaptureProcessorImpl.onResolutionUpdate()
dengan ukuran gambar input.CaptureProcessorImpl.onOutputSurface()
dengan outputYUV_420_888
platform.
ImageCaptureExtenderImpl.getCaptureStages
menampilkan daftarCaptureStageImpl
, dengan setiap elemen dipetakan ke instanceCaptureRequest
dengan parameter pengambilan yang dikirim oleh Camera2/X. Misalnya, jika menampilkan daftar tiga instanceCaptureStageImpl
, Camera2/X akan mengirim tiga permintaan pengambilan dengan parameter pengambilan yang sesuai menggunakan APIcaptureBurst
.Gambar yang diterima dan instance
TotalCaptureResult
digabungkan dan dikirim keCaptureProcessorImpl
untuk diproses.CaptureProcessorImpl
menulis Gambar hasil (formatYUV_420_888
) ke permukaan output yang ditentukan oleh panggilanonOutputSurface()
. Camera2/X mengonversinya menjadi gambar JPEG jika perlu.
Mendukung kunci dan hasil permintaan pengambilan gambar
Selain pratinjau dan pengambilan gambar, aplikasi dapat menyetel zoom, parameter flash, atau memicu ketuk untuk memfokuskan. Parameter ini mungkin tidak kompatibel dengan penerapan ekstensi Anda.
Metode berikut telah ditambahkan ke extensions-interface
1.3.0 untuk memungkinkan
Anda mengekspos parameter yang didukung implementasi Anda:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()
menampilkan kunci permintaan pengambilan yang didukung oleh implementasi Anda.ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()
menampilkan kunci hasil pengambilan yang ada dalam hasil pengambilan.
Jika HAL kamera memproses ekstensi, Camera2/X akan mengambil hasil pengambilan dalam CameraCaptureSession.CaptureCallback
. Namun, jika
prosesor diimplementasikan, Camera2/X akan mengambil hasil pengambilan dalam
ProcessResultImpl
, yang diteruskan ke metode process()
dalam
PreviewImageProcessorImpl
dan
CaptureProcessorImpl
.
Anda bertanggung jawab untuk melaporkan hasil pengambilan melalui ProcessResultImpl
ke Camera2/X.
Lihat definisi antarmuka CaptureProcessorImpl
di bawah sebagai contoh.
Di extensions-interface
1.3.0 atau yang lebih tinggi, panggilan process()
kedua dipanggil:
Interface CaptureProcessorImpl extends ProcessorImpl {
// invoked when extensions-interface version < 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
// invoked when extensions-interface version >= 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
ProcessResultImpl resultCallback, Executor executor);
}
Untuk operasi kamera umum seperti zoom, ketuk untuk fokus, flash, dan kompensasi eksposur, sebaiknya dukung tombol berikut untuk permintaan pengambilan gambar dan hasil pengambilan gambar:
- Zoom:
CaptureRequest#CONTROL_ZOOM_RATIO
CaptureRequest#SCALER_CROP_REGION
- Ketuk untuk memfokuskan:
CaptureRequest#CONTROL_AF_MODE
CaptureRequest#CONTROL_AF_TRIGGER
CaptureRequest#CONTROL_AF_REGIONS
CaptureRequest#CONTROL_AE_REGIONS
CaptureRequest#CONTROL_AWB_REGIONS
- Flash:
CaptureRequest#CONTROL_AE_MODE
CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
CaptureRequest#FLASH_MODE
- Kompensasi eksposur:
CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
Untuk Basic Extender yang menerapkan versi 1.2.0 atau yang lebih lama, CameraX Extensions API secara eksplisit mendukung semua kunci di atas. Untuk
extensions-interface
1.3.0, CameraX dan Camera2 mematuhi daftar yang ditampilkan
dan hanya mendukung kunci yang ada di dalamnya. Misalnya, jika Anda memutuskan untuk menampilkan
CaptureRequest#CONTROL_ZOOM_RATIO
dan
CaptureRequest#SCALER_CROP_REGION
saja dalam penerapan 1.3.0, maka
hanya zoom yang didukung untuk aplikasi, sementara fitur ketuk untuk memfokuskan, flash, dan kompensasi eksposur tidak diizinkan.
Advanced Extender
Advanced Extender adalah jenis implementasi vendor berdasarkan Camera2 API.
Jenis Extender ini ditambahkan di extensions-interface
1.2.0. Bergantung pada produsen perangkat, ekstensi dapat diterapkan di lapisan aplikasi, yang bergantung pada faktor-faktor berikut:
Konfigurasi streaming kustom: Konfigurasi streaming kustom seperti streaming RAW atau memiliki beberapa streaming untuk ID kamera fisik yang berbeda.
Kemampuan untuk mengirim permintaan Camera2: Mendukung logika interaksi rumit yang dapat mengirim permintaan pengambilan dengan parameter berdasarkan hasil permintaan sebelumnya.
Advanced Extender menyediakan wrapper, atau lapisan perantara, sehingga Anda dapat menyesuaikan konfigurasi streaming dan mengirim permintaan pengambilan sesuai kebutuhan.
File yang akan diterapkan
Untuk beralih ke penerapan Advanced Extender, metode
isAdvancedExtenderImplemented()
di
ExtensionVersionImpl
harus menampilkan true
. Untuk setiap jenis ekstensi, OEM harus menerapkan
class Extender yang sesuai. File implementasi Advanced Extender ada dalam paket advanced.
Class extender yang akan diterapkan | |
---|---|
Malam | advanced/NightAdvancedExtenderImpl.java
|
HDR | advanced/HdrAdvancedExtenderImpl.java
|
Otomatis | advanced/AutoAdvancedExtenderImpl.java
|
Bokeh | advanced/BokehAdvancedExtenderImpl.java
|
Sentuhan Wajah | advanced/BeautyAdvancedExtenderImpl.java
|
Kami menggunakan AdvancedExtenderImpl
sebagai placeholder dalam contoh berikut.
Ganti dengan nama file Extender untuk ekstensi yang Anda terapkan.
Mari kita lihat cara Camera2/X memanggil extensions-interface
untuk mencapai tiga alur aplikasi.
Alur aplikasi 1: Memeriksa ketersediaan ekstensi
Gambar 8. Alur aplikasi 1 di Advanced Extender
Pertama, aplikasi memeriksa apakah ekstensi yang diberikan didukung.
Alur aplikasi 2: Informasi kueri
Gambar 9. Alur aplikasi 2 di Advanced Extender
Setelah memanggil AdvancedExtenderImpl.init()
, aplikasi dapat membuat kueri
berikut informasi tentang AdvancedExtenderImpl
:
Perkiraan latensi pengambilan gambar diam:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()
menampilkan rentang latensi pengambilan gambar agar aplikasi dapat mengevaluasi apakah sesuai untuk mengaktifkan ekstensi untuk skenario saat ini.Resolusi yang didukung untuk pratinjau dan pengambilan gambar diam:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()
menampilkan peta format gambar ke daftar ukuran yang didukung untuk format dan ukuran platform pratinjau. OEM harus mendukung setidaknya formatPRIVATE
.AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()
menampilkan format dan ukuran yang didukung untuk platform pengambilan gambar diam. OEM harus mendukung output formatJPEG
danYUV_420_888
.AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
menampilkan ukuran yang didukung untuk aliranYUV_420_888
tambahan untuk analisis gambar. Jika permukaan YUV analisis gambar tidak didukung,getSupportedYuvAnalysisResolutions()
harus menampilkannull
atau daftar kosong.
Kunci/hasil permintaan pengambilan gambar yang tersedia (ditambahkan di
extensions-interface
1.3.0): Camera2/X memanggil metode berikut untuk mengambil kunci permintaan pengambilan gambar dan kunci hasil yang didukung dari implementasi Anda:AdvancedExtenderImpl.getAvailableCaptureRequestKeys
AdvancedExtenderImpl.getAvailableCaptureResultKeys
Untuk mengetahui informasi selengkapnya, lihat Mendukung kunci dan hasil permintaan pengambilan.
Alur aplikasi 3: Pratinjau/pengambilan gambar diam dengan ekstensi diaktifkan
Gambar 10. Alur aplikasi 3 di Advanced Extender
Diagram di atas menunjukkan alur utama untuk memulai pratinjau dan pengambilan gambar diam untuk jenis Penguat Lanjutan. Mari kita bahas setiap langkahnya.
Instance
SessionProcessorImpl
Implementasi Advanced Extender inti ada di
SessionProcessorImpl
, yang bertanggung jawab untuk menyediakan konfigurasi sesi yang disesuaikan dan mengirim permintaan pengambilan untuk memulai pratinjau dan tetap mengambil permintaan.AdvancedExtenderImpl.createSessionProcessor()
dipanggil untuk menampilkan instanceSessionProcessorImpl
.initSession
SessionProcessorImpl.initSession()
menginisialisasi sesi untuk ekstensi. Di sinilah Anda mengalokasikan resource dan menampilkan konfigurasi sesi untuk menyiapkanCameraCaptureSession
.Untuk parameter input, Camera2/X menentukan konfigurasi platform output untuk pratinjau, pengambilan gambar diam, dan analisis gambar YUV opsional. Konfigurasi output permukaan (
OutputSurfaceImpl
) ini berisi permukaan, ukuran, dan format gambar yang diambil dengan mengikuti metode diAdvancedExtenderImpl
:getSupportedPreviewOutputResolutions()
getSupportedCaptureOutputResolutions()
getSupportedYuvAnalysisResolutions()
Anda harus menampilkan instance
Camera2SessionConfigImpl
, yang terdiri dari daftar instanceCamera2OutputConfigImpl
dan parameter sesi yang digunakan untuk mengonfigurasiCameraCaptureSession
. Anda bertanggung jawab untuk menampilkan gambar kamera yang benar ke platform output yang diteruskan oleh Camera2/X. Berikut beberapa opsi untuk mengaktifkan output:- Pemrosesan di HAL kamera: Anda dapat langsung menambahkan output surface
ke
CameraCaptureSession
dengan penerapanSurfaceOutputConfigImpl
. Hal ini mengonfigurasi output surface yang disediakan ke pipeline kamera dan memungkinkan HAL kamera memproses gambar. Memproses platform
ImageReader
perantara (RAW, YUV, dll.): Tambahkan platformImageReader
perantara keCameraCaptureSession
dengan instanceImageReaderOutputConfigImpl
.Anda perlu memproses gambar perantara dan menulis gambar hasil ke platform output.
- Menggunakan berbagi permukaan Camera2: Gunakan berbagi permukaan dengan permukaan lain
dengan menambahkan instance
Camera2OutputConfigImpl
ke metodegetSurfaceSharingOutputConfigs()
dari instanceCamera2OutputConfigImpl
lainnya. Format dan ukuran permukaan harus sama.
Semua
Camera2OutputConfigImpl
termasukSurfaceOutputConfigImpl
danImageReaderOutputConfigImpl
harus memiliki ID unik (getId()
), yang digunakan untuk menentukan platform target dan mengambil gambar dariImageReaderOutputConfigImpl
.onCaptureSessionStart
danRequestProcessorImpl
Saat
CameraCaptureSession
dimulai dan framework Kamera memanggilonConfigured()
, Camera2/X akan memanggilSessionProcessorImpl.onCaptureSessionStart()
dengan wrapper permintaan Camera2RequestProcessImpl
. Camera2/X mengimplementasikanRequestProcessImpl
, yang memungkinkan Anda mengeksekusi permintaan pengambilan gambar, dan mengambil gambar jikaImageReaderOutputConfigImpl
digunakan.API
RequestProcessImpl
mirip dengan APICameraCaptureSession
Camera2 dalam hal menjalankan permintaan. Perbedaannya adalah:- Target platform ditentukan oleh ID instance
Camera2OutputConfigImpl
. - Kemampuan untuk mengambil gambar
ImageReader
.
Anda dapat memanggil
RequestProcessorImpl.setImageProcessor()
dengan IDCamera2OutputConfigImpl
yang ditentukan untuk mendaftarkan instanceImageProcessorImpl
agar menerima gambar.Instance
RequestProcessImpl
menjadi tidak valid setelah Camera2/X memanggilSessionProcessorImpl.onCaptureSessionEnd()
.- Target platform ditentukan oleh ID instance
Mulai pratinjau dan ambil foto
Dalam penerapan Advanced Extender, Anda dapat mengirim permintaan pengambilan gambar melalui antarmuka
RequestProcessorImpl
. Camera2/X memberi tahu Anda untuk memulai permintaan berulang untuk pratinjau atau urutan pengambilan gambar diam dengan memanggilSessionProcessorImpl#startRepeating
danSessionProcessorImpl#startCapture
masing-masing. Anda harus mengirim permintaan pengambilan gambar untuk memenuhi permintaan pratinjau dan pengambilan gambar diam ini.Camera2/X juga menetapkan parameter permintaan pengambilan melalui
SessionProcessorImpl#setParameters
. Anda harus menyetel parameter permintaan ini (jika parameter didukung) pada permintaan berulang dan tunggal.Anda harus mendukung setidaknya
CaptureRequest.JPEG_ORIENTATION
danCaptureRequest.JPEG_QUALITY
.extensions-interface
1.3.0 mendukung kunci permintaan dan hasil, yang diekspos oleh metode berikut:AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
Saat developer menetapkan kunci dalam daftar
getAvailableCaptureRequestKeys
, Anda harus mengaktifkan parameter dan memastikan hasil pengambilan berisi kunci dalam daftargetAvailableCaptureResultKeys
.startTrigger
SessionProcessorImpl.startTrigger()
dipanggil untuk memulai pemicu sepertiCaptureRequest.CONTROL_AF_TRIGGER
danCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER
. Anda dapat mengabaikan kunci permintaan pengambilan yang tidak diiklankan diAdvancedExtenderImpl.getAvailableCaptureRequestKeys()
.startTrigger()
telah didukung sejakextensions-interface
1.3.0. API ini memungkinkan aplikasi menerapkan ketuk untuk fokus dan flash dengan ekstensi.Pembersihan
Saat menyelesaikan sesi pengambilan gambar,
SessionProcessorImpl.onCaptureSessionEnd()
dipanggil sebelum menutupCameraCaptureSession
. Setelah sesi pengambilan ditutup,deInitSession()
akan melakukan pembersihan.
Mendukung pratinjau, pengambilan gambar diam, dan analisis gambar
Anda harus menerapkan ekstensi untuk kasus penggunaan pratinjau dan pengambilan gambar diam. Namun, jika latensi terlalu tinggi untuk menampilkan pratinjau dengan lancar, Anda dapat menerapkan ekstensi hanya untuk pengambilan gambar diam.
Untuk jenis Extender Dasar, terlepas dari pengaktifan ekstensi untuk pratinjau,
Anda harus menerapkan ImageCaptureExtenderImpl
dan PreviewExtenderImpl
untuk ekstensi tertentu. Sering kali, aplikasi juga menggunakan aliran YUV untuk menganalisis
konten gambar seperti menemukan kode QR atau teks. Untuk mendukung kasus penggunaan ini dengan lebih baik, Anda harus mendukung kombinasi streaming pratinjau, pengambilan gambar diam, dan streaming YUV_420_888
untuk mengonfigurasi CameraCaptureSession
. Artinya, jika Anda menerapkan pemroses, Anda harus mendukung kombinasi tiga streaming YUV_420_888
.
Untuk Advanced Extender, Camera2/X meneruskan tiga permukaan output ke panggilan
SessionProcessorImpl.initSession()
. Permukaan output ini masing-masing untuk pratinjau
, pengambilan gambar diam, dan analisis gambar. Anda harus memastikan bahwa output pratinjau dan pengambilan gambar diam menampilkan output yang valid. Namun, untuk permukaan output analisis gambar, pastikan hanya berfungsi saat non-null. Jika penerapan Anda tidak dapat mendukung aliran analisis gambar, Anda dapat menampilkan daftar kosong di AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
. Hal ini
memastikan bahwa output analisis gambar selalu null di
SessionProcessorImpl.initSession()
.
Mendukung perekaman video
Arsitektur Ekstensi Kamera saat ini hanya mendukung kasus penggunaan pratinjau dan pengambilan gambar diam. Kami tidak mendukung pengaktifan ekstensi di platform MediaCodec
atau MediaRecorder
untuk merekam video. Namun, aplikasi dapat merekam output pratinjau.
Dukungan untuk platform MediaCodec
dan MediaRecorder
sedang diselidiki.
Metadata khusus ekstensi
Untuk Android 14 dan yang lebih tinggi, metadata khusus ekstensi memungkinkan klien ekstensi kamera menetapkan dan menerima setelan dan hasil permintaan pengambilan gambar khusus ekstensi. Secara khusus, klien ekstensi kamera dapat menggunakan parameter permintaan pengambilan gambar EXTENSION_STRENGTH
untuk mengontrol kekuatan ekstensi dan hasil pengambilan gambar EXTENSION_CURRENT_TYPE
untuk menunjukkan jenis ekstensi yang diaktifkan.
Mencatat permintaan
Parameter permintaan pengambilan
EXTENSION_STRENGTH
mengontrol kekuatan efek pasca-pemrosesan ekstensi. Hasil pengambilan yang sesuai mencakup nilai kekuatan default jika parameter ini tidak ditetapkan secara eksplisit oleh klien. Parameter ini dapat diterapkan sebagai berikut untuk jenis ekstensi ini:
BOKEH
: Mengontrol jumlah blur.HDR
danNIGHT
: Mengontrol jumlah gambar yang digabungkan dan kecerahan gambar akhir.FACE_RETOUCH
: Mengontrol jumlah peningkatan kosmetik dan perataan kulit.
Rentang yang didukung untuk parameter EXTENSION_STRENGTH
adalah antara 0
dan
100
, dengan 0
menunjukkan tidak ada pemrosesan ekstensi atau passthrough sederhana dan
100
menunjukkan kekuatan ekstensi maksimum dari efek pemrosesan.
Untuk menambahkan dukungan untuk EXTENSION_STRENGTH
, gunakan API parameter khusus vendor yang diperkenalkan di antarmuka library ekstensi versi 1.3.0. Untuk informasi selengkapnya, lihat
getAvailableCaptureRequestKeys()
.
Hasil pengambilan gambar
Hasil pengambilan
EXTENSION_CURRENT_TYPE
memungkinkan penerapan ekstensi memberi tahu klien tentang jenis ekstensi aktif.
Karena ekstensi yang menggunakan jenis AUTO
beralih secara dinamis antara jenis ekstensi seperti HDR
dan NIGHT
, bergantung pada kondisi pemandangan, aplikasi ekstensi kamera dapat menggunakan EXTENSION_CURRENT_TYPE
untuk menampilkan informasi tentang ekstensi saat ini yang dipilih oleh ekstensi AUTO
.
Estimasi latensi pengambilan gambar diam real-time
Untuk Android 14 dan yang lebih tinggi, klien ekstensi kamera
dapat mengkueri estimasi latensi pengambilan gambar diam real-time berdasarkan kondisi pemandangan dan
lingkungan menggunakan
getRealtimeStillCaptureLatency()
. Metode
ini memberikan estimasi yang lebih akurat daripada metode
getEstimatedCaptureLatencyRangeMillis()
statis. Berdasarkan estimasi latensi, aplikasi dapat memutuskan untuk melewati pemrosesan ekstensi atau menampilkan indikasi untuk memberi tahu pengguna tentang operasi yang berjalan lama.
CameraExtensionSession.StillCaptureLatency latency;
latency = extensionSession.getRealtimeStillCaptureLatency();
// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().
latency.getCaptureLatency();
// The processing latency from ExtensionCaptureCallback#onCaptureProcessStarted() until the processed frame returns to the client.
latency.getProcessingLatency();
Untuk mendukung perkiraan latensi pengambilan gambar diam real-time, terapkan hal berikut:
- Ekstensi dasar:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency()
- Ekstensi lanjutan:
SessionProcessorImpl.getRealtimeCaptureLatency
Callback progres pemrosesan pengambilan
Untuk Android 14 dan yang lebih tinggi, klien ekstensi kamera dapat menerima callback untuk progres operasi pemrosesan pengambilan gambar diam yang berjalan lama. Aplikasi dapat menampilkan progres saat ini kepada pengguna untuk meningkatkan keseluruhan pengalaman pengguna.
Aplikasi dapat menggunakan kode berikut untuk mengintegrasikan fitur ini:
import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;
{
…
class AppCallbackImpl extends ExtensionCaptureCallback {
…
@Override
public void onCaptureProcessProgressed(
@NonNull CameraExtensionSession session,
@NonNull CaptureRequest request,
@IntRange(from = 0, to = 100) int progress) {
// Update app UI with current progress
}
}
…
}
Untuk mendukung callback progres pemrosesan pengambilan, implementasi vendor ekstensi Anda harus memanggil callback berikut dengan nilai progres saat ini:
- Ekstensi dasar:
ProcessResultImpl.onCaptureProcessProgressed()
- Ekstensi lanjutan:
CaptureCallback.onCaptureProcessProgressed()
Pengambilan gambar tetap pasca-tampilan
Untuk Android 14 dan yang lebih tinggi, ekstensi kamera dapat menyediakan postview (gambar pratinjau) menggunakan setPostviewOutputConfiguration
.
Untuk meningkatkan kualitas pengalaman pengguna, aplikasi dapat menampilkan gambar postview sebagai placeholder saat ekstensi mengalami peningkatan latensi pemrosesan, dan mengganti gambar saat gambar akhir tersedia. Aplikasi dapat mengonfigurasi
dan mengeluarkan permintaan pengambilan setelah dilihat menggunakan kode referensi berikut:
{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
ExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_NIGHT,
outputConfig,
backgroundExecutor,
extensionSessionStateCallback
);
extensionConfiguration.setPostviewOutputConfiguration(
postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
cameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);
CaptureRequest captureRequest = captureRequestBuilder.build();
…
}
Untuk mendukung pengambilan gambar diam pasca-tampilan, penerapan vendor Anda harus menerapkan hal berikut:
Ekstensi dasar:
CaptureProcessorImpl.onPostviewOutputSurface
danCaptureProcessorImpl.processWithPostview
Ekstensi lanjutan:
SessionProcessorImpl.startCaptureWithPostview
Mendukung output SurfaceView
Untuk Android 14 dan yang lebih tinggi, klien ekstensi kamera
dapat menggunakan jalur rendering pratinjau yang dioptimalkan untuk daya dan performa dengan mendaftarkan instance
SurfaceView
untuk output pratinjau untuk permintaan berulang.
Untuk mendukung output SurfaceView
, implementasi ekstensi vendor Anda harus
mampu melakukan streaming dan menampilkan pratinjau ke instance SurfaceView
. Untuk memverifikasi bahwa hal ini didukung, jalankan modul CTS SurfaceViewExtensionPreviewTest.java
.
Jenis sesi khusus vendor
Fitur ini memungkinkan penerapan ekstensi vendor untuk memilih jenis sesi khusus vendor yang akan ditetapkan dalam sesi pengambilan gambar kamera internal, bukan nilai default.
Fitur ini berfungsi sepenuhnya dalam framework dan vendor stack serta tidak berdampak pada API yang terlihat oleh klien/publik.
Untuk memilih jenis sesi khusus vendor, terapkan hal berikut untuk library ekstensi Anda:
* ExtenderStateListener.onSessionType()
untuk ekstensi dasar
* Camera2SessionConfigImpl.getSessionType()
untuk ekstensi lanjutan
Histori versi antarmuka ekstensi
Tabel berikut menunjukkan histori versi antarmuka Ekstensi Kamera. Anda harus selalu menerapkan library vendor dengan versi terbaru.
Versi | Fitur yang ditambahkan |
---|---|
1.0.0 |
|
1.1.0 |
|
1.2.0 |
|
1.3.0 |
|
1.4.0 |
|
Implementasi referensi
Implementasi library vendor OEM referensi berikut tersedia di
frameworks/ex
.
advancedSample
: Penerapan dasar Advanced Extender.sample
: Penerapan dasar Basic Extender.service_based_sample
: Implementasi yang menunjukkan cara menghosting Ekstensi Kamera diService
. Implementasi ini berisi komponen berikut:oem_library
: Library OEM Ekstensi Kamera untuk API Ekstensi Camera2 dan CameraX yang menerapkanExtensions-Interface
. Hal ini berfungsi sebagai passthrough yang meneruskan panggilan dariExtensions-Interface
ke layanan. Library ini juga menyediakan file AIDL dan class wrapper untuk berkomunikasi dengan layanan.Penguat Lanjutan diaktifkan secara default. Untuk mengaktifkan Basic Extender, ubah
ExtensionsVersionImpl#isAdvancedExtenderImplemented
agar menampilkanfalse
.extensions_service
: Implementasi contoh Layanan Ekstensi. Tambahkan penerapan Anda di sini. Antarmuka yang akan diterapkan di layanan serupa denganExtensions-Interface
. Misalnya, menerapkanIAdvancedExtenderImpl.Stub
melakukan operasi yang sama sepertiAdvancedExtenderImpl
.ImageWrapper
danTotalCaptureResultWrapper
diperlukan untuk membuatImage
danTotalCaptureResult
dapat di-parcel.
Menyiapkan library vendor di perangkat
Library vendor OEM tidak dibangun ke dalam aplikasi; library ini dimuat dari perangkat saat runtime oleh Camera2/X. Di CameraX, tag <uses-library>
menyatakan
bahwa library androidx.camera.extensions.impl
, yang ditentukan dalam
file AndroidManifest.xml
library camera-extensions
, adalah dependensi CameraX dan harus
dimuat saat runtime. Di Camera2, framework memuat layanan ekstensi yang juga menyatakan bahwa <uses-library>
memuat library
androidx.camera.extensions.impl
yang sama saat runtime.
Hal ini memungkinkan aplikasi pihak ketiga yang menggunakan ekstensi untuk memuat library vendor OEM secara otomatis. Library OEM ditandai sebagai opsional sehingga aplikasi dapat berjalan di perangkat yang tidak memiliki library di perangkat. Camera2/X menangani perilaku ini secara otomatis saat aplikasi mencoba menggunakan ekstensi kamera selama produsen perangkat menempatkan library OEM di perangkat sehingga dapat ditemukan oleh aplikasi.
Untuk menyiapkan library OEM di perangkat, lakukan hal berikut:
- Tambahkan file izin, yang diperlukan oleh tag
<uses-library>
, menggunakan format berikut:/etc/permissions/ANY_FILENAME.xml
. Misalnya,/etc/permissions/camera_extensions.xml
. File dalam direktori ini menyediakan pemetaan library yang dinamai dalam<uses-library>
ke jalur file sebenarnya di perangkat. Gunakan contoh di bawah untuk menambahkan informasi yang diperlukan ke file.
name
harus berupaandroidx.camera.extensions.impl
karena library itulah yang dicari CameraX.file
adalah jalur absolut file yang berisi penerapan ekstensi (misalnya,/system/framework/androidx.camera.extensions.impl.jar
).
<?xml version="1.0" encoding="utf-8"?> <permissions> <library name="androidx.camera.extensions.impl" file="OEM_IMPLEMENTED_JAR" /> </permissions>
Di Android 12 atau yang lebih tinggi, perangkat yang mendukung ekstensi CameraX harus menyetel properti ro.camerax.extensions.enabled
ke true
,
yang memungkinkan kueri apakah perangkat mendukung ekstensi.
Untuk melakukannya, tambahkan baris berikut dalam file pembuatan perangkat:
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
Validasi
Untuk menguji penerapan library vendor OEM selama tahap pengembangan, gunakan aplikasi contoh di androidx-main/camera/integration-tests/extensionstestapp/
, yang menjalankan berbagai ekstensi vendor.
Setelah Anda menyelesaikan penerapan, gunakan alat validasi ekstensi kamera untuk menjalankan pengujian otomatis dan manual guna memverifikasi bahwa library vendor diterapkan dengan benar.
Mode adegan yang diperluas versus ekstensi kamera
Untuk ekstensi bokeh, selain mengeksposnya menggunakan ekstensi kamera, Anda
dapat mengekspos ekstensi menggunakan mode pemandangan yang diperluas, yang diaktifkan melalui
kunci
CONTROL_EXTENDED_SCENE_MODE
.
Untuk mengetahui detail penerapan selengkapnya, lihat Bokeh kamera.
Mode adegan yang diperluas memiliki lebih sedikit batasan dibandingkan dengan ekstensi kamera untuk aplikasi camera2. Misalnya, Anda dapat mengaktifkan mode adegan yang diperluas dalam instance CameraCaptureSession
reguler yang mendukung kombinasi streaming fleksibel dan parameter permintaan pengambilan. Sebaliknya, ekstensi kamera hanya mendukung serangkaian jenis streaming tetap dan memiliki dukungan terbatas untuk parameter permintaan pengambilan gambar.
Kekurangan mode adegan yang diperluas adalah Anda hanya dapat menerapkannya di HAL kamera, yang berarti mode ini harus diverifikasi agar berfungsi di semua kontrol ortogonal yang tersedia bagi developer aplikasi.
Sebaiknya ekspos bokeh menggunakan mode adegan yang diperluas dan Ekstensi Camera karena aplikasi mungkin lebih suka menggunakan API tertentu untuk mengaktifkan bokeh. Sebaiknya gunakan mode adegan yang diperluas terlebih dahulu karena ini adalah cara paling fleksibel bagi aplikasi untuk mengaktifkan ekstensi bokeh. Kemudian, Anda dapat menerapkan antarmuka ekstensi kamera berdasarkan mode pemandangan yang diperluas. Jika penerapan bokeh di HAL kamera sulit, misalnya, karena memerlukan post-prosesor yang berjalan di lapisan aplikasi untuk memproses gambar, sebaiknya terapkan ekstensi bokeh menggunakan antarmuka Ekstensi Kamera.
Pertanyaan Umum (FAQ)
Apakah ada batasan pada level API?
Ya. Hal ini bergantung pada set fitur Android API yang diperlukan oleh implementasi library vendor OEM. Misalnya,
ExtenderStateListener.onPresetSession()
menggunakan
panggilan SessionConfiguration.setSessionParameters()
untuk menetapkan kumpulan tag dasar. Panggilan ini hanya tersedia di level API
28 dan yang lebih tinggi. Untuk mengetahui detail tentang metode antarmuka tertentu, lihat
dokumentasi referensi API.