Android 4.1.2上的相机是黑色的Unity3D和Vuforia

时间:2016-08-09 18:16:36

标签: java android unity3d augmented-reality vuforia

我工作的公司正在构建一个带有vuforia(版本5.x)和Unity3D(版本5.3.5f1个人)集成的Android应用程序。

在最新的Android设备中,相机正在打开,但我们在三星Galaxy S2(4.1.2)等旧设备中遇到问题。当设备通过vuforia打开相机时,屏幕是黑色的,如果我们尝试拍照,图像显然也是黑色的。

我的活动只是实例化统一玩家,它就像下面的代码:

public class MainActivity extends AppCompatActivity {

protected UnityPlayer mUnityPlayer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy
    mUnityPlayer = new UnityPlayer(this);
    setContentView(mUnityPlayer);
    mUnityPlayer.requestFocus();
}

public void onImageSaved(final String path) {
    final Intent intent = new Intent(MainActivity.this, CameraPreviewActivity.class);
    final Bundle bundle = new Bundle();
    bundle.putString("IMAGE_PATH", path);
    intent.putExtras(bundle);
    startActivity(intent);
}

public void onImageSavedError(final String message) {
    UnityPlayer.currentActivity.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            Log.e("Teste", message);
        }
    });
}

// Quit Unity
@Override protected void onDestroy ()
{
    mUnityPlayer.quit();
    super.onDestroy();
}

// Pause Unity
@Override protected void onPause()
{
    super.onPause();
    mUnityPlayer.pause();
}

// Resume Unity
@Override protected void onResume()
{
    super.onResume();
    mUnityPlayer.resume();
}

// This ensures the layout will be correct.
@Override public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    mUnityPlayer.configurationChanged(newConfig);
}

// Notify Unity of the focus change.
@Override public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    mUnityPlayer.windowFocusChanged(hasFocus);
}

// For some reason the multiple keyevent type is not supported by the ndk.
// Force event injection by overriding dispatchKeyEvent().
@Override public boolean dispatchKeyEvent(KeyEvent event)
{
    if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
        return mUnityPlayer.injectEvent(event);
    return super.dispatchKeyEvent(event);
}

// Pass any events not handled by (unfocused) views straight to UnityPlayer
@Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }
@Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }
@Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }
/*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }

@Override
public void onBackPressed() {
    finish();
}

}

vuforia负责打开相机并开始跟踪图像目标,而unity3D将使用动画渲染3D图像并负责拍摄照片。

在统一项目中,我们开发了一个按钮来拍摄照片和一个将图像保存在android目录中的功能。它的脚本是用C#完成的,其实现如下:

IEnumerator TakeSnapshot()
{
    yield return new WaitForEndOfFrame();
    Texture2D snap = new Texture2D(Screen.width,Screen.height);
    Camera camera = Camera.current;

    if (rotation != null)
    {
        camera.transform.rotation = rotation.Value;
    }

    if (position != null)
    {
        camera.transform.position = position.Value;
    }

    camera.Render();
    RenderTexture.active = camera.targetTexture;
    snap.ReadPixels(new Rect(0,0,Screen.width,Screen.height),0,0);
    snap.Apply();
    RenderTexture.active = null;

    byte[] bytes = snap.EncodeToJPG();
    DestroyObject(snap);

    string path = Application.persistentDataPath + "/MyAppPath/";
    if(!System.IO.Directory.Exists(path)){
        System.IO.Directory.CreateDirectory(path);
    }

    string filename = fileName(Convert.ToInt32(snap.width), Convert.ToInt32(snap.height));
    path = path + filename;
    System.IO.File.WriteAllBytes(path, bytes);

    using (var actClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
    {
        var jo = actClass.GetStatic<AndroidJavaObject>("currentActivity");

        if (jo == null) {
            Debug.Log ("jo is null");
        } else {
            jo.Call("onImageSaved", path);
        }
    }
}

这篇文章的主要目标是尝试理解为什么相机在较旧的设备中是黑色的,因为它在较新的设备中工作正常。另外我想强调一下openGL可能不是问题,因为我已经使用sinogen 5.1在旧版设备(如三星Galaxy S2)中测试了应用程序。 正在导出的统一项目的当前openGL版本是openGL2。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

试试这段代码:

equals()