在Xamarin.Forms(Xamarin.Android)项目中使用手电筒/火炬的困难

时间:2017-03-17 20:33:21

标签: xamarin xamarin.android android-camera2

问题

尝试使用Xamarin.Forms(Xamarin.Android项目)应用在Android设备上启用手电筒/手电筒时出现错误和异常。

请参阅以下代码'对提到的错误和例外的评论:

        // Get CameraService - This works fine and gets the CameraService
        CameraManager CamMgr = (CameraManager) Application.Context.GetSystemService(Context.CameraService); 


        // Get Cameras - This Returns 0 strings, eg. NULL, it should return id 0 and 1 for respectively back and front camera

        string[] CamIdList = CamMgr.GetCameraIdList();


        // Turn ON Camera Torch(Flashlight) on camera id 0 - This results in the exception: Unhandled Exception: Java.Lang.NoSuchMethodError: no method with name='setTorchMode' signature='(Ljava/lang/String;Z)V' in class Landroid/hardware/camera2/CameraManager;

        CamMgr.SetTorchMode("0", true);


        // Turn ON Camera Torch(Flashlight) on camera id 1 - This results in the exception: Unhandled Exception: Java.Lang.NoSuchMethodError: no method with name='setTorchMode' signature='(Ljava/lang/String;Z)V' in class Landroid/hardware/camera2/CameraManager;
        CamMgr.SetTorchMode("1", true);

Android Manifest权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature android:name="android.hardware.camera.flash" />
    <application android:label="Lommelygte.Android"></application>
</manifest>

平台和开发环境

我使用Visual Studio Community 2017 15.0.0-RTW + 26228.4版本作为IDE。

我正在使用Android命名空间(Xamarin程序集):Android.Hardware.Camera2来使用Flashlight功能。

我的Xamarin.Forms项目正在使用PCL(可移植类库)来共享代码。

我没有使用Xamarin.Forms预发布nuget包或库。

我正在使用Xamarin.Forms(Xamarin.Android项目)

我正在使用Device Samsung Galaxy Note 2 LTE(GT7105) - Android 4.4.2(Kitkat) - API Level 19(具有相机闪光灯功能)来调试应用程序。

我试图解决问题:

  • 已安装的Android API 19 SDK
  • 清理项目,然后清除解决方案,然后重建解决方案
  • 检查了新的Xamarin.Forms稳定版本
  • 尝试使用已弃用的API 21名称空间+类代替flash:Android.Hardware.Camera.Open();
  • 研究Xamarin文档
  • 研究Stackoverflow帖子
  • 研究了各种博客和其他地方
  • 将目标框架更改为我的手机支持的确切API 19:4.4.2(kitkat)

  • 研究了Java中的实现,以概述它本身是如何完成的。

  • 查看了Android.Hardware.Camera2命名空间的定义并验证了SetTorchMode方法存在,如此处所示(我很抱歉大部分代码没有在代码块中正确显示,有一些麻烦的是):

    Assembly Mono.Android,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = 84e04ff9cfb79065

    使用System; 使用Android.OS; 使用Android.Runtime; 使用Java.Interop; 使用Java.Lang;

    命名空间Android.Hardware.Camera2 {     [注册(&#34; android / hardware / camera2 / CameraManager&#34;,DoNotGenerateAcw = true,ApiSince = 21)]     public sealed class CameraManager:Java.Lang.Object     {         公开覆盖JniPeerMembers JniPeerMembers {get; }         protected override IntPtr ThresholdClass {get; }         protected override类型ThresholdType {get; }

        [Register("getCameraCharacteristics", "(Ljava/lang/String;)Landroid/hardware/camera2/CameraCharacteristics;", "")]
        public CameraCharacteristics GetCameraCharacteristics(string cameraId);
        [Register("getCameraIdList", "()[Ljava/lang/String;", "")]
        public string[] GetCameraIdList();
        [Register("registerAvailabilityCallback", "(Landroid/hardware/camera2/CameraManager$AvailabilityCallback;Landroid/os/Handler;)V", "")]
        public void RegisterAvailabilityCallback(AvailabilityCallback callback, Handler handler);
    
        [Register("setTorchMode", "(Ljava/lang/String;Z)V", "", ApiSince = 23)]
        public void SetTorchMode(string cameraId, bool enabled);
    

我还没做过什么

...

假设

我怀疑处理Android.Hardware.Camera2的Xamarin程序集没有正确地与命名空间的java实现的所有方法接口,特别是Class:Camera,Method:setTorchMode。

但是我找不到可以解决问题的新的稳定Xamarin版本。

我还怀疑,因为定义说API自23以来代码在运行时在我的设备上运行,因为它不支持API 23并且定义似乎需要它,所以我该如何解决这个? 这是所述方法定义的确切寄存器:  [注册(&#34; setTorchMode&#34;,&#34;(Ljava / lang / String; Z)V&#34;,&#34;&#34;, ApiSince = 23 ) ]

我该如何解决这个问题?

您是否需要更多信息来帮助我找出问题?

1 个答案:

答案 0 :(得分:2)

您的手机 API 19 CameraManager 中添加了API 21,并在CameraManager.setTorchMode > API 23 即可。因此,当在那部手机上运行时,这些方法可以被调用。

您可以执行运行时检查以确定要使用的API级别:

if (Build.VERSION.SdkInt <= BuildVersionCodes.KitkatWatch)
{
    if (PackageManager.HasSystemFeature("FEATURE_CAMERA_FLASH"))
    {
        camera = Camera.Open(); // `Camera camera` variable is held as the class level
        var camParameters = camera.GetParameters();
        camParameters.FlashMode = "FLASH_MODE_TORCH";
        camera.SetParameters(camParameters);
        camera.StartPreview(); // Turn on

        //When done with flashlight:
        //camera.StopPreview(); // Turn off
        //camera.Dispose();
    }
    else
        Log.Debug("SO", "Phone does not contain a flash....");
}
else
{
    // Use API 21+ methods... 
}

注意: 许多 手机具有“火炬”模式但比API 21更早,需要{{1使用,以便相机正常工作,从而使闪光灯正常工作。在您的用户界面中添加SurfaceView,从中获取SurfaceView并将相机附加到其中(SurfaceHolder