问题
尝试使用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 回答
您的手机是 API 19 , API 21 中添加了
CameraManager
, API 23 中添加了CameraManager.setTorchMode
. 因此,在该手机上运行时无法调用这些方法 .您可以执行运行时检查以确定要使用的API级别:
Note: Many 具有"torch"模式但比
API 21
更旧的手机需要使用SurfaceView
才能使相机正常工作,从而使闪光灯正常工作 . 将SurfaceView
添加到您的用户界面,从中获取SurfaceHolder
并将相机连接到它(camera.SetPreviewDisplay
)