我实际上正在尝试使用 Unity3d 开发一个 Android 应用程序(我别无选择 :p)。 我的问题是,我怎样才能检索 Android 相机源并打开手电筒。
我有以下代码来打开手电筒(它适用于“ native 访问”):
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 行,获取摄像头源的代码就可以工作。我认为这是关于并发的......
我有两个选择:使用“unity access”找到打开闪光灯的方法(谷歌滚动 4 小时后我没有答案)或使用“java access”获取摄像头馈送(相同 4小时的谷歌滚动)。
感谢您的回答!
最佳答案
如果您需要访问 WebCamTexture 的摄像头 Feed 以及为同一“捕获 session ”打开 Torch - 您必须获取 android 摄像头的实例并将其打开。
您可以使用像 Camera Capture Kit (https://www.assetstore.unity3d.com/en/#!/content/56673) 这样的东西来实现您想要的,因为它具有一种打开手电筒/闪光灯的方法作为 WebCamTexture 的扩展。
打开手电筒就像
webCamTexture.SetTorchEnabled( true );
(Camera Capture Kit 为 WebCamTexture 扩展了适用于 iOS/Android 的此类功能。)
这是一个 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();
此代码必须包含在 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");
}
关于android - 使用手电筒获取相机 Feed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30657247/