Aplikasi Android berjalan di lebih banyak faktor bentuk daripada hanya ponsel yang dipegang dalam mode potret. Dengan diperkenalkannya mode jendela desktop, layar terhubung, dan perangkat foldable, aplikasi kamera Anda harus beradaptasi dengan ukuran jendela dinamis, rasio aspek yang bervariasi, dan hardware eksternal.
Penyebab logika ponsel rusak
Aplikasi kamera sering kali membuat asumsi yang menyebabkan kegagalan kritis pada lingkungan multi-faktor bentuk.
Orientasi alami
- Asumsi: Orientasi alami perangkat
ROTATION_0selalu potret - Kenyataan: Di tablet, layar bagian dalam beberapa perangkat foldable, dan monitor desktop,
ROTATION_0sering kali dalam mode lanskap - Hasil: Pratinjau salah diputar 90 derajat
Penyesuaian sensor
- Asumsi: Tepi panjang sensor kamera sejajar dengan tepi panjang layar
- Realitas: Jendela yang dapat diubah ukurannya dapat berbentuk persegi atau lanskap, sementara sensor tetap (biasanya 4:3)
- Hasil: Gambar yang direntangkan atau terdistorsi
Kepadatan dan ukuran layar
- Asumsi: Kepadatan dan ukuran layar tidak berubah saat runtime
- Realitas: Di lingkungan desktop, pengguna bebas mengubah ukuran jendela
- Hasil: Memulai ulang sesi kamera pada setiap peristiwa penarikan mengganggu pengalaman pengguna dan dapat menyebabkan error
Solusi 1: Menggunakan intent sistem
Jika aplikasi Anda perlu mengambil foto atau merekam video, tetapi tidak memerlukan antarmuka kamera kustom khusus, cara terbaik untuk menangani berbagai faktor bentuk adalah meluncurkan kamera sistem bawaan perangkat (lihat Intent kamera)
Menggunakan intent sistem mendelegasikan seluruh pengalaman pengambilan ke aplikasi kamera yang dikembangkan oleh produsen peralatan asli (OEM) perangkat. Hal ini secara efektif mengalihdayakan kompleksitas dukungan faktor bentuk, termasuk:
Dukungan pengubahan ukuran dan rotasi bawaan — Aplikasi kamera default di perangkat foldable atau tablet dibuat secara eksplisit oleh produsen untuk menangani geometri perangkat tertentu tersebut. Aplikasi dirancang agar berperilaku dengan benar saat perangkat dibentangkan, diputar, atau diaktifkan ke mode multi-aplikasi.
Akses ke fitur hardware lanjutan — Aplikasi kamera OEM memiliki akses eksklusif ke algoritma yang dioptimalkan hardware (mode malam, HDR, peralihan lensa tertentu) yang sulit atau tidak mungkin direplikasi secara manual.
Solusi 2: Gunakan Jetpack CameraX
CameraX adalah library Jetpack yang dibuat untuk memudahkan pengembangan aplikasi kamera. CameraX mendukung siklus proses dan berorientasi pada permukaan. Tidak seperti Camera2, yang memerlukan penghitungan ulang manual orientasi sensor dan ukuran permukaan setiap kali perangkat dilipat, diputar, atau diubah ukurannya, CameraX secara otomatis menangani konfigurasi ulang sesi kamera selama pengubahan ukuran multi-window atau saat aplikasi berpindah ke layar yang terhubung, sehingga aliran pratinjau beradaptasi tanpa tersendat atau meregang.
Komponen seperti PreviewView secara cerdas mengelola rasio aspek dan
jenis skala di berbagai status, seperti perangkat foldable yang bertransisi dari
layar luar ke layar dalam, sehingga Anda dapat mendukung berbagai
hardware dengan satu penerapan yang konsisten, bukan kumpulan
rumit kasus ekstrem khusus perangkat.
Compose
Dengan Jetpack Compose, gunakan library androidx.camera:camera-compose
khusus. Library ini menyediakan composable CameraXViewfinder, yang
didesain khusus untuk menangani geometri kompleks dalam pengubahan ukuran, rotasi,
dan rasio aspek dalam siklus proses Compose.
Komponen CameraXViewfinder menghilangkan sumber error paling umum di aplikasi kamera:
- Transformasi koordinat otomatis — Salah satu bagian tersulit dalam membangun aplikasi kamera adalah memetakan ketukan pengguna (koordinat x, y di layar) ke sistem koordinat sensor kamera (0-1, 0-1 yang diputar) untuk fokus dan pengukuran.
CameraXViewfindermenyediakanCoordinateTransformeryang menangani perhitungan secara otomatis, bahkan saat jendela diubah ukurannya atau perangkat dilipat. - Perilaku tata letak yang benar — Tidak seperti
SurfaceViewatauTextureView,CameraXViewfinderberfungsi dengan benar dengan pengurutan z Compose. Anda dapat melapisi elemen UI (cincin fokus, kontrol) atau menerapkan pengubah (sudut bulat, animasi) tanpa artefak rendering. - Mengubah ukuran dan rasio aspek:
CameraXViewfindersecara internal menangani logika pangkas tengah vs. sesuaikan tengah, sehingga pratinjau tidak meregang saat jendela aplikasi diubah ukurannya menjadi rasio aspek nonstandar (misalnya, mode multi-aplikasi atau jendela desktop).
View
Pada aplikasi berbasis tampilan, gunakan PreviewView atau ViewFinderView.
Jika menggunakan SurfaceView atau TextureView secara langsung, Anda harus menghitung rasio aspek dan menerapkan matriks transformasi yang benar sendiri.
Solusi 3: Menangani orientasi dan pengubahan ukuran secara dinamis
Saat menggunakan API platform secara langsung, perhatikan rotasi perangkat, mulai ulang aktivitas, dan rasio aspek.
Berhenti menggunakan rotasi perangkat
Jangan hanya mengandalkan Display#getRotation() atau orientasi sensor fisik untuk menentukan tata letak UI Anda.
- Menggunakan metrik jendela — Tentukan tata letak Anda (UI lanskap vs. potret) dengan
membandingkan lebar dan tinggi jendela aplikasi menggunakan
WindowManager#getCurrentWindowMetrics(). - Abaikan orientasi alami — Aplikasi Anda mungkin berada di jendela berbentuk potret pada monitor lanskap. Orientasi perangkat tidak relevan dengan batas UI Anda.
Menghindari mulai ulang aktivitas
Perilaku Android default menghancurkan aktivitas aplikasi Anda saat terjadi perubahan konfigurasi (seperti pengubahan ukuran jendela). Untuk aplikasi kamera, hal ini akan muncul sebagai kedipan layar atau koneksi terputus selama panggilan video.
- Konfigurasi manifes — Deklarasikan perubahan konfigurasi dalam manifes Anda untuk menangani pengubahan ukuran tanpa memulai ulang.
- Pembaruan dinamis — Di
onConfigurationChanged(), perbarui parameter tata letak pratinjau kamera agar sesuai dengan ukuran jendela baru.
Rasio aspek dan pemangkasan
Masalah umum pada perangkat foldable dan jendela desktop adalah peregangan pratinjau, di mana feed kamera 4:3 dipaksakan ke jendela 16:9 atau 1:1.
- Jangan meregangkan — Jangan pernah memaksa buffer kamera agar sesuai dengan batas tampilan secara persis jika rasio aspek pratinjau dan jendela berbeda.
- Pangkas tengah (direkomendasikan): Menskalakan pratinjau untuk mengisi dimensi terpendek jendela dan memangkas kelebihannya. Hal ini memastikan subjek tetap tidak terdistorsi dan mengisi bingkai.
- Paskan ke tengah (alternatif): Jika menampilkan seluruh bidang pandang sangat penting (misalnya, memindai dokumen), tampilkan pratinjau dalam kotak surat di dalam jendela.
- Paskan ke tengah (alternatif): Jika menampilkan seluruh bidang pandang sangat penting (misalnya, memindai dokumen), tampilkan pratinjau dalam kotak surat di dalam jendela.
Bonus: Dukungan untuk pengalaman yang dioptimalkan untuk perangkat foldable
Perangkat foldable bukan hanya ponsel yang dapat ditekuk, tetapi juga menawarkan status hardware unik yang dapat meningkatkan kualitas pengambilan foto dan video pengguna secara mendasar. Daripada menganggap lipatan sebagai masalah yang harus dipecahkan, gunakan lipatan untuk membuat fitur yang tidak mungkin ada di perangkat non-lipat.
Mode di atas meja (pengambilan gambar handsfree)
Mode di atas meja memungkinkan pengguna melipat perangkat hingga setengahnya dan meletakkannya di atas permukaan untuk melakukan panggilan video yang lebih lama, fotografi selang waktu, dan fotografi malam dengan eksposur panjang.
Mode tampilan belakang (selfie berkualitas tinggi)
- Pada perangkat foldable, kamera belakang biasanya memiliki kualitas yang lebih tinggi daripada kamera yang menghadap pengguna. Mode tampilan belakang memungkinkan pengguna membentangkan perangkat dan membaliknya, menggunakan layar penutup kecil sebagai jendela bidik live untuk kamera belakang utama.
- Mode layar belakang memungkinkan selfie 50 MP+, foto grup ultra-wide, dan vlogging berkualitas tinggi tanpa membawa perlengkapan tambahan.
Mode layar ganda (pratinjau subjek)
- Mode layar ganda memungkinkan Anda menampilkan pratinjau kamera di kedua layar dalam dan luar secara bersamaan. Fitur ini sangat cocok untuk memotret orang: subjek foto dapat melihat diri mereka di layar luar dan menyesuaikan pose mereka saat Anda membingkai foto di layar dalam.
- Tidak seperti mode layar belakang (yang memindahkan seluruh aplikasi), mode layar ganda membuat jendela presentasi sekunder di layar luar.