Как исправить обработку cra sh в android 10 - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть сценарий Unity, созданный с использованием Cardboard SDK и экспортированный в виде библиотеки для Android. Библиотека используется для воспроизведения видео в картонном режиме в приложении android. это не целое приложение, а часть в нем. Остальная часть приложения android построена с Kotlin и Java.

Я реализовал это, и все функции работают, как ожидалось, но при выходе из сцены вылетает android.

Мы пробовали различные способы очистки настроек игрока и даже очистки памяти перед закрытием сцены. Но на android он всегда падает. У меня есть два android телефона с android 9 и 10 для тестирования.

В приложении android я сделал так, что как только приложение вылетает, я пытаюсь восстановиться. Мой крэ sh состоит в том, что некоторые lateinit var переменные уничтожены. Их значение становится нулевым, и восстановление предыдущей активности приводит к сбою. Поэтому сразу после выхода из сцены единства я загружаю разыменованные переменные обратно в память, и все снова работает.

Примечание: я попытался использовать Application.Quit(); в единстве, но он просто закрывает все приложение , С другой стороны, я хочу закрыть только бегущую сцену

В единстве [я вызываю функцию goBack в android части, чтобы закрыть приложение]:

public void GoToHome()
    {
        Pause();
        Stop();
        Resources.UnloadUnusedAssets();
        PlayerPrefs.DeleteAll();
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("goBack");
    }

В приложении:

public void goBack()
    {
       UnityPlayer.currentActivity.finish();
       finish();
       loadDerereferencedVars();
    }

Это отлично работает на android 9. На другом телефоне с android 10, после закрытия сцены, приложение продолжает функционировать, но приходит сообщение

App keeps stopping

Когда я нажимаю закрыть приложение, приложение продолжает работать.

Я проверил журналы и есть null pointer dereference причина для крэ sh в Unity Main >...

Если вы хотите увидеть Unity Cra sh LogCat в LogCat в Android Studio

Итак, так как приложение все еще работает, я подумал, что было бы лучше просто спрятать отчет cra sh и просто позволить пользователю не знать об этом cra sh, но все же сообщать об этом.

Я попытался заключить свое приложение в Application и добавил метод для перехвата uncaughtException.

вот мой класс приложения:

public class MyApp extends Application {

    private static final String TAG = "MyAPP";

    @Override
    public void onCreate() {
        super.onCreate();
        Thread.setDefaultUncaughtExceptionHandler(
                new Thread.UncaughtExceptionHandler() {
                    @Override
                    public void uncaughtException (Thread thread, Throwable e) {
                        handleUncaughtException (thread, e);
                    }
                });
    }

    /**
     * Handles Uncaught Exceptions
     */
    private void handleUncaughtException (Thread thread, Throwable e) {

        // The following shows what I'd like, though it won't work like this.
        Toast.makeText(getApplicationContext(), "Looks like I am having a bad day!", Toast.LENGTH_LONG).show();
        Log.e("UncaughtException", "I found an exception!");
        // Add some code logic if needed based on your requirement
    }


}

Опять же, это прекрасно работает в Android 9 и я также получил сообщение об ошибке. Однако в телефоне с android 10 я просто получаю отчет cra sh, как на картинке выше, и об ошибке не сообщается.

Я хочу знать, почему не работает обработка cra sh, и как я могу это исправить?

...