2016-04-02 33 views
2

Eski android sürümleri için eski kamera API'sini ve API 23 ve üstü için yeni camera2/torch API'sini kullanan bir uygulama yazıyorum. Temel olarak aygıtın yeterince yeni bir Android sürümü çalıştırıyorsa bir kez belirledikten sonra uygulamaya göre uygulama arasında geçiş yapıyorum. Gingerbread üzerinde ben yakın bir kuvvet olsun çalıştıran üzerineEski ve daha yeni Android sürümleri için farklı API'ları nasıl işleyebilirim?

private static final int SDK_VERSION = Build.VERSION.SDK_INT; 

private boolean isSdkVersionGreaterThanOrEqualTo(final int sdk) { 
    return SDK_VERSION >= sdk; 
} 

if (marshmallowOrNewer) { //isSdkVersionGreaterThanOrEqualTo(23); 
          try { 
           cameraManager.setTorchMode(cameraManager.getCameraIdList()[0], true); 
          } catch (final CameraAccessException e) { 
           e.printStackTrace(); 
          } 
         } else { 
          cameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
          camera.setParameters(cameraParameters); 
          camera.startPreview(); 
         } 

: Bu aşağı kaynar ÖLÜMCÜL EXCEPTION:

toggleButton.setOnClickListener(new View.OnClickListener() { 

OnClickListener açılıyor: java.lang.VerifyError ana bu satırda Yukarıdaki kodu içeren ve bir API yönteminin bu Android sürümünde desteklenmediğini belirtir, bu da mantıklıdır, ancak aslında burada arama yapıyorum. Bu durumu nasıl düzgün kullanmalıyım, farklı Android sürümleri için farklı API'ler uyguluyorum veya bu doğrulamayı nasıl atlatabilirim?

stacktrace:

Uygulamama Camera2 işlevselliği eklerken bu sorunla karşılaştı
04-02 13:42:54.413 3815-3815/? E/AndroidRuntime: FATAL EXCEPTION: main 
               java.lang.VerifyError: t.t.t.MainActivity$1 
                at t.t.t.MainActivity.onCreate(MainActivity.java:61) 
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
                at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
                at android.os.Handler.dispatchMessage(Handler.java:99) 
                at android.os.Looper.loop(Looper.java:130) 
                at android.app.ActivityThread.main(ActivityThread.java:3835) 
                at java.lang.reflect.Method.invokeNative(Native Method) 
                at java.lang.reflect.Method.invoke(Method.java:507) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
                at dalvik.system.NativeStart.main(Native Method) 
+1

Lütfen yığın izlemeyi gönderin. – CommonsWare

+0

stacktrace'i ekledi. –

+1

Sorununuz bir yöntemi çağırmıyor.AFAIK, bazı arayüz veya 't.t.t.MainActivity $ 1' sınıfının üstündedir. * Emin * bu 't.t.t.MainActivity $ 1'' View.OnClickListener() 'dir? Çevrede başka isimsiz iç sınıflarınız var mı? 'View.OnClickListener', API Seviye 1'den beri etrafta dolaşıyor, bu nedenle 'VerifyError' kaynağının kaynağı görünmüyor. – CommonsWare

cevap

2

. Altta yatan mekanizma hakkında otoriter bir şekilde konuşamam çünkü deneme ve yanılma yoluyla çözdüm, ancak test sayesinde sorunun yalnızca Ice Cream Sandwich'ten önceki cihazlarda olduğunu gördüm, bundan sonra bunu yapmaktan kaçınmak mümkün. yaptığınız gibi SDK sürümü için-zaman testleri. ICS için ve daha sonra, asla desteklemediğiniz sürece, sınıfınızda desteklenmeyen bir API kullanmak uygun değildir, ancak daha önce desteklenmeyen bir API çağrısı kullanan bir sınıfı hiçbir zaman başlatmayacağınızdan emin olmanız gerekir. onu ara ya da yap.

  • bir Camera2Object sınıf (adını ne istersen o) oluştur kullandığınız Camera2 API işlevi çağırır:

    Ben bu yöntemle sorunu düzeltildi. Tüm diğer sınıflardan Lollipop + Camera2 sınıflarının tüm ithalatını kaldırın. Diğer sınıflarınızda bu Camera2Object sınıfına referans olması iyi bir şey.
  • Sadece API sınıfının> = 21 (Lollipop) veya durumunuzdaki Marshmallow olduğunu kontrol ettikten sonra bu sınıfın bir örneğini oluşturun.
  • Şu anda Camera2 işlevlerini bir API sürümünün içinde çağırıyor olduğunuz sınıfta, if deyiniz olup olmadığını kontrol edin, Camera2Object öğenizin boş olup olmadığını kontrol etmek için kodunuzu değiştirin ve eğer öyleyse, içinde bulunduğunuz işlevin işlevselliğini uygulayan bir yöntem çağırın. Beyan.

Sen biraz zeki olmak ve tüm Camera2 şeyler bu sınıfın içine gizlenmiş şekilde kodunuzu yeniden düzenlemek gerekebilir -, sen Camera2 ithalata bağımlı olmayan bir şey haline dönüş kodları vb çevirmek gerekebilir ve muhtemelen bu sınıf ve uygulamanızın geri kalanı arasındaki sınırda geri ve ileriye çevrilmiş olmanız yerine, Camera2 nesnelerine başvurular olarak ints veya Strings ifadeleri döndürün.

Sen Camera2 işlevlerini çağıran birden fazla sınıf sahip olabilir sürece API sürümü

Bu az 21. Bir 2.3.3 cihazda, ben yapabilirsiniz test edilir ise bunların hiçbiri örneklerini hiç gibi Gingerbread'ın önceki versiyonları için kefil olur. ICS ve sonrasında bunu yapmaya ihtiyacınız olmayacağını da garanti edemem.

+0

Whaaat bu oldukça garip. Yapmaya çalışacağım. –

+1

İnanın, yapamam. Teşekkürler, dostum, bu düzeltildi. –

+1

Vay, hızlısın! Kodumu bu şekilde yeniden kodlamak için bir öğleden sonra en iyi kısmını aldım. Yardım ettiğim için sevindim – samgak