如何使用GooglePlay Services Vision API Xamarin Android打开手电筒/手电筒

时间:2017-02-23 14:25:43

标签: android xamarin torch flashlight vision

过去几天,我一直试图使用GooglePlay Services Vision API(使用Visual Studio中的Nuget)实现相机的手电筒/手电筒功能,但没有成功。我注意到这个API的GitHub实现具有这样的功能,但只有Java用户可以使用。 我想知道是否有与C#Xamarin用户有关的任何内容。

此API上没有Camera对象,因此我无法更改激活手电筒所需的Camera参数。

我想确定该功能是否不可用,因此我不会在此上浪费更多时间。可能就是Xamarin开发人员没有注意到这个功能,他们可能在不久的将来。

更新

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/BarcodeCaptureActivity.java

在那里你可以看到,在第214行我们有这样的方法调用:

mCameraSource = builder.setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null).build();

SetFlashMode不是Nuget中CameraSource的方法,但它位于GitHub(开源版本)上。

2 个答案:

答案 0 :(得分:0)

基本上,您可以使用Xamarin.Android完成任何可以使用Android的操作。所有底层API区域都可用。

由于您已有Java代码,因此可以创建一个绑定项目,使您可以从Xamarin.Android项目中调用代码。这是一篇关于如何入门的好文章:Binding a Java Library

另一方面,我认为你不需要图书馆去做你想做的事。如果你只需要手电筒/手电筒功能,你只需要调整this answer的Java代码,使用C#在Xamarin.Android中工作。

答案 1 :(得分:0)

Xamarin Vision Library没有公开设置Flash模式的方法。

解决方法。 使用反射。您可以从CameraSouce获取Camera Object并添加flash参数,然后将更新的参数设置到摄像机。

应在创建surfaceview后调用

<强>代码

  public Camera getCameraObject (CameraSource _camSource)
        {
            Field [] cFields = _camSource.Class.GetDeclaredFields ();
            Camera _cam = null;
            try {
                foreach (Field item in cFields) {
                    if (item.Name.Equals ("zzbNN")) {
                        Console.WriteLine ("Camera");
                        item.Accessible = true;
                        try {
                            _cam = (Camera)item.Get (_camSource);
                        } catch (Exception e) {
                            Logger.LogException (this, e);
                        }
                    }
                }
            } catch (Exception e) {
                Logger.LogException (this, e);
            }
            return _cam;
        }

        public void setFlash (bool isEnable)
        {
            try {
                isTorch = !isEnable;
                var _cam = getCameraObject (mCameraSource);
                if (_cam == null) return;
                var _pareMeters = _cam.GetParameters ();
                var _listOfSuppo = _cam.GetParameters ().SupportedFlashModes;
                _pareMeters.FlashMode = isTorch ? _listOfSuppo [0] : _listOfSuppo [3];
                _cam.SetParameters (_pareMeters);
            } catch (Exception e) {
                Logger.LogException (this, e);
            }
        }