【问题标题】:How to fix crash handling in android 10如何修复 android 10 中的崩溃处理
【发布时间】:2020-04-05 14:39:48
【问题描述】:

我有一个使用 Cardboard SDK 构建并导出为 Android 库的 Unity 场景。该库用于在 Android 应用上以纸板模式播放视频。它不是整个应用程序,而是其中的一部分。 android 应用程序的其余部分是使用 Kotlin 和 Java 构建的。

我已经实现了,所有功能都按预期工作,但是,退出场景会使 android 崩溃。

我们尝试了各种方法来清除玩家偏好,甚至在关闭场景之前清除内存。但是在android上它总是崩溃。我有两部带有 android 9 和 10 的 android 手机用于测试。

在 android 应用程序中,我已经做到了,一旦应用程序崩溃,我就会尝试恢复。我的崩溃是一些lateinit var 变量被破坏了。它们的值变为 null 并且恢复先前的活动会使它崩溃。因此,在我退出统一场景后,我将取消引用的变量加载回内存中,一切都会再次运行。

注意:我尝试过统一使用Application.Quit();,但它只是关闭了整个应用程序。另一方面,我只想关闭正在运行的场景

统一[我在android部分调用函数goBack来关闭应用]:

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 导致 Unity Main &gt;... 崩溃的原因

If you'd like to see the Unity Crash Log from LogCat in Android Studio

所以,既然应用程序仍在运行,我想,最好隐藏崩溃报告,让用户不知道这次崩溃,但仍然报告它。

我尝试将我的应用程序包含在 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 中完美运行,我也收到了错误报告。但是在安卓 10 的手机中,我只是得到了如上图的崩溃报告,没有报错。

我想知道为什么崩溃处理不起作用以及如何修复它?

【问题讨论】:

  • 为什么要投反对票?是不是我没有提供足够的细节?
  • 我认为也没有必要投反对票。不知道做这件事的人在想什么¯_(ツ)_/¯

标签: java android unity3d google-cardboard uncaught-exception


【解决方案1】:

我不会完成您来自的Activity,而只是打开一个新意图(在 UnityActivity 上)。当您结束此意图时,应用将返回上一个活动 Activity。 我以我的脚本为例:

public void sendJobToUnity(String fileName, boolean isNewJob){
    //creates a new job. It exists inside the JobSelector Activity
    isUnityLoaded = true;

    //this is what you are looking for part1
    Intent i = new Intent(JobSelector.this, MainUnityActivity.class); //same as (CurrentActivity.this, UnityActivity.this)

    //those are how I send some data across the app. just ignore it
    //i.putExtra("jobName", fileName);
    //i.putExtra("isNewJob",isNewJob);
    //i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    startActivityForResult(i, 1); //this is what you are looking for part2
}

为了关闭它,在 MainUnityActivity Activity 中,我有一个 Unity 发送到 Android 以 Unload Activity 的覆盖(不要完全退出它,因为您无法加载它如果你这样做,请再次)像这样:

@Override
protected void receiveJobAndUnloadUnity(String data){
    saveCurrentJob(data); //saves the job it receives from Unity
    mUnityPlayer.unload(); //this is what you are looking for part3
}

如果你想从 android 卸载 Unity,你可以将 "mUnityPlayer.unload();" 放在任何你想要的地方,前提是你已经按照我向你展示的方式启动了 Activity。 注意 "mUnityPlayer" 是一个默认的 Unity 变量,不能重命名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多