【问题标题】:Vuforia Unity to Android - QCAR has already been initializedVuforia Unity 到 Android - QCAR 已经初始化
【发布时间】:2014-11-02 09:12:08
【问题描述】:

我想知道如何解决“QCAR 已初始化”的问题。 假设我想创建使用在 Unity 中完成的 QCAR/Vuforia 的 Android 应用程序。 应用程序必须能够在活动之间遍历,包括用于 Vuforia 的活动。

让我们用 QCAR 来调用 Activity,QCARActivity.java

我知道QCAR只能初始化一次,所以当我们访问QCARActivity.java一次,它就能正确加载activity。

下面是QCARActivity的一段代码:

public class QCARActivity extends NativeActivity {
    protected UnityPlayer mUnityPlayer;
    protected QCARPlayerSharedActivity mQCARShared;        

    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);

        getWindow().takeSurface(null);
        setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
        getWindow().setFormat(PixelFormat.RGB_565);

        mUnityPlayer = new UnityPlayer(this);

        if (mUnityPlayer.getSettings().getBoolean("hide_status_bar", true))
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                  WindowManager.LayoutParams.FLAG_FULLSCREEN);

        final int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
        final boolean trueColor8888 = false;

        mQCARShared = new QCARPlayerSharedActivity();
        mQCARShared.onCreate(this, glesMode,
            new QCARPlayerSharedActivity.IUnityInitializer() {

                @Override
                public void InitializeUnity() {
                    mUnityPlayer.init(glesMode, trueColor8888);
                    View playerView = mUnityPlayer.getView();
                    setContentView(playerView);
                    playerView.requestFocus();
                }
            });
    }

  //Other methods such as onDestroy, onPause, onResume will also be implemented
}

但是当我们第二次调用这个活动时,它无法加载,并且会在 Logcat 中显示“QCAR 已被初始化”。

我们可以做些什么来标记 QCAR 已经初始化?

那么如果已经初始化了,如何再次打开UnityPlayer,不初始化QCAR并正确显示呢?

我希望有人能在这方面启发我。代码示例将不胜感激。 非常感谢。

注意:目前我只知道如何通过 Unity 创建 Vuforia 应用程序,我使用 export as Google Project 方法将其提取到 Eclipse 兼容的 java 项目中。我仍然不熟悉直接使用 Android 编程 Vuforia。

【问题讨论】:

    标签: java android unity3d vuforia


    【解决方案1】:

    我自己想办法。之前,我在QCARActivity.onDestroy() 中添加了代码mQCARShared.onDestroy(),如下面的代码所示。这应该会取消初始化任何 QCAR 资源并杀死它们。

    protected void onDestroy ()
    {
        mQCARShared.onDestroy();
        mUnityPlayer.quit();
        super.onDestroy();
    }
    

    但随后我在 QCARActivity 类中通过 Intent (startActivity(new Intent(GetApplicationContext(), MainActivity.class))) 回调我的其他 Activity,这是错误的做法。

    应该已经销毁 QCARActivity 的 onDestroy() 没有被调用。因此正确的方法是调用finish() 将其返回到上一个活动,该活动也将调用onDestroy()。通过这样做,我们可以回到 QCARActivity 类,它仍然能够初始化 QCAR。

    但是,当我们调用 finish() 时,mUnityPlayer.quit() 会被调用。然后突然发生了一个奇怪的行为。即使您打算返回上一个活动,您的应用程序也会立即退出。 这是因为在UnityPlayer.quit() 方法内部,它调用了:

    Process.killProcess(Process.myPid()); //This code will kill the process that the app is running.
    

    这可以通过在清单中添加 android:process 使具有 Unity/Vuforia 的 Activity 充当单个进程来解决,从而杀死 Activity 而不是整个应用程序。 (例如android:process="myProcessName")。

    资源: Errors managing the UnityPlayer lifecycle in a native android application

    希望这对任何人都有帮助。

    【讨论】:

    • 我 Alvin,我有类似的问题,但我在我的 Eclipse 项目中找不到任何 QCARActivity 文件。如果您能提供帮助,我将不胜感激。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多