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 seluruh Camera2 dan CameraX, lihat CameraX Extensions API. Jika 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 Ekstensi Kamera
interface atau extensions-interface
:
Gambar 1. Diagram arsitektur Ekstensi Kamera
Seperti yang ditunjukkan dalam diagram, untuk mendukung Ekstensi Kamera, Anda harus
menerapkan extensions-interface
yang disediakan oleh library vendor OEM. Nama
Library vendor OEM memungkinkan 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
camera-extensions-stub
ke dalam project library sistem. File berikut menentukan Ekstensi Kamera
dalam antarmuka berbasis web
yang sederhana.
camera-extensions-stub
file dibagi ke dalam 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
Class alat ekstensi malam (terapkan jika ekstensi Night didukung)
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
advanced/NightAdvancedExtenderImpl.java
Class alat perluasan otomatis (terapkan jika ekstensi Otomatis didukung)
AutoImageCaptureExtenderImpl.java
AutoPreviewExtenderImpl.java
advanced/AutoAdvancedExtenderImpl.java
Class alat ekstensi HDR (terapkan jika ekstensi HDR didukung)
HdrImageCaptureExtenderImpl.java
HdrPreviewExtenderImpl.java
advanced/HdrAdvancedExtenderImpl.java
Class alat ekstensi 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 perlu menyediakan implementasi untuk setiap ekstensi. Jika Anda
tidak menerapkan ekstensi, tetapkan isExtensionAvailable()
agar menampilkan false
atau
menghapus class Extender yang sesuai. Ekstensi Camera2 dan CameraX
API melaporkan ke aplikasi bahwa ekstensi tidak tersedia.
Mari kita pelajari cara Camera2 dan CameraX Extensions API berinteraksi dengan library vendor untuk mengaktifkan ekstensi. Diagram berikut mengilustrasikan alur end-to-end menggunakan ekstensi Night sebagai contoh:
Gambar 2. Implementasi ekstensi malam
Verifikasi versi:
Camera2/X memanggil
ExtensionVersionImpl.checkApiVersion()
untuk memastikan bahwa Versiextensions-interface
yang diterapkan OEM kompatibel dengan Camera2/X versi yang didukung.Inisialisasi library vendor:
InitializerImpl
memiliki metodeinit()
yang melakukan inisialisasi library vendor. Camera2/X menyelesaikan inisialisasi sebelum mengakses class Extender.Membuat instance class Extender:
Membuat instance class Extender untuk ekstensi tersebut. Ada dua Ekstensi jenis: Extender Dasar dan Advanced Extender. Anda harus menerapkan satu Jenis Extender untuk semua Ekstensi. Untuk informasi selengkapnya, lihat Extender Dasar versus Advanced Extender.
Camera2/X membuat instance dan berinteraksi dengan class Extender untuk mengambil informasi akun dan mengaktifkan ekstensi. Untuk ekstensi tertentu, Camera2/X dapat membuat instance class Extender beberapa kali. Karena itu, jangan inisialisasi yang sulit di konstruktor atau panggilan
init()
. Lakukan pekerjaan berat hanya ketika sesi kamera akan dimulai, seperti saatonInit()
dipanggil di Basic Extender atauinitSession()
dipanggil di Advanced Extender.Untuk ekstensi Night, class Extender berikut dibuat instance-nya untuk tipe Basic Extender:
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
Dan untuk jenis Advanced Extender:
NightAdvancedExtenderImpl.java
Periksa ketersediaan ekstensi:
Sebelum mengaktifkan ekstensi,
isExtensionAvailable()
akan memeriksa apakah tersedia pada ID kamera yang ditentukan melalui Extender di instance Compute Engine.Lakukan inisialisasi Extender dengan informasi kamera:
Camera2/X memanggil
init()
pada instance Extender dan meneruskannya ke kamera ID, danCameraCharacteristics
.Informasi kueri:
Memanggil class Extender untuk mengambil informasi seperti yang didukung resolusi, tetap merekam perkiraan latensi, dan mengambil kunci permintaan dari Extender sebagai persiapan untuk mengaktifkan ekstensi.
Aktifkan ekstensi di Extender:
Class Extender menyediakan semua antarmuka yang diperlukan untuk mengaktifkan . Produk ini menawarkan mekanisme untuk memikat OEM implementasi ke dalam pipeline Camera2 seperti memasukkan permintaan pengambilan parameter atau mengaktifkan pemroses postingan.
Untuk jenis Advanced Extender, Camera2/X berinteraksi dengan
SessionProcessorImpl
untuk mengaktifkan ekstensi. Camera2/X mengambil instanceSessionProcessorImpl
dengan memanggilcreateSessionProcessor()
di Ekstensi.
Bagian berikut menjelaskan alur ekstensi secara lebih mendetail.
Verifikasi versi
Saat memuat library vendor OEM dari perangkat saat runtime, Camera2/X
memastikan 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 digunakan
selama verifikasi versi.
Untuk memverifikasi versi, Camera2/X memanggil
ExtensionVersionImpl.checkApiVersion()
dengan dukungan
Versi extensions-interface
. Camera2/X kemudian menggunakan versi yang dilaporkan oleh
Library OEM untuk menentukan apakah ekstensi dapat diaktifkan dan kemampuan apa
yang harus dipanggil.
Kompatibilitas versi utama
Jika versi utama extension-interface berbeda di antara Camera2/X dan pustaka vendor, maka dianggap tidak kompatibel dan ekstensi dinonaktifkan.
Kompatibilitas mundur
Selama versi utamanya identik, Camera2/X memastikan
kompatibilitas mundur dengan library vendor OEM yang dibuat dengan
extensions-interface
versi. 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 masih kompatibel. Ini juga berarti bahwa
setelah Anda menerapkan
versi tertentu dari pustaka vendor, Camera2/X memastikan bahwa
kompatibel dengan versi extension-interface
mendatang.
Kompatibilitas dengan versi baru
Meneruskan kompatibilitas dengan library vendor extensions-interface
yang lebih baru
bergantung pada Anda, OEM. Jika Anda memerlukan beberapa
fitur untuk menerapkan ekstensi,
Anda mungkin ingin mengaktifkan ekstensi
mulai dari versi tertentu. Di sini
ini, Anda dapat menampilkan versi extensions-interface
yang didukung saat
Versi library Camera2/X memenuhi persyaratan. Jika versi Camera2/X
tidak didukung, Anda dapat mengembalikan versi yang
tidak kompatibel seperti 99.0.0 ke
menonaktifkan ekstensi.
Inisialisasi library vendor
Setelah memverifikasi versi extensions-interface
yang diterapkan oleh OEM
Camera2/X, lalu memulai proses inisialisasi. Tujuan
Metode InitializerImpl.init()
memberi tahu library OEM bahwa aplikasi sedang dicoba
untuk 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 extensions-interface
1.1.0. Camera2/X melewati inisialisasi library
jika library vendor OEM menerapkan extensions-interface
1.0.0.
Extender Dasar versus Advanced Extender
Ada dua jenis implementasi extensions-interface
: Extender Dasar dan
Ekstensi Lanjutan. Advanced Extender telah didukung sejak
extensions-interface
1.2.0.
Terapkan Perluasan Dasar untuk ekstensi yang memproses gambar di HAL kamera atau menggunakan pemroses pasca-prosesor yang mampu memproses streaming YUV.
Menerapkan Advanced Extender untuk ekstensi yang perlu menyesuaikan Camera2 konfigurasi {i>stream <i}dan mengirimkan permintaan tangkapan sesuai kebutuhan.
Lihat tabel berikut untuk perbandingannya:
Ekstensi Dasar | Ekstensi Lanjutan | |
---|---|---|
Konfigurasi streaming | Tetap Pratinjau: PRIVATE atau YUV_420_888 (jika prosesor ada) Masih merekam: JPEG atau YUV_420_888 (jika prosesor ada)
|
Dapat disesuaikan oleh OEM. |
Mengirim permintaan pengambilan | Hanya Camera2/X yang dapat mengirim permintaan pengambilan gambar. Anda dapat mengatur parameter untuk terhadap permintaan ini. Saat prosesor disediakan untuk pengambilan gambar, Camera2/X dapat mengirim beberapa permintaan pengambilan dan mengirim semua gambar dan ke prosesor. | Instance RequestProcessorImpl diberikan kepada Anda untuk
jalankan permintaan pengambilan
kamera2 dan dapatkan hasil serta {i>Image<i}.
Camera2/X memanggil |
Hook di pipeline kamera |
|
|
Cocok untuk | Ekstensi yang diterapkan di HAL kamera atau dalam prosesor yang memproses Gambar YUV. |
|
Versi API yang didukung | Ekstensi Camera2: Android 13 atau yang lebih baru Ekstensi CameraX: camera-extensions 1.1.0 atau yang lebih baru |
Ekstensi Camera2: Android 12L atau yang lebih baru Ekstensi CameraX: camera-extensions 1.2.0-alpha03 atau yang lebih baru |
Alur aplikasi
Tabel berikut menunjukkan tiga jenis alur aplikasi dan alurnya yang sesuai untuk panggilan Camera Extensions API. Sementara Camera2/X menyediakan API ini, Anda harus menerapkan pustaka vendor dengan benar untuk alur, yang akan kami jelaskan secara lebih rinci di bagian selanjutnya.
Ekstensi Camera2 | Ekstensi CameraX | |
---|---|---|
Ketersediaan ekstensi kueri | 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 gambar diam dengan ekstensi diaktifkan | CameraDevice.
createExtensionSession
|
val cameraSelector = ExtensionsManager.
getExtensionEnabledCameraSelector
|
Ekstensi Dasar
Antarmuka Basic Extender menyediakan hook ke beberapa tempat di kamera {i>pipelines<i} yang sama. Setiap jenis ekstensi memiliki class Extender yang sesuai yang diperlukan OEM untuk diimplementasikan.
Tabel berikut mencantumkan class Extender yang perlu diterapkan OEM untuk setiap class Extender ekstensi:
Class ekstensi yang akan diimplementasikan | |
---|---|
Malam | NightPreviewExtenderImpl.java
|
HDR | HdrPreviewExtenderImpl.java
|
Otomatis | AutoPreviewExtenderImpl.java
|
Bokeh | BokehPreviewExtenderImpl.java
|
Retouch wajah | BeautyPreviewExtenderImpl.java
|
Kita menggunakan PreviewExtenderImpl
dan ImageCaptureExtenderImpl
sebagai placeholder
dalam contoh berikut. Ganti ini dengan nama yang sebenarnya
yang Anda terapkan.
Basic Extender memiliki kemampuan berikut:
- Memasukkan parameter sesi saat mengonfigurasi
CameraCaptureSession
(onPresetSession
). - Memberi tahu Anda tentang peristiwa awal dan penutupan sesi tangkap dan kirim satu
meminta untuk memberi tahu HAL dengan parameter yang ditampilkan (
onEnableSession
,onDisableSession
). - Memasukkan parameter pengambilan untuk permintaan
(
PreviewExtenderImpl.getCaptureStage
,ImageCaptureExtenderImpl.getCaptureStages
). - Menambahkan prosesor untuk pratinjau dan tetap merekam video yang mampu memproses
Feed
YUV_420_888
.
Mari kita lihat bagaimana Camera2/X memanggil extensions-interface
untuk mencapai ketiga
alur aplikasi yang disebutkan di atas.
Alur aplikasi 1: Memeriksa ketersediaan ekstensi
Gambar 3. Alur aplikasi 1 di Extender Dasar
Dalam alur ini, Camera2/X secara langsung memanggil metode isExtensionAvailable()
PreviewExtenderImpl
dan ImageCaptureExtenderImpl
tanpa memanggil
init()
. Kedua class Extender harus menampilkan true
untuk mengaktifkan ekstensi.
Hal ini sering kali menjadi langkah pertama bagi aplikasi untuk memeriksa apakah ekstensi yang diberikan didukung untuk ID kamera tertentu sebelum mengaktifkan ekstensi. Hal ini karena beberapa ekstensi hanya didukung pada ID kamera tertentu.
Alur aplikasi 2: Informasi kueri
Gambar 4. Alur aplikasi 2 di Extender Dasar
Setelah menentukan apakah ekstensi tersedia, aplikasi harus membuat kueri informasi berikut sebelum mengaktifkan ekstensi.
Masih merekam rentang latensi:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
menampilkan rentang latensi perekaman untuk aplikasi guna mengevaluasi apakah sesuai untuk mengaktifkan ekstensi untuk skenario saat ini.Ukuran yang didukung untuk pratinjau dan platform pengambilan gambar:
ImageCaptureExtenderImpl.getSupportedResolutions
danPreviewExtenderImpl.getSupportedResolutions
menampilkan daftar format gambar dan ukuran yang didukung untuk ukuran dan format platform.Kunci hasil dan permintaan yang didukung: Camera2/X memanggil metode berikut untuk mengambil tangkapan yang didukung kunci permintaan dan kunci hasil dari penerapan Anda:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
Camera2/X selalu memanggil init()
terlebih dahulu di class Extender ini sebelum membuat kueri
untuk informasi selengkapnya.
Alur aplikasi 3: Melihat pratinjau/masih merekam dengan ekstensi diaktifkan (implementasi HAL)
Gambar 5. Alur aplikasi 3 di Extender Dasar
Diagram di atas mengilustrasikan alur utama pengaktifan pratinjau dan tetap merekam dengan ekstensi tanpa prosesor apa pun. Ini berarti HAL kamera memproses ekstensi.
Dalam alur ini, Camera2/X terlebih dahulu memanggil init()
, lalu onInit
, yang akan memberi tahu Anda
bahwa sesi kamera akan
dimulai dengan ekstensi tertentu.
Anda dapat melakukan inisialisasi tugas berat di onInit()
.
Saat mengonfigurasi CameraCaptureSession
, Camera2/X akan memanggil
onPresetSession
untuk mendapatkan parameter sesi. Setelah sesi pengambilan gambar
berhasil dikonfigurasi, Camera2/X memanggil onEnableSession
yang menampilkan
CaptureStageImpl
yang berisi parameter pengambilan. Kamera2/X
segera mengirimkan permintaan tunggal dengan parameter penangkapan ini untuk memberi tahu
HAL. Demikian pula, sebelum sesi pengambilan ditutup, Camera2/X memanggil
onDisableSession
lalu mengirimkan satu permintaan dengan gambar yang ditampilkan
parameter.
Permintaan berulang yang dipicu oleh Camera2/X berisi parameter permintaan
ditampilkan oleh PreviewExtenderImpl.getCaptureStage()
. Selain itu, elemen
permintaan pengambilan berisi parameter yang ditampilkan oleh
ImageCaptureExtenderImpl.getCaptureStages()
.
Terakhir, Camera2/X memanggil onDeInit()
setelah sesi kamera selesai.
Anda dapat melepaskan resource di onDeinit()
.
Pemroses pratinjau
Selain HAL kamera, Anda juga bisa mengimplementasikan ekstensi di prosesor.
Mengimplementasikan PreviewExtenderImpl.getProcessorType
untuk menentukan jenis prosesor
seperti yang dijelaskan di bawah:
PROCESSOR_TYPE_NONE
: Tidak ada prosesor. Gambar diproses di kamera HAL.PROCESSOR_TYPE_REQUEST_UPDATE_ONLY
: Jenis prosesor memungkinkan Anda memperbarui permintaan berulang dengan parameter permintaan pengambilan baru berdasarkan terbaruTotalCaptureResult
.PreviewExtenderImpl.getProcessor
harus menampilkanRequestUpdateProcessorImpl
yang memproses instanceTotalCaptureResult
dan menampilkanCaptureStageImpl
untuk memperbarui permintaan berulang.PreviewExtenderImpl.getCaptureStage()
juga harus mencerminkan hasil pemrosesan dan menampilkanCaptureStageImpl
terbaru.PROCESSOR_TYPE_IMAGE_PROCESSOR
: Jenis ini memungkinkan Anda menerapkan untuk memproses gambarYUV_420_888
dan menulis output ke platformPRIVATE
.Anda perlu mengimplementasikan dan menampilkan
PreviewImageProcessorImpl
diPreviewExtenderImpl.getProcessor
. Prosesor bertanggung jawab untuk memproses gambar inputYUV_420_888
. Fungsi tersebut harus menulis output ke Format pratinjauPRIVATE
. Camera2/X menggunakan platformYUV_420_888
sebagai gantinya dariPRIVATE
guna mengonfigurasiCameraCaptureSession
untuk pratinjau.Lihat ilustrasi berikut untuk alurnya:
Gambar 6. Pratinjau alur dengan PreviewImageProcessorImpl
Antarmuka PreviewImageProcessorImpl
memperluas ProcessImpl
dan memiliki
tiga metode penting:
onOutputSurface(Surface surface, int imageFormat)
menetapkan platform output untuk prosesor. UntukPreviewImageProcessorImpl
,imageFormat
adalah piksel sepertiPixelFormat.RGBA_8888
.onResolutionUpdate(Size size)
menetapkan ukuran gambar input.onImageFormatUpdate(int imageFormat)
menetapkan format gambar input gambar. Saat ini, nilainya hanya dapatYUV_420_888
.
Prosesor pengambilan gambar
Untuk pengambilan gambar diam, Anda bisa mengimplementasikan prosesor dengan menampilkan
CaptureProcessorImpl
menggunakan ImageCaptureExtenderImpl.getCaptureProcessor
. Prosesornya adalah
bertanggung jawab untuk memproses daftar YUV_420_888
gambar yang diambil dan
ke instance TotalCaptureResult
dan tulis output ke platform YUV_420_888
.
Anda dapat berasumsi dengan aman bahwa pratinjau telah diaktifkan dan berjalan sebelum mengirim masih menangkap permintaan.
Lihat alurnya dalam diagram di bawah ini:
Gambar 7. Masih merekam alur dengan CaptureProcessorImpl
Camera2/X menggunakan platform format
YUV_420_888
untuk pengambilan gambar diam guna mengonfigurasi sesi penangkapan. Camera2/X menyiapkanCaptureProcessorImpl
dengan memanggil:CaptureProcessorImpl.onImageFormatUpdate()
denganYUV_420_888
.CaptureProcessorImpl.onResolutionUpdate()
dengan ukuran gambar input.CaptureProcessorImpl.onOutputSurface()
dengan outputYUV_420_888
ditampilkan.
ImageCaptureExtenderImpl.getCaptureStages
menampilkan daftarCaptureStageImpl
, dengan setiap elemen dipetakan ke instanceCaptureRequest
dengan parameter tangkapan yang dikirim oleh Camera2/X. Misalnya, jika {i>output<i} yang ditampilkan adalah daftar tiga InstanceCaptureStageImpl
, Camera2/X mengirimkan tiga permintaan pengambilan parameter penangkapan yang sesuai menggunakancaptureBurst
Compute Engine API.Gambar yang diterima dan instance
TotalCaptureResult
dipaketkan menjadi satu dan dikirim keCaptureProcessorImpl
untuk diproses.CaptureProcessorImpl
menulis Gambar hasil (formatYUV_420_888
) ke platform output yang ditentukan oleh panggilanonOutputSurface()
. Camera2/X mengonversinya ke dalam gambar JPEG jika diperlukan.
Mendukung kunci dan hasil permintaan pengambilan
Selain pratinjau dan pengambilan gambar kamera, aplikasi dapat menyetel zoom, parameter, atau memicu ketuk untuk memfokuskan. Parameter ini mungkin tidak kompatibel dengan penerapan ekstensi.
Metode berikut telah ditambahkan ke extensions-interface
1.3.0 untuk memungkinkan
Anda untuk mengekspos parameter yang didukung penerapan Anda:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()
akan menampilkan mengambil kunci permintaan yang didukung oleh implementasi Anda.ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()
akan menampilkan kunci hasil tangkapan yang terkandung dalam hasil tangkapan.
Jika HAL kamera memproses ekstensi, Camera2/X akan mengambil gambar
menghasilkan CameraCaptureSession.CaptureCallback
. Namun, jika
prosesor diimplementasikan, kemudian Camera2/X
mengambil hasil tangkapan di
ProcessResultImpl
, yang diteruskan ke process()
metode di
PreviewImageProcessorImpl
dan
CaptureProcessorImpl
.
Anda bertanggung jawab
untuk melaporkan
hasil pengambilan gambar melalui ProcessResultImpl
ke Camera2/X.
Lihat definisi antarmuka CaptureProcessorImpl
di bawah sebagai contoh.
Pada 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 pengoperasian kamera umum seperti zoom, ketuk untuk memfokuskan, flash, dan eksposur kompensasi tersebut, sebaiknya dukung kunci berikut untuk kedua minta dan ambil hasil:
- 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 Extender Dasar yang mengimplementasikan 1.2.0 atau versi sebelumnya, CameraX
Extensions API secara eksplisit mendukung semua kunci di atas. Sebagai
extensions-interface
1.3.0, CameraX dan Camera2 mengikuti daftar yang ditampilkan
dan hanya mendukung kunci
yang ada di dalamnya. Misalnya, jika Anda memutuskan untuk
hanya CaptureRequest#CONTROL_ZOOM_RATIO
dan
CaptureRequest#SCALER_CROP_REGION
dalam implementasi 1.3.0, maka
berarti hanya zoom yang didukung untuk aplikasi saat ketuk untuk memfokuskan, flash, dan eksposur
kompensasi tidak diizinkan.
Ekstensi Lanjutan
Advanced Extender adalah jenis implementasi vendor yang didasarkan pada Camera2 API.
Jenis Extender ini ditambahkan di extensions-interface
1.2.0. Bergantung pada
produsen perangkat, ekstensi
mungkin diimplementasikan dalam lapisan aplikasi,
yang bergantung pada faktor-faktor berikut:
Konfigurasi streaming kustom: Mengonfigurasi streaming kustom seperti streaming RAW atau memiliki beberapa streaming untuk ID kamera fisik yang berbeda.
Kemampuan untuk mengirim permintaan Camera2: Mendukung interaksi yang rumit yang dapat mengirim permintaan penangkapan dengan parameter berdasarkan hasil permintaan sebelumnya.
Advanced Extender menyediakan wrapper, atau lapisan perantara, sehingga Anda bisa menyesuaikan konfigurasi streaming dan mengirim permintaan pengambilan sesuai permintaan.
File untuk diterapkan
Untuk beralih ke implementasi Advanced Extender,
isAdvancedExtenderImplemented()
metode di
ExtensionVersionImpl
harus menampilkan true
. Untuk setiap jenis ekstensi, OEM harus menerapkan
class Extender yang sesuai. File implementasi Advanced Extender
dalam paket advanced.
Class ekstensi yang akan diimplementasikan | |
---|---|
Malam | advanced/NightAdvancedExtenderImpl.java
|
HDR | advanced/HdrAdvancedExtenderImpl.java
|
Otomatis | advanced/AutoAdvancedExtenderImpl.java
|
Bokeh | advanced/BokehAdvancedExtenderImpl.java
|
Retouch Wajah | advanced/BeautyAdvancedExtenderImpl.java
|
Kami menggunakan AdvancedExtenderImpl
sebagai placeholder dalam contoh berikut.
Ganti dengan nama file {i>Extender<i} untuk ekstensi yang Anda
terapkan.
Mari kita lihat bagaimana Camera2/X memanggil extensions-interface
untuk mencapai ketiga
alur aplikasi.
Alur aplikasi 1: Memeriksa ketersediaan ekstensi
Gambar 8. Alur aplikasi 1 di Advanced Extender
Pertama, aplikasi akan 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 mengkueri
dengan mengikuti informasi di AdvancedExtenderImpl
:
Perkiraan latensi pengambilan gambar:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()
menampilkan rentang latensi pengambilan untuk aplikasi guna mengevaluasi apakah sesuai untuk mengaktifkan ekstensi untuk skenario saat ini.Resolusi yang didukung untuk pratinjau dan gambar diam:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()
menampilkan peta format gambar ke daftar ukuran yang didukung untuk format platform pratinjau dan ukuran. OEM harus mendukung setidaknya formatPRIVATE
.AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()
akan menampilkan format dan ukuran yang didukung untuk permukaan gambar diam. OEM harus mendukung keduanya Output formatJPEG
danYUV_420_888
.AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
akan menampilkan ukuran yang didukung untuk aliranYUV_420_888
tambahan bagi analisis gambar. Jika platform YUV analisis gambar tidak didukung,getSupportedYuvAnalysisResolutions()
akan menampilkannull
atau daftar kosong.
Kunci/hasil permintaan pengambilan yang tersedia (ditambahkan di
extensions-interface
1.3.0): Camera2/X memanggil metode berikut untuk mengambil tangkapan yang didukung kunci permintaan dan kunci hasil dari penerapan Anda:AdvancedExtenderImpl.getAvailableCaptureRequestKeys
AdvancedExtenderImpl.getAvailableCaptureResultKeys
Untuk informasi selengkapnya, lihat Mendukung pengambilan kunci dan hasil permintaan.
Alur aplikasi 3: Melihat pratinjau/tetap merekam dengan ekstensi diaktifkan
Gambar 10. Alur aplikasi 3 di Advanced Extender
Diagram di atas menunjukkan alur utama untuk memulai pratinjau dan tetap merekam berjenis Advanced Extender. Mari kita pelajari setiap langkahnya.
Instance
SessionProcessorImpl
Implementasi inti Advanced Extender berada di
SessionProcessorImpl
, yang bertanggung jawab untuk menyediakan konfigurasi sesi yang disesuaikan dan mengirim merekam permintaan untuk memulai pratinjau dan tetap mencatat permintaan.AdvancedExtenderImpl.createSessionProcessor()
dipanggil untuk menampilkan InstanceSessionProcessorImpl
.initSession
SessionProcessorImpl.initSession()
menginisialisasi sesi untuk ekstensi. Di sinilah Anda mengalokasikan sumber daya dan mengembalikan konfigurasi sesi untuk menyiapkanCameraCaptureSession
.Untuk parameter input, Camera2/X menentukan konfigurasi platform output untuk pratinjau, gambar diam, dan analisis gambar YUV opsional. Output ini konfigurasi permukaan (
OutputSurfaceImpl
) berisi permukaan, ukuran, dan gambar format yang diambil dengan metode berikut diAdvancedExtenderImpl
:getSupportedPreviewOutputResolutions()
getSupportedCaptureOutputResolutions()
getSupportedYuvAnalysisResolutions()
Anda harus menampilkan instance
Camera2SessionConfigImpl
, yang terdiri dari daftar instanceCamera2OutputConfigImpl
dan parameter sesi yang digunakan untuk mengonfigurasiCameraCaptureSession
. Anda bertanggung jawab terhadap yang menghasilkan gambar kamera yang benar ke permukaan output yang diteruskan oleh Kamera2/X. Berikut beberapa opsi untuk mengaktifkan output:- Pemrosesan di HAL kamera: Anda dapat langsung menambahkan permukaan output
ke
CameraCaptureSession
denganSurfaceOutputConfigImpl
terlepas dari implementasi layanan. Tindakan ini mengonfigurasi platform output yang disediakan ke kamera dan memungkinkan HAL kamera untuk memproses gambar. Memproses platform
ImageReader
perantara (RAW, YUV, dll.): Tambahkan lapisan permukaanImageReader
perantara keCameraCaptureSession
denganImageReaderOutputConfigImpl
.Anda perlu memproses gambar perantara dan menulis gambar hasilnya ke permukaan output.
- Menggunakan fitur berbagi platform Camera2: Menggunakan berbagi platform dengan platform lain
dengan menambahkan instance
Camera2OutputConfigImpl
ke MetodegetSurfaceSharingOutputConfigs()
dari yang lainCamera2OutputConfigImpl
. Format dan ukuran platform harus identik.
Semua
Camera2OutputConfigImpl
termasukSurfaceOutputConfigImpl
danImageReaderOutputConfigImpl
harus memiliki ID unik (getId()
), yang digunakan untuk menentukan area target dan mengambil gambar dariImageReaderOutputConfigImpl
.onCaptureSessionStart
danRequestProcessorImpl
Saat
CameraCaptureSession
dimulai dan framework Kamera memanggilonConfigured()
, lalu Camera2/X memanggilSessionProcessorImpl.onCaptureSessionStart()
dengan permintaan Camera2 pembungkusRequestProcessImpl
. Camera2/X mengimplementasikanRequestProcessImpl
, yang memungkinkan Anda mengeksekusi permintaan pengambilan, dan ambil gambar jikaImageReaderOutputConfigImpl
digunakan.RequestProcessImpl
API mirip dengan Camera2CameraCaptureSession
API dalam hal menjalankan permintaan. Perbedaannya adalah:- Platform target ditetapkan oleh ID platform
Instance
Camera2OutputConfigImpl
. - Kemampuan mengambil gambar
ImageReader
.
Anda dapat memanggil
RequestProcessorImpl.setImageProcessor()
dengan IDCamera2OutputConfigImpl
untuk mendaftarkan instanceImageProcessorImpl
ke menerima gambar.Instance
RequestProcessImpl
menjadi tidak valid setelah panggilan Camera2/XSessionProcessorImpl.onCaptureSessionEnd()
.- Platform target ditetapkan oleh ID platform
Instance
Memulai pratinjau dan mengambil gambar
Dalam implementasi Advanced Extender, Anda bisa 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 mengirimkan rekaman untuk memenuhi permintaan pratinjau dan perekaman diam ini.Camera2/X juga mengatur parameter permintaan pengambilan gambar melalui
SessionProcessorImpl#setParameters
. Anda harus menetapkan 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 permintaan dan kunci hasil, yang diekspos oleh metode berikut:AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
Saat developer menetapkan kunci dalam daftar
getAvailableCaptureRequestKeys
, Anda harus mengaktifkan parameter dan memastikan bahwa berisi kunci dalam daftargetAvailableCaptureResultKeys
.startTrigger
SessionProcessorImpl.startTrigger()
dipanggil untuk memulai pemicu seperti sebagaiCaptureRequest.CONTROL_AF_TRIGGER
danCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER
. Anda dapat mengabaikan tangkap kunci permintaan yang tidak diiklankan diAdvancedExtenderImpl.getAvailableCaptureRequestKeys()
.startTrigger()
telah didukung sejakextensions-interface
1.3.0. Ini memungkinkan aplikasi menerapkan ketuk untuk memfokuskan dan flash dengan ekstensi.Pembersihan
Saat menyelesaikan sesi pengambilan gambar,
SessionProcessorImpl.onCaptureSessionEnd()
dipanggil sebelum penutupanCameraCaptureSession
. Setelah sesi pengambilan gambar selesai,deInitSession()
melakukan pembersihan.
Mendukung pratinjau, pengambilan gambar diam, dan analisis gambar
Anda harus menerapkan ekstensi untuk pratinjau dan tetap merekam kasus penggunaan. Namun, jika latensi terlalu tinggi untuk menampilkan pratinjau dengan lancar, Anda dapat menerapkan ekstensi hanya untuk tangkapan diam.
Untuk jenis Basic Extender, meskipun ekstensi diaktifkan untuk pratinjau,
Anda harus mengimplementasikan ImageCaptureExtenderImpl
dan PreviewExtenderImpl
untuk ekstensi tertentu. Sering kali, aplikasi juga menggunakan streaming YUV untuk menganalisis
konten gambar seperti menemukan kode QR atau teks. Untuk lebih mendukung kasus penggunaan ini
, Anda harus mendukung kombinasi streaming pratinjau, diam, dan
aliran YUV_420_888
untuk mengonfigurasi CameraCaptureSession
. Artinya
jika Anda mengimplementasikan prosesor, maka Anda harus mendukung aliran data
kombinasi dari tiga aliran data YUV_420_888
.
Untuk Advanced Extender, Camera2/X meneruskan tiga permukaan output ke
Panggilan SessionProcessorImpl.initSession()
. Platform output ini adalah untuk pratinjau
, gambar diam, dan analisis gambar. Anda harus memastikan bahwa pratinjau
dan tetap merekam platform output menampilkan output yang valid. Namun, untuk gambar
permukaan output analisis, pastikan objek itu hanya berfungsi jika nilainya bukan {i>null<i}. Jika
tidak dapat mendukung aliran data analisis gambar, Anda dapat menampilkan output kosong
daftar di AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
. Ini
memastikan platform output analisis gambar selalu null di
SessionProcessorImpl.initSession()
.
Mendukung perekaman video
Arsitektur Ekstensi Kamera saat ini hanya mendukung pratinjau dan tetap
menangkap kasus penggunaan. Kami tidak mendukung pengaktifan ekstensi di MediaCodec
atau MediaRecorder
untuk merekam video. Namun, mungkin saja
agar aplikasi dapat merekam output pratinjau.
Mendukung platform MediaCodec
dan MediaRecorder
sedang dalam penyelidikan.
Metadata khusus ekstensi
Untuk Android 14 dan yang lebih baru, metadata khusus ekstensi
memungkinkan klien ekstensi kamera menetapkan dan menerima pengambilan gambar khusus ekstensi
setelan dan hasil permintaan. Secara khusus, ekstensi kamera
klien dapat menggunakan parameter permintaan pengambilan EXTENSION_STRENGTH
untuk mengontrol
kekuatan ekstensi dan hasil pengambilan EXTENSION_CURRENT_TYPE
untuk
menunjukkan jenis ekstensi yang diaktifkan.
Mencatat permintaan
Tujuan
EXTENSION_STRENGTH
ambil parameter permintaan
mengontrol kekuatan efek pascapemrosesan ekstensi. Model
hasil tangkapan mencakup nilai kekuatan default jika parameter ini tidak disetel
secara eksplisit oleh klien. Parameter ini dapat diterapkan sebagai berikut untuk
jenis ekstensi:
BOKEH
: Mengontrol tingkat blur.HDR
danNIGHT
: Mengontrol jumlah gambar yang menyatu dan kecerahan gambar akhir.FACE_RETOUCH
: Mengontrol jumlah peningkatan kosmetik dan kulit {i>smoothing.<i}
Rentang yang didukung untuk parameter EXTENSION_STRENGTH
adalah antara 0
dan
100
, dengan 0
yang menunjukkan tidak ada pemrosesan ekstensi atau passthrough sederhana dan
100
yang menunjukkan kekuatan ekstensi maksimum dari efek pemrosesan.
Guna menambahkan dukungan untuk EXTENSION_STRENGTH
, gunakan vendor
API parameter spesifik yang diperkenalkan dalam library ekstensi versi 1.3.0
dalam antarmuka berbasis web
yang sederhana. Untuk informasi selengkapnya, lihat
getAvailableCaptureRequestKeys()
.
Mengambil hasil
Tujuan
EXTENSION_CURRENT_TYPE
hasil tangkapan memungkinkan penerapan ekstensi memberi tahu klien tentang
jenis ekstensi.
Karena ekstensi yang menggunakan jenis AUTO
secara dinamis beralih di antara ekstensi
seperti HDR
dan NIGHT
bergantung pada kondisi scene, kamera
aplikasi ekstensi dapat menggunakan EXTENSION_CURRENT_TYPE
untuk menampilkan informasi tentang
ekstensi saat ini yang dipilih oleh ekstensi AUTO
.
Estimasi latensi pengambilan gambar real-time
Untuk Android 14 dan yang lebih baru, klien ekstensi kamera
dapat mengkueri real-time masih dapat menangkap perkiraan latensi berdasarkan scene dan
kondisi lingkungan menggunakan
getRealtimeStillCaptureLatency()
Ini
memberikan estimasi yang lebih akurat dibandingkan metode statis
getEstimatedCaptureLatencyRangeMillis()
. Berdasarkan estimasi latensi, aplikasi dapat memutuskan untuk melewati ekstensi
atau menampilkan indikasi untuk
memberi tahu pengguna tentang
yang sedang berjalan.
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 estimasi latensi yang masih direkam secara real-time, terapkan hal berikut:
- Ekstensi dasar:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency()
- Ekstensi lanjutan:
SessionProcessorImpl.getRealtimeCaptureLatency
Merekam callback progres pemrosesan
Untuk Android 14 dan yang lebih baru, klien ekstensi kamera dapat menerima callback untuk kemajuan pemrosesan tangkapan yang masih berjalan lama operasional bisnis. Aplikasi dapat menampilkan progres saat ini kepada pengguna untuk meningkatkan pengalaman pengguna secara keseluruhan.
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, vendor ekstensi Anda harus memanggil callback berikut dengan progres saat ini nilai:
- Ekstensi dasar:
ProcessResultImpl.onCaptureProcessProgressed()
- Ekstensi lanjutan:
CaptureCallback.onCaptureProcessProgressed()
Postview masih ditangkap
Untuk Android 14 dan yang lebih baru, ekstensi kamera dapat
menyediakan postview (gambar pratinjau) menggunakan
setPostviewOutputConfiguration
Untuk meningkatkan pengalaman pengguna, aplikasi dapat menampilkan gambar pascatayang sebagai
placeholder saat ekstensi mengalami peningkatan latensi pemrosesan,
dan mengganti gambar saat gambar akhir tersedia. Aplikasi dapat mengonfigurasi
dan mengeluarkan permintaan pengambilan tampilan pos 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 postview, implementasi vendor Anda harus menerapkan berikut ini:
Ekstensi dasar:
CaptureProcessorImpl.onPostviewOutputSurface
danCaptureProcessorImpl.processWithPostview
Ekstensi lanjutan:
SessionProcessorImpl.startCaptureWithPostview
Mendukung output SurfaceView
Untuk Android 14 dan yang lebih baru, klien ekstensi kamera
dapat menggunakan jalur render pratinjau yang dioptimalkan daya dan performa dengan mendaftarkan
SurfaceView
untuk output pratinjau untuk permintaan berulang.
Untuk mendukung output SurfaceView
, implementasi ekstensi vendor Anda harus
yang mampu melakukan streaming dan menghasilkan output berupa pratinjau ke instance SurfaceView
. Kepada
memastikan bahwa skrip ini didukung, jalankan SurfaceViewExtensionPreviewTest.java
modul CTS.
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 stack vendor serta tidak memiliki dampak 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 tambahan |
---|---|
1.0.0 |
|
1.1.0 |
|
1.2.0 |
|
1.3.0 |
|
1.4.0 |
|
Penerapan referensi
Penerapan library vendor OEM referensi berikut tersedia di
frameworks/ex
advancedSample
: Implementasi dasar Advanced Extender.sample
: Implementasi dasar Extender Dasar.service_based_sample
: Implementasi yang menunjukkan cara menghosting Ekstensi Kamera diService
. Implementasi ini berisi komponen berikut:oem_library
: Library OEM Ekstensi Kamera untuk Camera2 dan CameraX Extensions API yang mengimplementasikanExtensions-Interface
. Ini bertindak sebagai passthrough yang meneruskan panggilan dariExtensions-Interface
ke layanan. Library ini juga menyediakan file AIDL dan class wrapper untuk berkomunikasi dengan layanan.Advanced Extender diaktifkan secara default. Untuk mengaktifkan Basic Extender, ubah
ExtensionsVersionImpl#isAdvancedExtenderImplemented
untuk menampilkanfalse
.extensions_service
: Contoh implementasi Layanan Ekstensi. Tambahkan penerapan Anda di sini. Antarmuka yang akan diimplementasikan dalam layanan ini serupa keExtensions-Interface
. Misalnya, menerapkanIAdvancedExtenderImpl.Stub
menjalankan operasi yang sama denganAdvancedExtenderImpl
.ImageWrapper
danTotalCaptureResultWrapper
adalah diperlukan agarImage
danTotalCaptureResult
dapat dibagikan.
Menyiapkan library vendor di perangkat
Library vendor OEM tidak disertakan dalam aplikasi; data itu dimuat dari perangkat
pada runtime oleh Camera2/X. Di CameraX, tag <uses-library>
mendeklarasikan
library androidx.camera.extensions.impl
, yang ditentukan dalam
AndroidManifest.xml
dari library camera-extensions
, adalah dependensi CameraX dan harus
yang dimuat saat runtime. Di Camera2, kerangka kerja
memuat layanan ekstensi yang
juga mendeklarasikan bahwa <uses-library>
memuat
Library androidx.camera.extensions.impl
pada runtime.
Hal ini memungkinkan aplikasi pihak ketiga yang menggunakan ekstensi untuk memuat OEM secara otomatis library vendor. Library OEM ditandai sebagai opsional sehingga aplikasi dapat berjalan di perangkat yang tidak memiliki {i>library <i}di perangkat. Camera2/X menangani perilaku ini secara otomatis saat aplikasi mencoba menggunakan kamera selama produsen perangkat menempatkan library OEM pada 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
. Sebagai contoh,/etc/permissions/camera_extensions.xml
. File dalam menyediakan pemetaan library yang dinamai di<uses-library>
ke jalur file yang sebenarnya di perangkat. Gunakan contoh di bawah untuk menambahkan informasi yang diperlukan ke file.
name
harusandroidx.camera.extensions.impl
karena library yang ditelusuri 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 baru, perangkat yang mendukung CameraX
ekstensi harus memiliki properti ro.camerax.extensions.enabled
yang ditetapkan ke true
,
yang memungkinkan kueri apakah
perangkat mendukung ekstensi.
Untuk melakukannya, tambahkan baris berikut di 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 berjalan melalui
berbagai ekstensi vendor.
Setelah Anda menyelesaikan implementasi, gunakan alat validasi ekstensi kamera untuk menjalankan pengujian otomatis dan manual guna memverifikasi bahwa pustaka vendor diimplementasikan dengan benar.
Mode adegan yang diperluas versus ekstensi kamera
Untuk ekstensi bokeh, selain mengeksposnya menggunakan ekstensi kamera, Anda
dapat mengekspos ekstensi menggunakan mode scene yang diperluas, yang diaktifkan melalui
tindakan
CONTROL_EXTENDED_SCENE_MODE
tombol.
Untuk mengetahui detail implementasi selengkapnya, lihat Bokeh kamera.
Mode adegan yang diperluas memiliki batasan yang lebih sedikit dibandingkan dengan ekstensi kamera untuk
kamera2 aplikasi. Misalnya, Anda dapat mengaktifkan mode adegan yang diperluas di
instance CameraCaptureSession
reguler yang mendukung streaming fleksibel
kombinasi dan mengambil parameter permintaan. Sebaliknya, ekstensi kamera
hanya mendukung kumpulan jenis streaming yang tetap dan memiliki dukungan terbatas untuk pengambilan
parameter permintaan.
Kelemahan mode adegan yang diperluas adalah Anda hanya bisa menerapkannya dalam kamera HAL, yang berarti bahwa itu harus diverifikasi agar berfungsi di semua kontrol ortogonal yang tersedia untuk developer aplikasi.
Sebaiknya eksposur bokeh menggunakan mode pemandangan yang diperluas dan Kamera Ekstensi karena aplikasi mungkin lebih memilih menggunakan API tertentu untuk mengaktifkan bokeh. Sebaiknya gunakan mode pemandangan yang diperluas terlebih dahulu karena ini adalah fleksibel bagi aplikasi untuk mengaktifkan ekstensi bokeh. Selanjutnya Anda dapat menerapkan antarmuka ekstensi kamera berdasarkan mode adegan yang diperluas. Jika menerapkan bokeh di HAL kamera itu sulit, misalnya, karena memerlukan posting yang berjalan di lapisan aplikasi untuk memproses gambar, sebaiknya terapkan ekstensi bokeh menggunakan antarmuka Camera Extensions.
Pertanyaan Umum (FAQ)
Apakah ada batasan pada level API?
Ya. Hal ini bergantung pada set fitur Android API yang diperlukan oleh OEM
implementasi pustaka vendor. Misalnya,
ExtenderStateListener.onPresetSession()
menggunakan
SessionConfiguration.setSessionParameters()
untuk menetapkan set tag dasar. Panggilan ini hanya tersedia pada level API
28 dan lebih tinggi. Untuk detail tentang metode antarmuka tertentu, lihat
Dokumentasi referensi API.