2012-11-20 34 views
5

任何人都可以指点我的示例拍摄照片并使用MVVMCross存储?需要用MonoDroid和MVVMCross拍摄照片的一个例子

我一直在寻找,但只找到了这个:

谢谢!

已解决!谢谢!
引用未来:(采用主科)
积分斯图尔特,我只是改变了代码与我的现实工作

using Cirrious.MvvmCross.ExtensionMethods; 
using Cirrious.MvvmCross.Interfaces.Platform.Tasks; 
using Cirrious.MvvmCross.Interfaces.ServiceProvider; 
using SIGEP.DummyService; 
using SIGEP.Mobile.Core.Interfaces; 


namespace SIGEP.Mobile.Core.Models 
{ 
public class PhotoService : IMvxServiceConsumer<IMvxPictureChooserTask> 
{ 
    private const int MaxPixelDimension = 1024; 
    private const int DefaultJpegQuality = 92; 

    public void GetNewPhoto() 
    { 
     this.GetService<IMvxPictureChooserTask>().TakePicture(
      MaxPixelDimension, 
      DefaultJpegQuality, 
      HandlePhotoAvailable, 
      () => { /* cancel is ignored */ }); 

    } 

    public event EventHandler<PhotoStreamEventArgs> PhotoStreamAvailable; 

    private void HandlePhotoAvailable(Stream pictureStream) 
    { 
     var handler = PhotoStreamAvailable; 
     if (handler != null) 
     { 
      handler(this, new PhotoStreamEventArgs() { PictureStream = pictureStream, OnSucessGettingPhotoFileName = OnSucessGettingPhotoFileName }); 
     } 
    } 



    public static void TakePhoto(Action<string> successFileName, Action<Exception> error) 
    { 
     var service = new PhotoService(); 
     service.OnSucessGettingPhotoFileName = successFileName; 
     service.OnError = error; 
     service.GetNewPhoto(); 
     service.PhotoStreamAvailable += new EventHandler<PhotoStreamEventArgs>(service_PhotoStreamAvailable); 
    } 

    static void service_PhotoStreamAvailable(object sender, PhotoStreamEventArgs e) 
    { 
     //grava pra ficheiro!!! 
     var directory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
     var filename = Path.Combine(directory, "photo.jpeg"); 
     string saveTo = filename; 
     FileStream writeStream = new FileStream(saveTo, FileMode.Create, FileAccess.Write); 
     ReadWriteStream(e.PictureStream, writeStream); 

     e.OnSucessGettingPhotoFileName(filename); 

    } 
    private static void ReadWriteStream(Stream readStream, Stream writeStream) 
    { 
     int Length = 256; 
     Byte[] buffer = new Byte[Length]; 
     int bytesRead = readStream.Read(buffer, 0, Length); 
     // write the required bytes 
     while (bytesRead > 0) 
     { 
      writeStream.Write(buffer, 0, bytesRead); 
      bytesRead = readStream.Read(buffer, 0, Length); 
     } 
     readStream.Close(); 
     writeStream.Close(); 
    } 

    public Action<string> OnSucessGettingPhotoFileName { get; set; } 
    public Action<Exception> OnError { get; set; } 
} 

[Serializable] 
[ComVisible(true)] 
public class PhotoStreamEventArgs : EventArgs 
{ 
    public Stream PictureStream { get; set; } 

    public Action<string> OnSucessGettingPhotoFileName { get; set; } 
} 
} 

回答

3

我通常使用实现服务内置IMvxPictureChooserTask(这是一个插件,如果使用vNext):

using Cirrious.MvvmCross.ExtensionMethods; 
using Cirrious.MvvmCross.Interfaces.Platform.Tasks; 
using Cirrious.MvvmCross.Interfaces.ServiceProvider; 

public class PhotoService 
    : IMvxServiceConsumer<IMvxPictureChooserTask> 
    , IPhotoService 
{ 
    private const int MaxPixelDimension = 1024; 
    private const int DefaultJpegQuality = 92; 

    public void GetNewPhoto() 
    { 
     Trace.Info("Get a new photo started."); 

     this.GetService<IMvxPictureChooserTask>().TakePicture(
      MaxPixelDimension, 
      DefaultJpegQuality, 
      HandlePhotoAvailable, 
      () => { /* cancel is ignored */ }); 
    } 

    public event EventHandler<PhotoStreamEventArgs> PhotoStreamAvailable; 

    private void HandlePhotoAvailable(Stream pictureStream) 
    { 
     Trace.Info("Picture available"); 
     var handler = PhotoStreamAvailable; 
     if (handler != null) 
     { 
      handler(this, new PhotoStreamEventArgs() { PictureStream = pictureStream }); 
     } 
    } 
} 

我一般注册这个服务在启动期间一个单,然后从一个ViewModel IComman调用它d处理程序。使用这种服务


一个应用程序是Blooor样本 - 见BaseEditProductViewModel.cs - 这是不是一个样我有什么做的,但我相信它带来了两个拍照和斑马线 - 无论是使用外部服务。


一个警告:在MonoDroid的,你可以看到一些奇怪的/出乎意料的活动/视图模型的生命周期行为 - 基本上你可以看到,活动你从被卸载照片/拍摄照片的过程中,从记忆中抹去了。如果这发生在您的应用程序中,那么您可能需要开始查看如下问题:Saving Android Activity state using Save Instance State - 这不会在MvvmCross(尚未)中自动处理。

我相信布洛尔样本可能会遭遇这个问题 - 但用户是否会看到它在正常的应用程序使用是值得商榷的。


至于IMvxPictureChooserTask服务替代方案,你也可以看看使用一些从Xamarin.Mobile跨平台的API - 见MvvmCross vnext : monodroid use a VideoView inside a plugin一个可能的起点 - 或为Android只有你可以轻松实现你的拥有。

+0

VideoRecorder示例 - https://gist.github.com/3945799 - 基于Xamarin.Mobile - 它可能是一个开始使用应用内照片拍摄的好地方。 – Stuart

+0

目前我正在使用主早午餐。 我会升级到vnext,并希望它工作! Thanks @Stuart – ptorrezao

+1

我发布的代码应该在master分支中工作 - 如果您已经在master中工作,那么我认为您会发现它更容易在master中工作,而不是在vNext中切换到PCL :) – Stuart