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:
- Zmniejszyć (oczywiście najlepiej wyeliminować) liczbę crashy związanych z tym tematem.
- 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.