Hik*_*kki 5 java android unity-game-engine uncaught-exception google-cardboard
我有一个使用 Cardboard SDK 构建的 Unity 场景,并导出为 Android 库。该库用于在 Android 应用程序上以纸板模式播放视频。它不是整个应用程序,而是其中的一部分。Android 应用程序的其余部分是使用 Kotlin 和 Java 构建的。
我已经实现了,所有功能都按预期工作,但是退出场景会使 android 崩溃。
我们尝试了各种方法来清除玩家首选项,甚至在关闭场景之前清除内存。但在安卓上总是崩溃。我有两部 Android 手机(Android 9 和 10)用于测试。
在 Android 应用程序中,我已经做到了,一旦应用程序崩溃,我就会尝试恢复。我的崩溃是一些lateinit var
变量被破坏了。它们的值变为 null 并且恢复先前的活动会使其崩溃。因此,在退出 Unity 场景后,我将取消引用的变量加载回内存中,一切都会恢复正常。
注意:我尝试过使用
Application.Quit();
unity,但它只是关闭了整个应用程序。另一方面,我只想关闭跑步场景
在统一中[我调用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");
}
Run Code Online (Sandbox Code Playgroud)
在应用程序中:
public void goBack()
{
UnityPlayer.currentActivity.finish();
finish();
loadDerereferencedVars();
}
Run Code Online (Sandbox Code Playgroud)
这在 android 9 上完美运行。在另一部装有 android 10 的手机上,关闭场景后,应用程序继续运行,但是出现一条消息
当我单击关闭应用程序时,该应用程序继续工作。
我检查了日志,null pointer dereference
崩溃的原因是Unity Main >...
如果您想在 Android Studio 中查看来自 LogCat 的 Unity 崩溃日志
因此,由于应用程序仍在运行,我认为最好隐藏崩溃报告,让用户不知道此崩溃,但仍然报告它。
我尝试将我的应用程序封装起来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
}
}
Run Code Online (Sandbox Code Playgroud)
同样,这在 Android 9 中完美运行,我也收到了错误报告。然而,在使用 Android 10 的手机中,我只收到如上图所示的崩溃报告,并且没有报告任何错误。
我想知道为什么崩溃处理不起作用以及如何修复它?
小智 0
我不会完成您来自的 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
}
Run Code Online (Sandbox Code Playgroud)
为了关闭它,在MainUnityActivity Activity 中,我有一个 Unity 发送到 Android 的覆盖,以便卸载该 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
}
Run Code Online (Sandbox Code Playgroud)
如果你想从 Android 卸载 Unity,你可以输入“mUnityPlayer.unload();” 只要您按照我向您展示的方式开始活动,就可以在任何您想要的地方进行。请注意,“mUnityPlayer”是默认的 Unity 变量,无法重命名
归档时间: |
|
查看次数: |
2696 次 |
最近记录: |