Bagaimana cara menggunakan kamera Android atau API camera2 untuk mendukung versi API lama dan baru tanpa catatan penghinaan?

135

API camera2 baru membingungkan saya. Saya ingin mengembangkan aplikasi (untuk Android API 10 - 21) yang menggunakan kamera perangkat. Seperti yang dinyatakan di sini , saya harus menggunakan API "Kamera".

Namun, ketika saya mencoba untuk menambahkan "Camera" API (android.hardware.Camera) ke fitur pengguna manifes, itu ditandai sebagai usang . Di sisi lain, saya tidak dapat mengubahnya ke API "camera2" (android.hardware.camera2) karena hanya kompatibel dengan Android API 21+ (Android 5 - Lollipop) - Akan menautkannya juga, tetapi saya hanya dapat menambahkan 2 tautan.

Saya tidak hanya ingin aplikasi saya berjalan di Android versi lama, tetapi juga yang terbaru ...

Wah
sumber

Jawaban:

152

Meskipun API kamera lama ditandai sudah tidak digunakan lagi, itu masih berfungsi penuh, dan akan tetap seperti itu untuk sementara waktu (karena hampir semua aplikasi yang menggunakan kamera di Play Store menggunakannya saat ini).

Anda harus mengabaikan keluhan Android Studio tentang penghentiannya, tetapi jika Anda ingin mendukung versi Android lebih awal dari 21, Anda harus menggunakan API lama.

Pada API level 21, Anda tentu dapat menggunakan API baru dan fitur-fiturnya yang baru, tetapi saat ini Anda harus mempertahankan aliran yang sepenuhnya terpisah di aplikasi Anda jika Anda beralih di antara API. Sayangnya, kedua API memiliki pandangan dunia yang cukup berbeda sehingga sulit untuk menulis pustaka dukungan yang memungkinkan Anda menggunakan sesuatu seperti API baru pada perangkat yang lebih lama juga (di mana pustaka memetakan dari API baru ke API lama jika tidak di API 21+).

Eddy Talvala
sumber
1
Jawaban yang bagus. Jadi jika Anda ingin mendukung API level 16 ke atas, lebih baik tetap menggunakan kamera lama untuk saat ini, bukan?
Loolooii
5
jadi satu-satunya cara adalah menggunakan if statement dan android.os.Build.VERSION.SDK_INT untuk memisahkan kode?
hadi
Jadi untuk pengembang, jika Anda hanya menargetkan API 21 dan yang lebih baru, gunakan Camera2 tetapi jika Anda membutuhkan dukungan sebelumnya, gunakan Camera? Atau Anda akan merekomendasikan mendeteksi versi versi dan mengkode 2 metode yang berbeda menggunakan API yang berbeda?
john.weland
2
Itu tergantung pada apa yang aplikasi Anda lakukan. Jika fungsionalitas kamera adalah hal point-and-shoot yang mudah, dan Anda ingin menargetkan API lama, cukup gunakan API Kamera yang lama. Tetapi jika Anda ingin melakukan sesuatu yang lebih dari sekedar mengambil JPEG dan menggambar pratinjau, atau jika Anda hanya menargetkan API baru, gunakan camera2. Di tengah (sulit) adalah aplikasi yang ingin menawarkan fitur opsional yang mewah pada camera2, tetapi bekerja pada perangkat lama juga. Di sana, Anda harus membuat dua codepath terpisah, satu untuk setiap API.
Eddy Talvala
21
Mengecewakan API Kamera adalah kesalahan, mereka seharusnya memperkenalkan Camera advanced API (untuk aplikasi canggih seperti aplikasi kamera penuh) - jika tidak (sebagian besar) aplikasi yang menggunakan kamera hanya untuk mengambil foto harus mempertahankan 2 apis. Google setidaknya harus memperkenalkan perpustakaan kompak (seperti biasa)
Sudara
38

Masukkan semua metode dari kamera yang Anda butuhkan di antarmuka dan kemudian buat contoh kamera seperti ini

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Log.d(TAG, "camera2 selected");
        this.camera = new Camera2(getContext());
    } else {
        Log.d(TAG, "camera1 selected");
        this.camera = new Camera1(getContext());
    }

Dengan cara ini Anda akan memiliki segalanya berpisah dan itu akan membuat hidup Anda jauh lebih mudah.

Kata nasihat - hidup dengan camera2 tidak terlalu bagus. Vendor masih membuat implementasi omong kosong dan karenanya Anda harus menambahkan banyak kondisi dan solusi.

Contoh 1 - S6 melaporkan bahwa itu tidak mendukung flash :) Contoh 2 - Perangkat LG melaporkan kembali daftar ukuran gambar yang didukung - namun tidak semuanya benar-benar didukung !!

