2012-11-20 11 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サンプルで使用して1つのアプリ - 外部サービスを使用して、両方の - これは私がとは何かを持っていたサンプルではありませんが、私はそれが絵取って、ZXingの両方にもたらすと信じて - BaseEditProductViewModel.csを参照してください。


一つ警告:MonoDroidで、あなたはいくつかの奇妙な/予想外の活動/ ViewModelにライフサイクルの動作を見ることができます - 基本的にあなたがから写真を撮るの活動写真を撮影中にメモリから拭い/アンロードされていることがわかります。これがあなたのアプリに起こったら、おそらくSaving Android Activity state using Save Instance Stateのような質問を見る必要があるでしょう。これはMvvmCrossでは(まだ)処理されていません。

私はBlooorサンプルがこの問題を抱えている可能性があると考えています。しかし、通常のアプリの使用でユーザーがこれを見るかどうかは議論の余地があります。可能な出発点のためMvvmCross vnext : monodroid use a VideoView inside a pluginを参照してください - - IMvxPictureChooserTaskサービスの代わりに、あなたもXamarin.MobileからのクロスプラットフォームAPIの一部を使用して見ることができたよう


やAndroidのためにのみ、あなたが簡単に実装することができます自分の。

+0

VideoRecorderのサンプル(https://gist.github.com/3945799)は、Xamarin.Mobileをベースにしています。アプリ内撮影を開始するには最適な場所です。 – Stuart

+0

現在、私はマスターブランチを使用しています。 私はvnextにアップグレードし、うまくいけばそれを動作させるでしょう! ありがとう@Stuart – ptorrezao

+1

私が投稿したコードは、マスターブランチで動作するはずです。既にマスターで作業している場合は、vNextでPCLに切り替えるのではなくマスターで作業する方が簡単だと思います:) – Stuart

関連する問題