Vuforia Unity to Android - QCAR已经初始化

时间:2014-09-09 03:33:43

标签: java android unity3d vuforia

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

让我们用QCAR,QCARActivity.java

调用Activity

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

以下是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作为Google Project方法将其解压缩到Eclipse兼容的java项目。我还不熟悉直接用Android编程Vuforia。

1 个答案:

答案 0 :(得分:0)

我自己弄清楚了。以前,我在mQCARShared.onDestroy()中添加了代码QCARActivity.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.

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

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

希望这可以帮助那里的任何人。