首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xam.Plugin.Media‘打开的文件太多’

Xam.Plugin.Media‘打开的文件太多’
EN

Stack Overflow用户
提问于 2017-12-12 00:17:39
回答 0查看 245关注 0票数 0

我有一个Xamarin forms PCL应用程序,使用的是Xam.Plugin.Media助手。我有一个页面,用户在按下按钮时调用相机助手来拍摄照片。来自相机辅助对象的字节返回到页面,并作为图像的源。页面上有一个保存按钮,我基本上是在这里调用消息传递服务并将字节保存到PCL SQlite存储中。问题是我得到了这个页面的3次成功加载,并且可以在用相机拍摄图像之后,但在它返回字节之前,使用相机助手拍摄照片。异常消息是“打开的文件太多”。这是为iOS准备的。所有相关的代码都在下面。谢谢

Camera Helper:

代码语言:javascript
运行
复制
 public class CameraHelper
{
    private MediaFile file;

    public async Task<byte[]> TakePicture()
    {
        await CrossMedia.Current.Initialize();

        if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
        {
            throw new Exception("No camera available");
        }

       using (MediaFile file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
        {
            Name = $"photo{DateTime.Now.ToString("yyyyMMddHHmmss")}.jpg",
            PhotoSize = PhotoSize.Small,
            CompressionQuality = 80,
            AllowCropping = true,
        }))

        {
            if (file == null)
            {
                return null;
            }
            using (System.IO.Stream stream = file.GetStream())
            {
                ImgBytes = new byte[stream.Length];
                await stream.ReadAsync(ImgBytes, 0, Convert.ToInt32(stream.Length));
                file.Dispose();
            }
        }
        return ImgBytes;
    }
}

拍照页面:

代码语言:javascript
运行
复制
 <ContentPage.Content>
    <StackLayout VerticalOptions="FillAndExpand" Padding="12,10,12,15">

        <Label x:Name="photoTypeLabel" Text="Take *photo type* Photo" VerticalOptions="Start" />

        <StackLayout Padding="0,30,0,70">

            <ffimageloading:CachedImage x:Name="Image" Grid.Row="0" FadeAnimationEnabled="true"  Aspect="AspectFill"
                                         HeightRequest="200" WidthRequest="125" >
                <ffimageloading:CachedImage.GestureRecognizers>
                    <TapGestureRecognizer Tapped="OnImageTapped" />
                </ffimageloading:CachedImage.GestureRecognizers>
            </ffimageloading:CachedImage>
        </StackLayout>

        <Label Grid.Row="0" Grid.Column="1"
               Text="{ x:Static local:GrialShapesFont.PhotoCamera }"
                Style="{StaticResource FontIcon}"
                HorizontalTextAlignment="Center"
                Opacity="1"
                FontSize="60"
                TextColor="#FF000000"
                VerticalOptions="Center"
                HorizontalOptions="Center">
            <Label.GestureRecognizers>
                <TapGestureRecognizer Tapped="OnCameraTapped" />
            </Label.GestureRecognizers>
        </Label>

        <Button Style="{StaticResource PrimaryActionButtonStyle}" VerticalOptions="End" Text="Save" WidthRequest="{ artina:OnOrientationDouble
                    LandscapePhone=200,
                    LandscapeTablet=400 }" HorizontalOptions="{ artina:OnOrientationLayoutOptions
                    PortraitPhone=Fill,
                    LandscapePhone=Center,
                    PortraitTablet=Fill,
                    LandscapeTablet=Center }" Clicked="saveButtonClicked" />

        <Button  Style="{StaticResource PrimaryActionButtonStyle}" VerticalOptions="End" Text="Cancel" WidthRequest="{ artina:OnOrientationDouble
                    LandscapePhone=200,
                    LandscapeTablet=400 }" HorizontalOptions="{ artina:OnOrientationLayoutOptions
                    PortraitPhone=Fill,
                    LandscapePhone=Center,
                    PortraitTablet=Fill,
                    LandscapeTablet=Center }"  Clicked="cancelButtonClicked" />
    </StackLayout>
</ContentPage.Content>

将照片页代码放在后面:

代码语言:javascript
运行
复制
  private async void OnCameraTapped(object sender, EventArgs args)
    {
        CameraHelper cameraHelper = new CameraHelper();

        try
        {
            ImgBytes = await cameraHelper.TakePicture();
            Image.Source = ImageSource.FromStream(() =>
            {
                return new MemoryStream(ImgBytes);
            });
        }
        catch (Exception ex)
        {
            if (ex.Message == "No camera available")
            {
                await DisplayAlert("Error", "No camera available", "Ok");
            }
            else
            {
                await DisplayAlert("Error", "Unable to take picture.", "Ok");
            }
        }
    }
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47757015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档