我实际上是在尝试使用Unity3d开发Android应用程序(我别无选择:p)。 我的问题是,如何检索Android相机Feed并打开手电筒。
我有以下代码打开闪光灯(它适用于"原生访问"):
AndroidJavaObject cameraParameters = this.camera.Call<AndroidJavaObject>("getParameters");
cameraParameters.Call("setFlashMode", "torch");
this.camera.Call("setParameters", cameraParameters);
this.camera.Call("startPreview");
我有以下代码来获取相机(它与&#34;单位访问&#34;一起使用):
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行,获取摄像头的代码可以正常工作。我认为这是关于并发......
我有两个选择:找到一种方法来打开闪光灯使用&#34;统一访问&#34; (谷歌滚动4小时后我没有答案)或使用&#34; java访问&#34;获得相机输入(相同的4小时谷歌滚动)。
感谢您的回答!
答案 0 :(得分:1)
如果您需要同时访问WebCamTexture的摄像头Feed以及为同一个“捕获会话”打开Torch - 您必须获取Android摄像头的实例并将其打开。
您可以使用Camera Capture Kit(https://www.assetstore.unity3d.com/en/#!/content/56673)之类的东西来实现您想要的效果,因为它具有打开Torch /闪光灯作为WebCamTexture扩展的方法。
打开火炬就像是
webCamTexture.SetTorchEnabled( true );
(Camera Capture Kit扩展了WebCamTexture,具有iOS / Android功能。)
这是Java代码(来自AndroidPlugin.zip)的一个示例,如果您想自己添加像SetTorchEnabled(true)这样的东西,可以使用它来定位和返回Unity Camera referance。
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();
此代码必须包含在Unity的Android插件中,或者在基于C#的插件中重写为“Unity Java c#插件代码”。
这是启用Torch的代码。
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");
}