首页 文章

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

提问于
浏览
1

问题

尝试使用Xamarin.Forms(Xamarin.Android项目)应用在Android设备上打开手电筒/手电筒时的错误和例外 .

Please see the below code' comments for the errors and exceptions mentioned:

// 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 permissions:

<?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(具有Camera flash功能)来调试应用程序 .

我试图解决这个问题:

  • 安装了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

使用系统;使用Android.OS;使用Android.Runtime;使用Java.Interop;使用Java.Lang;

命名空间Android.Hardware.Camera2 {[Register(“android / hardware / camera2 / CameraManager”,DoNotGenerateAcw = true,ApiSince = 21)] public sealed class CameraManager:Java.Lang.Object {public override 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并且定义似乎需要它,所以我该如何解决这个问题呢?这是所述方法定义的确切寄存器:[注册("setTorchMode","(Ljava/lang/String;Z)V",“”, ApiSince = 23 )]


我怎么解决这个问题?

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

1 回答

  • 2

    您的手机是 API 19API 21 中添加了 CameraManagerAPI 23 中添加了 CameraManager.setTorchMode . 因此,在该手机上运行时无法调用这些方法 .

    您可以执行运行时检查以确定要使用的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... 
    }
    

    Note: Many 具有"torch"模式但比 API 21 更旧的手机需要使用 SurfaceView 才能使相机正常工作,从而使闪光灯正常工作 . 将 SurfaceView 添加到您的用户界面,从中获取 SurfaceHolder 并将相机连接到它( camera.SetPreviewDisplay

相关问题