2015-06-05 146 views
2

我實際上試圖開發一個使用Unity3d的Android應用程序(我沒有選擇:p)。 我的問題是,我如何檢索Android相機飼料,並打開手電筒。獲取相機與手電筒飼料

我有下面的代碼以打開閃光燈(它的工作原理與「本地訪問」):

AndroidJavaObject cameraParameters = this.camera.Call<AndroidJavaObject>("getParameters"); 
cameraParameters.Call("setFlashMode", "torch"); 
this.camera.Call("setParameters", cameraParameters); 
this.camera.Call("startPreview"); 

和我有下面的代碼讓相機飼料(其工作原理與「團結訪問「):

var deviceName = WebCamTexture.devices[0].name; 
webcamTexture = new WebCamTexture(deviceName, 1280, 720, 30); 
webcamTexture.Play(); 
data = new Color32[webcamTexture.width * webcamTexture.height]; 
webcamTexture.GetPixels32 (data); 
Debug.Log (data[383650].ToString()); 

但是,如果我使用前4行打開手電筒,接下來的6行不起作用。如果我刪除前4行,獲取相機供稿的代碼就可以工作。我認爲這是關於併發...

我有兩種選擇:找到一種方法來打開閃光使用「統一訪問」(谷歌滾動4小時後,我沒有答案)或使用「Java訪問「來獲取相機Feed(谷歌滾動4小時)。

謝謝你的回答!

回答

1

如果您需要訪問WebCamTexture的攝像頭Feed以及爲相同的「捕捉會話」打開Torch,則必須獲取Android攝像頭的實例並將其打開。

您可以使用像Camera Capture Kit(https://www.assetstore.unity3d.com/en/#!/content/56673)這樣的東西來達到您想要的效果,因爲它具有打開Torch /閃光燈作爲WebCamTexture擴展的方式。

打開火炬將像

webCamTexture.SetTorchEnabled(true); 

(攝像機捕獲試劑盒擴展了適用於iOS/Android的這種功能WebCamTexture。)

這是Java代碼的例子(從AndroidPlugin .zip),如果您想自己添加諸如SetTorchEnabled(true)之類的東西,就可以找到並返回Unity Camera參考。

Class clsPlayer = Class.forName("com.unity3d.player.UnityPlayer"); 
     Field fCurrentActivity = clsPlayer.getDeclaredField("currentActivity"); 
     fCurrentActivity.setAccessible(true); 
     com.unity3d.player.UnityPlayerActivity currentActivity = (com.unity3d.player.UnityPlayerActivity)fCurrentActivity.get(null); 
     ret.playerActivity = currentActivity; 

     Field fPlayer = currentActivity.getClass().getDeclaredField("mUnityPlayer"); 
     fPlayer.setAccessible(true); 
     com.unity3d.player.UnityPlayer player = (com.unity3d.player.UnityPlayer)fPlayer.get(currentActivity); 
     ret.player = player; 

     Field f = player.getClass().getDeclaredField("y"); 
     f.setAccessible(true); 
     java.util.ArrayList cameraArrays = (java.util.ArrayList)f.get(player); 
     int sz = cameraArrays.size(); 

該代碼必須被包括在Android插件用於統一或重寫爲在C#基於插件「統一的Java C#插件代碼」。

這是啓用火炬的代碼。

static public void UnityCamera_SetTorchEnabledImpl(boolean value) { 
    ResolveObjectsResult ret = UnityCaptureResolveObjects(); 
    Camera.Parameters params = ret.camera.getParameters(); 

    boolean torchSupported = false; 
    if(params.getSupportedFlashModes()!=null && params.getSupportedFlashModes().contains(android.hardware.Camera.Parameters.FLASH_MODE_TORCH)) { 
     if(verbose)Log.d("Unity","CameraCaptureKit: FLASH_MODE_TORCH supported."); 
     torchSupported = true; 
    } 

    // Torh.. 
    if(torchSupported == true) { 
     if(value == true) { 
      if(verbose)Log.d("Unity","CameraCaptureKit: turning torch on"); 
      params.setFlashMode(android.hardware.Camera.Parameters.FLASH_MODE_TORCH); 
      ret.camera.setParameters(params); 
     } else { 
      if(verbose)Log.d("Unity","CameraCaptureKit: turning torch off"); 
      params.setFlashMode(android.hardware.Camera.Parameters.FLASH_MODE_OFF); 
      ret.camera.setParameters(params); 
     } 
    } else { 
     Log.d("Unity", "CameraCaptureKit: Torch not supported"); 
     //Log.d("Unity", "CameraCaptureKit: Applying Camera parameters"); 
    } 

    //Log.d("Unity", "CameraCaptureKit: Applying Camera parameters"); 
}