2012-11-20 35 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