У меня есть сценарий 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, после закрытия сцены, приложение продолжает функционировать, но приходит сообщение
Когда я нажимаю закрыть приложение, приложение продолжает работать.
Я проверил журналы и есть 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, и как я могу это исправить?