Eski ve yeni API sürümlerini kullanımdan kaldırma notları olmadan desteklemek için Android'in kamera veya kamera2 API'sini nasıl kullanabilirim?


135

Yeni camera2 API beni karıştırıyor. Cihazın kamerasını kullanan bir uygulama (Android API 10 - 21 için) geliştirmek istiyorum . Belirtildiği gibi burada , ben "Kamera" API kullanmalıdır.

Ancak, bildirimin kullanıcı özelliklerine "Kamera" API'sini (android.hardware.Camera) eklemeye çalıştığımda kullanım dışı olarak işaretlendi . Öte yandan, sadece Android API 21+ (Android 5 - Lollipop) ile uyumlu olduğu için "camera2" API (android.hardware.camera2) olarak değiştiremiyorum - Bunu da bağladım , ancak yalnızca 2 bağlantı.

Uygulamamın sadece Android'in eski sürümlerinde değil, aynı zamanda en yeni sürümlerinde de çalışmasını istiyorum ...

Yanıtlar:


152

Eski kamera API'sı kullanımdan kaldırılmış olarak işaretlenmiş olsa da, hala tamamen işlevseldir ve bir süre daha aynı kalacaktır (Play Store'daki neredeyse tüm kamera kullanan uygulamalar şu anda kullandığından).

Android Studio'nun kullanımdan kaldırılmasıyla ilgili şikayetlerini göz ardı etmeniz gerekir, ancak 21'den önceki Android sürümlerini desteklemek istiyorsanız eski API'yı kullanmanız gerekir.

API düzey 21'de, yeni API'yi ve yeni özelliklerini kesinlikle kullanabilirsiniz, ancak şu anda API'lar arasında geçiş yaparsanız uygulamanızda tamamen ayrı bir akış sürdürmeniz gerekir. Ne yazık ki, iki API, eski cihazlarda da yeni API gibi bir şey kullanmanıza izin verecek bir destek kitaplığı yazmanın zor olduğu bir dünya görüşüne yeterince farklıdır (burada kitaplık yeni API'dan eski API'ya eşleşmezse) API 21+).


1
İyi cevap. Yani API seviye 16 ve üstünü desteklemek istiyorsanız, şimdilik eski fotoğraf makinesine bağlı kalmak daha iyi, değil mi?
Loolooii

5
yani tek yol eğer deyimi ve android.os.Build.VERSION.SDK_INT kodu ayırmak için kullanmaktır?
hadi

Bir geliştirici için, yalnızca API 21 ve sonraki sürümlerini hedefliyorsanız, Camera2'yi kullanın, ancak eski desteğe ihtiyacınız varsa Camera? Ya da derleme sürümlerini tespit etmenizi ve farklı API'leri kullanarak 2 farklı yöntemi kodlamayı önerir misiniz?
john.weland

2
Uygulamanızın ne yaptığına bağlıdır. Kamera işlevselliği basit nokta ve çekim öğeleriyse ve eski API'ları hedeflemek istiyorsanız, eski Kamera API'sını kullanmanız yeterlidir. Ancak, sadece JPEG'leri alıp önizleme çizmekten başka bir şey yapmak istiyorsanız veya sadece yeni API'ları hedefliyorsanız, camera2 ile devam edin. (Sabit) ortada, kamera2'de süslü isteğe bağlı özellikler sunmak isteyen, ancak eski cihazlarda da çalışan uygulamalar vardır. Burada, her bir API için bir tane olmak üzere iki ayrı kod yolu oluşturmanız gerekir.
Eddy Talvala

21
Kamera API'sından vazgeçmek bir hataydı, bir Kamera gelişmiş API'sı (tam teşekküllü kamera uygulamaları gibi gelişmiş uygulamalar için) tanıtmış olmalıdırlar - aksi takdirde (fotoğrafların çoğunu sadece fotoğraf çekmek için kullanan uygulamaların 2 apis tutması gerekir. Google en azından kompakt bir kütüphane (her zamanki gibi) tanıtmış olmalıdır
Sudara

38

İhtiyacınız olan kameradan tüm yöntemleri bir arayüze koyun ve ardından böyle bir kamera örneği oluşturun

    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());
    }

Bu şekilde her şey bölünmüş olacak ve hayatınızı çok daha kolay hale getirecektir.

Tavsiye kelimesi - camera2 ile yaşam o kadar da iyi değil. Tedarikçiler hala saçma sapan uygulamalar yapıyorlar ve bu nedenle birçok koşul ve geçici çözüm eklemeniz gerekecek.

Örnek 1 - S6, flaşı desteklemediğini bildiriyor :) Örnek 2 - LG cihazı, desteklenen görüntü boyutlarının bir listesini geri bildiriyor - ancak bunların hepsi aslında desteklenmiyor !!


