问题描述
在Xamarin.Forms上使用依赖服务时,我收到此错误。我已经看到此错误的答案,其中涉及iOS和链接器。但是,我正在Android上运行此程序,并且链接器已关闭。
它告诉我的构造函数,它无法在PCL中找到接口的默认构造函数。
我已经搜索和调试了几个小时。有哪些可能导致此错误的事情?我很确定自己的DependencyService实现是正确的,所以我觉得这有所不同。
这是我的相关代码。
Android
[assembly: Xamarin.Forms.Dependency(typeof(TextRecognition))]
namespace DiabetesAPP.Droid
{
[Preserve(AllMembers = true)]
[Activity(Label = "TextRecognition",Theme = "@style/Theme.AppCompat.Light.NoActionBar",MainLauncher = true)]
public class TextRecognition : AppCompatActivity,ISurfaceHolderCallback,IProcessor,ITextRecognition
{
private SurfaceView cameraview;
private TextView textView;
private CameraSource cameraSource;
public string Resultados;
private const int RequestCameraPermissionID = 1001;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Main);
cameraview = FindViewById<SurfaceView>(Resource.Id.surface_view);
textView = FindViewById<TextView>(Resource.Id.txtview);
TextRecognizer textRecognizer = new TextRecognizer.Builder(ApplicationContext).Build();
if (!textRecognizer.IsOperational)
{
Log.Error("Main Activity","Detector dependencies are not yet available");
}
else
{
cameraSource = new CameraSource.Builder(ApplicationContext,textRecognizer)
.SetFacing(CameraFacing.Back)
.SetRequestedFps(2.0f)
.SetRequestedPreviewSize(1280,1024)
.SetAutoFocusEnabled(true)
.Build();
cameraview.Holder.AddCallback(this);
textRecognizer.SetProcessor(this);
}
Android.Widget.Button logonButton = FindViewById<Android.Widget.Button>(Resource.Id.button_send);
logonButton.Click += logonButton_Click;
}
public override void OnRequestPermissionsResult(int requestCode,string[] permissions,[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
switch (requestCode)
{
case RequestCameraPermissionID:
{
if (grantResults[0] == Android.Content.PM.Permission.Granted)
{
cameraSource.Start(cameraview.Holder);
}
}
break;
}
}
public void SurfaceChanged(ISurfaceHolder holder,[GeneratedEnum] Format format,int width,int height)
{
}
public void SurfaceCreated(ISurfaceHolder holder)
{
if (ActivityCompat.CheckSelfPermission(ApplicationContext,Manifest.Permission.Camera) != Android.Content.PM.Permission.Granted)
{
ActivityCompat.RequestPermissions(this,new string[]
{
Android.Manifest.Permission.Camera
},RequestCameraPermissionID);
return;
}
cameraSource.Start(cameraview.Holder);
}
public void SurfaceDestroyed(ISurfaceHolder holder)
{
cameraSource.Stop();
}
public void ReceiveDetections(Detections detections)
{
SparseArray items = detections.DetectedItems;
if (items.Size() != 0)
{
textView.Post(() =>
{
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < items.Size(); i++)
{
strBuilder.Append(((TextBlock)items.ValueAt(i)).Value);
strBuilder.Append("\n");
}
textView.Text = strBuilder.ToString();
Resultados = strBuilder.ToString();
});
}
}
private void logonButton_Click(object sender,EventArgs e)
{
//Toast.MakeText(this,"Hello from " + Resultados,ToastLength.Long).Show();
//Intent data = new Intent(this,typeof(TextRecognition));
//SetResult(Result.Ok,data);
//// MessagingCenter.Send((DiabetesAPP.App)Xamarin.Forms.Application.Current,"OpenPage","You send message:" + Resultados);
//// MessagingCenter.Send<DiabetesAPP.App,string>(DiabetesAPP.App.Current as App,"You send message:" + Resultados);
//MessagingCenter.Send((DiabetesAPP.App)Xamarin.Forms.Application.Current,"You send message:" + Resultados);
Toast.MakeText(this,Resultados,ToastLength.Short).Show();
MessagingCenter.Send<App,string>(App.Current as App,"You send message:" + Resultados);
Finish();
}
public void Release()
{
}
public void LaunchActivityInAndroid()
{
Activity activity = Forms.Context as Activity;
var intent = new Intent(Forms.Context,typeof(TextRecognition));
activity.StartActivity(intent);
}
protected override void OnActivityResult(int requestCode,Result resultCode,Intent data)
{
base.OnActivityResult(requestCode,resultCode,data);
switch (resultCode)
{
case Result.Ok:
break;
}
Finish();
}
public interface ITextRecognition
{
}
//Update code - 16/09/2020
public TextRecognition()
{
}
}
}
在Xamarin.Form页面中的实现
[assembly: Xamarin.Forms.Dependency(typeof(ITextRecognition))]
namespace DiabetesAPP.Views.FoodMenu
{
[XamlCompilation(XamlCompilationoptions.Compile)]
public partial class FoodMenu : ContentPage
{
public FoodMenu()
{
InitializeComponent();
}
async void Food_ManualEntry(object sender,EventArgs e)
{
await Navigation.PushAsync(new SearchFood());
}
public void Food_CameraEntry(object sender,EventArgs e)
{
Xamarin.Forms.DependencyService.Register<ITextRecognition>();
DependencyService.Get<ITextRecognition>().LaunchActivityInAndroid();
}
public interface ITextRecognition
{
void LaunchActivityInAndroid();
}
}
}
错误:System.MissingMethodException:未找到类型DiabetesAPP.Views.FoodMenu.FoodMenu + ITextRecognition的默认构造函数
出了什么问题?
解决方法
这正是错误所说的。为了使DependencyService
实例化一个类,该类必须具有默认的(空)构造函数。你没有。
您无需在ITextRecognition
项目中创建新的Android
接口,您应该使用在Xamarin.forms
项目中创建的接口。
此外,最好不要在FoodMenu类内部创建接口。
这是代码示例:
在Xamarin.Forms中:
namespace App384
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class FoodMenu : ContentPage
{
public FoodMenu()
{
InitializeComponent();
}
public void Food_CameraEntry(object sender,EventArgs e)
{
Xamarin.Forms.DependencyService.Register<ITextRecognition>();
DependencyService.Get<ITextRecognition>().LaunchActivityInAndroid();
}
}
public interface ITextRecognition
{
void LaunchActivityInAndroid();
}
}
在Xamarin.Android项目中:
[assembly: Xamarin.Forms.Dependency(typeof(TextRecognition))]
namespace App384.Droid
{
[Preserve(AllMembers = true)]
[Activity(Label = "TextRecognition",Theme = "@style/Theme.AppCompat.Light.NoActionBar",MainLauncher = true)]
public class TextRecognition : AppCompatActivity,ITextRecognition
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public void LaunchActivityInAndroid()
{
Console.WriteLine("LaunchActivityInAndroid");
}
}
}
我已经上传了test demo here,您可以查看。