jika android.hardware.Camera
sudah tidak digunakan lagi dan Anda tidak dapat menggunakan variabel Camera
, lalu apa alternatifnya?
android
android-camera
android-hardware
raja121
sumber
sumber
android.hardware.camera2
Jawaban:
Dokumentasi API
Menurut panduan pengembang Android untuk
android.hardware.Camera
, mereka menyatakan:Pada halaman informasi tentang
android.hardware.camera2
, (ditautkan di atas), disebutkan:Masalah
Saat Anda memeriksa dokumentasi itu, Anda akan menemukan bahwa penerapan 2 Camera API ini sangat berbeda.
Misalnya mengaktifkan orientasi kamera
android.hardware.camera
Melawan
android.hardware.camera2
Ini menyulitkan untuk beralih dari satu ke yang lain dan menulis kode yang dapat menangani kedua implementasi.
Perhatikan bahwa dalam contoh kode tunggal ini saya sudah harus mengatasi fakta bahwa API kamera lama bekerja dengan
int
primitif untuk ID kamera sementara yang baru bekerja denganString
objek. Untuk contoh ini saya dengan cepat memperbaikinya dengan menggunakan int sebagai indeks di API baru. Jika kamera dikembalikan tidak selalu dalam urutan yang sama, ini sudah menyebabkan masalah. Pendekatan alternatif adalah bekerja dengan objek String dan representasi String dari cameraID int lama yang mungkin lebih aman.Satu lagi di sekitar
Sekarang untuk mengatasi perbedaan besar ini, Anda dapat mengimplementasikan antarmuka terlebih dahulu dan mereferensikan antarmuka itu dalam kode Anda.
Di sini saya akan membuat daftar beberapa kode untuk antarmuka itu dan 2 implementasi. Anda dapat membatasi penerapan pada apa yang sebenarnya Anda gunakan dari API kamera untuk membatasi jumlah pekerjaan.
Di bagian selanjutnya saya akan menjelaskan dengan cepat cara memuat satu atau lainnya.
Antarmuka membungkus semua yang Anda butuhkan, untuk membatasi contoh ini saya hanya memiliki 2 metode di sini.
Sekarang miliki kelas untuk api perangkat keras kamera lama:
Dan satu lagi untuk api perangkat keras baru:
Memuat API yang tepat
Sekarang untuk memuat salah satu
CameraOld
atauCameraNew
kelas Anda, Anda harus memeriksa level API karenaCameraNew
hanya tersedia dari api level 21.Jika Anda sudah menyiapkan injeksi dependensi, Anda dapat melakukannya di modul Anda saat menyediakan
CameraSupport
implementasi. Contoh:Jika Anda tidak menggunakan DI, Anda dapat membuat utilitas atau menggunakan pola Pabrik untuk membuat yang tepat. Bagian penting adalah bahwa level API diperiksa.
sumber
@SuppressWarnings
di QA stackoverflow.com/questions/7397996/…Menghadapi masalah yang sama , mendukung perangkat lama melalui API kamera yang sudah tidak digunakan lagi dan membutuhkan API Camera2 baru untuk perangkat saat ini dan untuk masa mendatang; Saya mengalami masalah yang sama - dan belum menemukan perpustakaan pihak ke-3 yang menjembatani 2 API, kemungkinan karena keduanya sangat berbeda, saya beralih ke kepala sekolah OOP dasar .
Kedua API tersebut sangat berbeda sehingga mempertukarkannya menjadi masalah untuk objek klien yang mengharapkan antarmuka yang disajikan dalam API lama. API baru memiliki objek berbeda dengan metode berbeda, dibangun menggunakan arsitektur berbeda. Punya cinta untuk Google, tapi ragnabbit! itu membuat frustrasi.
Jadi saya membuat antarmuka yang berfokus hanya pada fungsionalitas kamera yang dibutuhkan aplikasi saya, dan membuat pembungkus sederhana untuk kedua API yang mengimplementasikan antarmuka itu. Dengan begitu, aktivitas kamera saya tidak harus peduli pada platform mana yang dijalankan ...
Saya juga menyiapkan Singleton untuk mengelola API; memberi contoh pembungkus API lama dengan antarmuka saya untuk perangkat OS Android lama, dan kelas pembungkus API baru untuk perangkat baru yang menggunakan API baru. Singleton memiliki kode tipikal untuk mendapatkan level API dan kemudian membuat instance objek yang benar.
Antarmuka yang sama digunakan oleh kedua kelas pembungkus , jadi tidak masalah jika Aplikasi berjalan di Jellybean atau Marshmallow - selama antarmuka menyediakan apa yang dibutuhkan aplikasi saya dari API Kamera, menggunakan tanda tangan metode yang sama; kamera berjalan di Aplikasi dengan cara yang sama untuk versi Android yang lebih baru dan lebih lama.
Singleton juga dapat melakukan beberapa hal terkait yang tidak terkait dengan API - seperti mendeteksi bahwa memang ada kamera di perangkat, dan menyimpan ke perpustakaan media.
Saya harap idenya membantu Anda.
sumber
public interface AllCameraInterface { void open(); boolean setDirection(); Bitmap preview(); Bitmap takePhoto(); void close(); }
public interface AllCameraInterface { void open(); Bitmap takePhoto(); void close(); etc... }
public class NCamera implements AllCameraInterface...
public class OCamera implements AllCameraInterface...
public class AllCamera { private static AllCamera ourInstance = new AllCamera(); public static AllCamera getInstance() {...} private AllCameraInterface camera; private AllCamera() { if (android.os.Build.VERSION.SDK_INT <= 20) { camera = new OCamera(); } else { camera = new NCamera(); } }
Kemudian metode untuk mengembalikannya ...camera2
? Saya benar-benar bingung ... Saya hanya perluenableAutofocus
metode untuk membuka kamera dan mengatur fokusnya: stackoverflow.com/questions/19076316/…Sekarang kita harus menggunakan android.hardware.camera2 karena android.hardware.Camera sudah tidak digunakan lagi yang hanya akan berfungsi pada API> 23 FlashLight
sumber
Jawaban yang diberikan di sini karena api kamera yang digunakan salah. Atau lebih baik mengatakan mereka tidak cukup.
Beberapa ponsel (misalnya Samsung Galaxy S6) mungkin memiliki api di atas level 21 tetapi mungkin masih tidak mendukung api Camera2.
Kelas CameraManager di Camera2Api memiliki metode untuk membaca karakteristik kamera. Anda harus memeriksa apakah perangkat cerdas perangkat keras mendukung Camera2 Api atau tidak.
Tetapi ada lebih banyak masalah yang harus ditangani jika Anda benar-benar ingin membuatnya berfungsi untuk aplikasi yang serius: Seperti, opsi flash otomatis mungkin tidak berfungsi untuk beberapa perangkat atau tingkat baterai ponsel dapat membuat RuntimeException pada Kamera atau ponsel dapat mengembalikan yang tidak valid id kamera dan lain-lain
Jadi pendekatan terbaik adalah memiliki mekanisme fallback karena untuk beberapa alasan Camera2 gagal memulai, Anda dapat mencoba Camera1 dan jika gagal juga Anda dapat melakukan panggilan ke Android untuk membuka Kamera default untuk Anda.
sumber
sumber