14
Bu doğru. Kamera 2 API aslında kamera cihazlarını üç kategoriye ayırır: LEGACY, LIMITED ve FULL. Kamera LEGACY olarak sınıflandırılmışsa, tüm camera2 API çağrıları kaputun altındaki camera1'e çevrilir, bu yüzden gerçekten zahmete değmez. Benim önerim, CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... eski API'yı aramak ve doğruysa seçmektir.
panonski

9

İstediğiniz API'yi desteklemek için aşağıdaki kodu kullanın. Api seviyelerine karşılık gelen uygun isimleri belirleyin. Örneğin, API 21, LOLLIPOP ve API 15, ICE_CREAM_SANDWICH_MR1'dir.

 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
 }

33
tam kamera uygulaması için pek pratik değildir. artı, şimdi iki kod yolu korumak zorunda. sürüm kontrolü android geliştirme kullanımı var, ama bu değil.
katzenhut

5
Bir kullanıcı Build.VERSION_CODES.LOLLIPOP_MR1 çalıştırıyorsa ne olur? Yoksa bunun üstünde bir şey mi? Sanırım ikinci çekiniz "başka ise (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
Ralph Pina

Canlarım, uygulamalarım 16 ve daha yeni API'larda çalışacaksa aynı apk camera2 ve eski api'de nasıl oluşturabilirim? Tatlar bu iş için iyi mi?
Mateus

Her iki apisi de uygulamak zorundasınız. Sadece bir arayüz ve kamera işlevselliğinin uygulandığı iki sınıf tutun. Kamerayı çalıştırmak için örneklerden birini oluşturmadan önce, yukarıda belirtilen yöntemi arayın, böylece hangi sınıfı ve işlevselliği arayacağınızı
öğrenebilir

3

Bununla birlikte, Google'ın önerdiği şey Camera2 Api> = 21'dir, ancak manuel ayarlarla ilgili sorununuz olabilir.

Otomatik Ayar Modu ile fotoğraf çekmek için uygulama uygulamasına ihtiyacınız olduğunda, iyi çalışır. Fakat! Manuel Ayar Modu uygulamasıyla uygulama oluşturmanız gerekiyorsa, API> = 21 olan cihazlar için öncelikle desteklenen DONANIM SEVİYESİ'ni kontrol etmeniz gerekir:

Kamerayı (Ön, Yüz) seçin, özelliklerini alın ve DONANIM SEVİYESİNİ kontrol edin.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

Kamera Özellikleri bir sonraki desteklenen seviyeleri temsil eder: LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

Yüksek bir seviyede, seviyeler:

LEGACY cihazları, eski Android cihazlar için geriye dönük uyumluluk modunda çalışır ve çok sınırlı özelliklere sahiptir.

SINIRLI cihazlar temel özellik kümesini temsil eder ve ayrıca FULL alt kümeleri olan ek yetenekler içerebilir.

TAM cihazlar ayrıca sensör, flaş, lens ve işlem sonrası ayarların kare başına manuel kontrolünü ve yüksek hızda görüntü yakalamayı destekler.

LEVEL_3 cihazları ayrıca YUV yeniden işleme ve RAW görüntü yakalamayı ve ek çıkış akışı yapılandırmalarını destekler.

Eğer amacımız ESKİ supprot seviyesini, sen gerektiğini eski Kamera Api kullanın .



0

Plz okuma bağlantısı Kamera Sürüm Desteği Onlar ....
Kamera API1
Android 5.0 yeni platform geliştirme Kamera API2 odaklanır gibi aşamalı olarak devam ediyor Android 5.0 kullanımdan kaldırıldı Kamera API1. Ancak, kullanımdan kaldırma süresi uzayacak ve Android sürümleri bir süre boyunca Kamera API1 uygulamalarını desteklemeye devam edecek. Özellikle, destek aşağıdakiler için devam eder:

  • Uygulamalar için Camera API1 arayüzleri. Camera API1'in üzerine inşa edilen kamera uygulamaları, daha önceki Android sürümlerini çalıştıran cihazlarda olduğu gibi çalışmalıdır.
  • Camera HAL sürümleri. HAL1.0 Kamera desteğini içerir.

  • -1

    En iyi seçeneğin iki etkinlik yaratmak olduğunu öğrendim. Mevcut cihaz API'sını kontrol etmek için genel yolu kullanın

    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);

    Bu şekilde kodu geri baktığınızda karışıklık bir sürü olması gerekmez. Ayrıldığı için kodun değiştirilmesi kolaydır.

    Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
    Licensed under cc by-sa 3.0 with attribution required.