2016-08-09 1 views
0

Die Firma, die ich arbeite, baut eine Android-Anwendung mit vuforia (Version 5.x) und Unity3D (Version 5.3.5f1 Personal) Integration.Kamera ist schwarz auf Android 4.1.2 mit Unity3D und Vuforia

In den neuesten Android-Geräten ist die Kamera in Ordnung, aber wir haben Probleme mit älteren Geräten wie dem Samsung Galaxy S2 (4.1.2). Wenn das Gerät die Kamera über Vuforia öffnet, ist der Bildschirm schwarz und wenn wir versuchen, ein Bild aufzunehmen, ist das Bild natürlich auch schwarz.

Meine Tätigkeit ist Instanziierung nur die Einheit-Spieler und es ist wie Code unten:

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(); 
} 

}

Die vuforia ist verantwortlich für die Kamera zu öffnen und starten die Bild Ziele Tracking während unity3d eine machen wird 3D-Bild mit Animation und verantwortlich für das Fotografieren.

In unity-Projekt haben wir eine Schaltfläche entwickelt, um ein Bild und eine Funktion zu speichern, die das Bild in einem Android-Verzeichnis speichern wird. Sein ist Skript wurde in C# getan und ihre Umsetzung ist wie folgt vor:

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); 
     } 
    } 
} 

Das Hauptziel dieses Beitrags ist versuchen, zu verstehen, warum die Kamera nur in älteren Geräten schwarz ist, da es in neueren fein gearbeitet. Ich möchte auch hervorheben, dass openGL kein Problem darstellt, da ich die Anwendung bereits in älteren Geräten wie Samsung Galaxy S2 mit sinogen 5.1 getestet habe. Die aktuelle openGL-Version, die das Unity-Projekt exportiert, ist openGL2. Vielen Dank im Voraus.

Antwort

1

Versuchen Sie diesen Code:

public string deviceName; 
WebCamTexture wct; 
void Start() 
{ 
    WebCamDevice[] devices = WebCamTexture.devices; 
    deviceName = devices[0].name; 
    wct = new WebCamTexture(deviceName, 400, 300, 12); 
    GetComponent<Renderer>().material.mainTexture = wct; 
    wct.Play(); 
} 
+0

Du hast Recht. Das Hauptproblem ist das C# -Skript und betrifft ältere Geräte. Wenn ich meine Methode Start() auf die von Ihnen vorgeschlagene Methode änderte, wurde mein Problem erkannt. – user2475117

Verwandte Themen