Zmiejszenie złożoności kodu zwiazanego z Camera2 API

0

Około 85% crashlogów z aplikacji nad którą pracuję pochodzi z Camera2 API (ilościowo jest to mała liczba ~20 za zeszły miesiąc) m.in.

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.camera2.CameraDevice.createCaptureSession(java.util.List, android.hardware.camera2.CameraCaptureSession$StateCallback, android.os.Handler)' on a null object reference

java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.camera2.CaptureRequest$Builder android.hardware.camera2.CameraDevice.createCaptureRequest(int)' on a null object reference

java.lang.IllegalStateException: CameraDevice was already closed at android.hardware.camera2.impl.CameraDeviceImpl.checkIfCameraClosedOrInError(CameraDeviceImpl.java:2192) at android.hardware.camera2.impl.CameraDeviceImpl.submitCaptureRequest(CameraDeviceImpl.java:927) at android.hardware.camera2.impl.CameraDeviceImpl.setRepeatingRequest(CameraDeviceImpl.java:984)

Kod który obsługuje Camera2 API został przeze mnie skopiowany 1:1 z https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java . Zmiany jakie poczyniłem to odczepiłem tę logikę od fragmentu - Camera2 siedzi aktualnie we własnym komponencie.

Dlaczego został skopiowany? Jeśli wcześniej nie pracowałeś nad tym zagadnieniem wiec że walka ze złym ratio preview na samsungu 8 w wersji androida 7 gdy urządzenie zostało "uśpione" przez przycisk power (w między czasie cały ekran się obrócił) i do widoku kamery zostały zaaplikowane "złe" dane nie należy do najprostszych. Nie mówiąc już o skomplikowanym API.

Za co ten kod jest odpowiedzialny? Interesuje mnie wyłącznie podgląd kamery tzn chcę żeby w ~TextureView był widoczny widok z kamery. Żadnych wodotrysków, nie chcę zapisywać zdjęcia, nagrywać video ani aplikować filtrów - goły podgląd.

Chciałbym zrealizować dwie sprawy:

  1. Zmniejszyć (oczywiście najlepiej wyeliminować) liczbę crashy związanych z tym tematem.
  2. Zmniejszyć złożoność kodu który obsługuje kamerę -> 80 linii prywatnej metody która jest cała owinięta w pusty try-catch to nie jest jakość którą chciałbym utrzymać w kodzie. Wcześniej poczyniłem kroki żeby zmienić strukturę tego kodu - na papierze (a raczej w kodzie) wszystko wyglądało ok niestety testerki zaczęły zgłaszać błędy związane z kamerą, ja natomiast nie byłem wtedy zainteresowany obsługą kilku zagłębień callbacków.

Jeśli ktoś zna link do artykułu / biblioteki open source która jest czysto napisana będę wdzięczny.

1

Napisałem łącznie 3 aplikacje, które korzystały z własnej obsługi kamery. Jedna korzystała z Camera2 to w dosyć skomplikowanych zastosowaniach ze wsparciem dla dosyć nietypowych urządzeń. Szczerze nie mam dobrych porad poza tym, żeby powydzielać wszystko do jak najmniejszych klas i zadbać o odpowiednią synchronizację między otwieraniem i zwalnianiem zasobów. Polecam rzucać wyjątkami na lewo i prawo, w blokach catch i gdziekolwiek masz podejrzenie, że coś się może nie zgadzać, żeby jak najszybciej wywalić apkę i wyłapać jakiekolwiek błędy podczas testów. Da się to okiełznać tak, żeby działało bezproblemowo z większością telefonów (czasem z drobnymi hackami dla niektórych urządzeń). Zwłaszcza jeżeli zależy Ci tylko na podglądzie z kamery. Wiem, że nic konkretnego nie napisałem, ale jak wszyscy wiedzą API jest obrzydliwe i mało zrozumiałe, więc mogę życzyć tylko cierpliwości i powodzenia.

Huyen Tue Dao ma w miarę przyjazną prezentację, ale nie wiem na ile będzie ona pomocna i czy nie jest zbyt powierzchowna dla Ciebie.

0

Dzięki za odpowiedź.
Informacja: skopiowanie kodu ze stackoverlow teraz nie pomoże jest bardzo przydatna ;) . Furtkę związaną z przepisaniem / napisaniem tego modułu od zera zostawiłem sobie otwartą. Pierwsze podejście do tego zagadnienia było zrealizowane trochę jako "wishful thinking". Kolejne będzie zdecydowanie bardziej inżynierskie. Dzięki za video, nie znałem go.

Jeśli nic nowego się nie urodzi w tym temacie to jest szansa na pojawienie się YACamera library.

1 użytkowników online, w tym zalogowanych: 0, gości: 1