尝试使用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(具有相机闪光灯功能)来调试应用程序。
将目标框架更改为我的手机支持的确切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 ) ]
我该如何解决这个问题?
您是否需要更多信息来帮助我找出问题?
答案 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
)