android - 使用手电筒获取相机 Feed

标签 android unity-game-engine concurrency camera flashlight

我实际上正在尝试使用 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/

相关文章:

java - 深层链接到另一个 fragment [ANDROID]

ios - 在 Unity 中为原生 IOS 应用程序提供 subview

c# - 我无法将游戏对象的位置放入 vector3 变量中

algorithm - 边界线在策略/RTS 游戏中如何运作?

c# - Java 自适应线程池的设计注意事项

java - Action 中的备用图标和标题

android - Google Play 服务没有 gps 图标

android - 如何绘制闭合曲线形状?

go - 并发 |协程 |语言 |缓冲阅读器

java - ConcurrentHashMap 上的迭代器