Сбой GLSurfaceView при повороте устройства / изменении ориентации - NullPointerException - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть GLSurfaceView, который предварительно просматривает камеру и прекрасно работает в портретной ориентации. Я начал пытаться реализовать запись видео в альбомной ориентации, но получаю странную ошибку при изменении ориентации.

Я не переопределяю метод OnConfigurationChanged, и в моем манифесте не настроено android:configChanges="screenSize|orientation" Тем не менее, я добился той же ошибки, когда пытался обрабатывать изменение ориентации также и таким образом. Для макета у меня есть как портретная, так и альбомная версия (ландшафт в папке layout-land). Моя причина для этого заключается в том, что онлайн-исследование показало, что GLSurfaceView должен уметь обрабатывать поворот экрана.

Основные вопросы:

  1. Какая самая распространенная причина вышеуказанной ошибки?
  2. Является ли это правильным подходом для обработки изменений ориентации экрана с помощью GLSurface View?
  3. Если нет, что это?

Ошибка:

2020-04-26 18:02:24.559 6197-6197/XXX.XXX E/AndroidRuntime: FATAL EXCEPTION: main
Process: XXX.XXX, PID: 6197
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.opengl.GLSurfaceView$GLThread.surfaceCreated()' on a null object reference
    at android.opengl.GLSurfaceView.surfaceCreated(GLSurfaceView.java:557)
    at android.view.SurfaceView.updateWindow(SurfaceView.java:805)
    at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:210)
    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2809)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1663)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7546)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:916)
    at android.view.Choreographer.doCallbacks(Choreographer.java:718)
    at android.view.Choreographer.doFrame(Choreographer.java:650)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:902)
    at android.os.Handler.handleCallback(Handler.java:836)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:232)
    at android.app.ActivityThread.main(ActivityThread.java:6802)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1103)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

Макет

<?xml version="1.0" encoding="utf-8"?>

<!-- Root View -->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainActivityLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:clipChildren="false"
android:fitsSystemWindows="true"
tools:context="XXX.XXX.MainActivity">

<!-- AspectFrameLayout that contains the GLSurfaceView -->
<XXX.XXX.AspectFrameLayout
    android:id="@+id/cameraPreview_afl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignStart="@+id/libraryButton"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"
    android:layout_below="@+id/libraryButton"
    android:layout_centerInParent="true">

    <!-- GLSurfaceView displaying camera preview -->
    <android.opengl.GLSurfaceView
        android:id="@+id/cameraPreview_surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:clickable="true"
        android:focusable="true"/>

</XXX.XXX.AspectFrameLayout>


<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainOverlay"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:clipChildren="false"
    android:fitsSystemWindows="true"
    tools:context="XXX.XXX.MainActivity">

<!-- Buttons go here to appear over the preview -->

</androidx.constraintlayout.widget.ConstraintLayout>

Метод создания

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera_capture);
    ...
}
...