slott
sumber
14
Ini benar. Camera 2 API sebenarnya membagi perangkat kamera menjadi tiga kategori: LEGACY, LIMITED dan FULL. Jika kamera diklasifikasikan sebagai LEGACY maka semua panggilan API camera2 sedang diterjemahkan ke dalam camera1 di bawah tenda, jadi itu benar-benar tidak layak untuk diganggu. Saran saya adalah menelepon CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... dan memilih API lama jika itu benar.
panonski
9

Untuk mendukung api yang Anda inginkan, gunakan kode di bawah ini. Cukup tentukan nama yang sesuai tingkat api terkait. Misalnya, API 21 adalah LOLLIPOP, dan API 15 adalah ICE_CREAM_SANDWICH_MR1.

 if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)  
                                    && ((Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP))) {
           // your code here - is between 15-21

 } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           // your code here - is api 21
 }
pengguna0770
sumber
33
ini hampir tidak praktis untuk implementasi kamera penuh. ditambah, sekarang Anda harus memelihara dua codepath. pemeriksaan versi memang ada gunanya dalam pengembangan android, tapi ini bukan.
katzenhut
5
Apa yang terjadi jika pengguna menjalankan Build.VERSION_CODES.LOLLIPOP_MR1? Atau sesuatu di atas itu? Saya pikir cek kedua Anda harus "selain itu jika (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
Ralph Pina
Sayang, bagaimana saya bisa membangun di apk yang sama camera2 dan api lama jika aplikasi saya harus bekerja di 16 dan api yang lebih baru? Rasa enak untuk pekerjaan ini?
Mateus
Anda harus menerapkan kedua apis. Simpan saja sebuah antarmuka dan dua kelas, di mana fungsi kamera diterapkan. Sebelum membuat salah satu instance untuk menjalankan kamera, panggil metode yang disebutkan di atas, sehingga dapat mengetahui kelas dan fungsionalitas mana yang harus dihubungi
user0770
3

Meskipun, apa yang direkomendasikan Google menggunakan Camera2 Api> = 21, tetapi Anda bisa memiliki masalah dengan pengaturan manual.

Ketika Anda perlu menerapkan aplikasi untuk mengambil foto dengan Mode Pengaturan Otomatis, itu akan berfungsi dengan baik. Tapi! Jika perlu membuat aplikasi dengan penerapan Mode Pengaturan Manual, untuk perangkat yang memiliki API> = 21, pertama, perlu memeriksa TINGKAT KERAS HARDWARE yang didukung:

Pilih kamera (Depan, Wajah), dapatkan karakteristiknya dan periksa HARDWARE LEVEL.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

CameraCharacteristics mewakili level yang didukung berikutnya: LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

Pada level tinggi, levelnya adalah:

Perangkat LEGACY beroperasi dalam mode kompatibilitas ke belakang untuk perangkat Android yang lebih lama, dan memiliki kemampuan yang sangat terbatas.

Perangkat TERBATAS mewakili set fitur dasar, dan juga dapat mencakup kemampuan tambahan yang merupakan subset dari FULL.

Perangkat FULL juga mendukung kontrol manual per-frame sensor, lampu kilat, lensa dan pengaturan pasca-pemrosesan, dan pengambilan gambar dengan kecepatan tinggi.

Perangkat LEVEL_3 juga mendukung pemrosesan ulang YUV dan pengambilan gambar RAW, bersama dengan konfigurasi aliran output tambahan.

Jika Anda mendapat level supprot LEGACY , Anda harus menggunakan Camera Api lama .

Serj
sumber
1

Gunakan anotasi dukungan

    @TargetApi(21)

untuk menghindari memeriksa

Prudhvi Raj Kumar
sumber
1
Jadi, Anda tidak mendukung perangkat android sebelum 21!
Mina F. Beshay
0

Silakan baca tautan Dukungan Versi Kamera Mereka menyatakan bahwa ....
Camera API1
Android 5.0 Camera API1 sudah usang, yang terus dihapus karena pengembangan platform baru berfokus pada Camera API2. Namun, periode penghentian akan lama, dan rilis Android akan terus mendukung aplikasi Camera API1 selama beberapa waktu. Secara khusus, dukungan berlanjut untuk:

  • Antarmuka Camera API1 untuk aplikasi. Aplikasi kamera yang dibangun di atas Camera API1 harus berfungsi seperti pada perangkat yang menjalankan versi rilis Android sebelumnya.
  • Versi kamera HAL. Termasuk dukungan untuk Camera HAL1.0.
  • rajesh780
    sumber
    -1

    Saya menemukan opsi terbaik adalah membuat dua aktivitas. Gunakan cara umum untuk memeriksa API perangkat saat ini

    Intent i;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        i = new Intent(context,camera2.class)
    } else {
        i = new Intent(context,camera.class);
    }
    startActivity(i);

    Dengan cara ini saya tidak perlu banyak kebingungan ketika melihat kembali kode. Kode ini mudah dimodifikasi karena terpisah.

    teck wei
    sumber