C# 在Xamarin.Forms中访问摄像头

C# 在Xamarin.Forms中访问摄像头,c#,camera,xamarin.forms,xlabs,C#,Camera,Xamarin.forms,Xlabs,我需要使用Xamarin Forms PCL访问摄像头。 我找不到任何有效的样品 我试图安装并使用它的示例代码,但它有例外。例如,对于XLabs示例,我使用以下内容: /// <summary> /// Takes the picture. /// </summary> /// <returns>Take Picture Task.</returns> internal async Task<MediaFile> TakePicture

我需要使用Xamarin Forms PCL访问摄像头。 我找不到任何有效的样品

我试图安装并使用它的示例代码,但它有例外。例如,对于XLabs示例,我使用以下内容:

/// <summary>
/// Takes the picture.
/// </summary>
/// <returns>Take Picture Task.</returns>
internal async Task<MediaFile> TakePicture()
{
    Setup();

    ImageSource = null;

    return await _mediaPicker.TakePhotoAsync(new CameraMediaStorageOptions { DefaultCamera = CameraDevice.Front, MaxPixelDimension = 400 }).ContinueWith(t =>
    {
        if (t.IsFaulted)
        {
            Status = t.Exception.InnerException.ToString();
        }
        else if (t.IsCanceled)
        {
            Status = "Canceled";
        }
        else
        {
            var mediaFile = t.Result;

            ImageSource = ImageSource.FromStream(() => mediaFile.Source);

            return mediaFile;
        }

        return null;
    }, _scheduler);
}

/// <summary>
/// Setups this instance.
/// </summary>
private void Setup()
{
    if (_mediaPicker != null)
    {
        return;
    }

    var device = Resolver.Resolve<IDevice>();

    ////RM: hack for working on windows phone? 
    _mediaPicker = DependencyService.Get<IMediaPicker>() ?? device.MediaPicker;
}
//
///拍照。
/// 
///拍照任务。
内部异步任务TakePicture()
{
设置();
ImageSource=null;
return wait_mediaPicker.TakePhotoAsync(新的CamerameDistorageOptions{DefaultCamera=CameraDevice.Front,MaxPixelDimension=400})。继续(t=>
{
如果(t.IsFaulted)
{
Status=t.Exception.InnerException.ToString();
}
否则,如果(t.IsCanceled)
{
Status=“已取消”;
}
其他的
{
var mediaFile=t.Result;
ImageSource=ImageSource.FromStream(()=>mediaFile.Source);
返回媒体文件;
}
返回null;
}),;
}
/// 
///设置此实例。
/// 
私有无效设置()
{
如果(_mediaPicker!=null)
{
返回;
}
var device=Resolver.Resolve();
////RM:在windows phone上工作的黑客?
_mediaPicker=DependencyService.Get()??device.mediaPicker;
}
我在
Resolver.Resolve()上遇到以下异常:
IResolver尚未设置。请通过调用Resolver.SetResolver(Resolver)进行设置。


如何使用此选项或其他选项与Xamarin.Forms拍照?谢谢你提前给我小费

您必须配置IoC以使其工作,并使用Resolver.SetResolver方法将IoC提供程序设置为解析器。请在此处阅读更多信息,

您不能直接访问Xamarin.Forms中的本机功能。您必须使用依赖服务来访问本机功能,如访问Camrera、audio等


试试这个:

以下是xLabs摄像头的示例代码:

在这里的论坛上找到它:

添加Droid项目,类main活动此代码

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);
    #region Resolver Init
    SimpleContainer container = new SimpleContainer();
    container.Register<IDevice>(t => AndroidDevice.CurrentDevice);
    container.Register<IDisplay>(t => t.Resolve<IDevice>().Display);
    container.Register<INetwork>(t => t.Resolve<IDevice>().Network);

    Resolver.SetResolver(container.GetResolver());
    #endregion
    ....
}
protectedoverride void OnCreate(捆绑包)
{
base.OnCreate(bundle);
#区域解析器初始化
SimpleContainer容器=新的SimpleContainer();
容器寄存器(t=>AndroidDevice.CurrentDevice);
container.Register(t=>t.Resolve().Display);
container.Register(t=>t.Resolve().Network);
SetResolver(container.GetResolver());
#端区
....
}
在IOS类AppDelegate中,这一个:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    #region Resolver Init
    SimpleContainer container = new SimpleContainer();
    container.Register<IDevice>(t => AppleDevice.CurrentDevice);
    container.Register<IDisplay>(t => t.Resolve<IDevice>().Display);
    container.Register<INetwork>(t => t.Resolve<IDevice>().Network);

    Resolver.SetResolver(container.GetResolver());
    #endregion
    ....
}
public override bool FinishedLaunching(UIApplication应用程序、NSDictionary选项)
{
#区域解析器初始化
SimpleContainer容器=新的SimpleContainer();
容器寄存器(t=>AppleDevice.CurrentDevice);
container.Register(t=>t.Resolve().Display);
container.Register(t=>t.Resolve().Network);
SetResolver(container.GetResolver());
#端区
....
}

我应该在哪里做?我应该在PCL上还是在每个依赖项目中创建此SimpleContainer?您需要在每个特定于平台的项目中创建此SimpleContainer。您可以在Android项目中发布配置解析器的示例代码吗?我无法工作XLABS有示例代码,请检查SetIoC方法,尤其是第103行。