2012-11-20 2 views
5

Kann jemand mich auf ein Beispiel von ein Foto machen und speichern mit MVVMCross?Benötigen Sie ein Beispiel für ein Bild mit MonoDroid und MVVMCross

Ich habe gesucht, aber habe dies nur gefunden:

Danke !!!

Gelöst! Danke!
To Future Referenzen: (Verwenden von Master Branch)
Credits Stuart, Ich habe gerade den Code mit meiner Realität zu arbeiten

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; } 
} 
} 

Antwort

3

ich einen Dienst mit dem IMvxPictureChooserTask eingebauten allgemein implementieren (wenn dies in einem Plugin mit 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 }); 
     } 
    } 
} 

ich in der Regel diesen Dienst als Singleton während des Starts registrieren, und dann rufen sie von einem Ansichtsmodell IComman d Handler.


Eine App, die diesen Dienst verwendet, ist die Blooor Probe - siehe BaseEditProductViewModel.cs - das ist nicht eine Probe ich etwas mit dem zu tun hatte, aber ich glaube, dass es sowohl in Bild bringt und ZXing nehmen - sowohl externe Dienste .


Eine Warnung: Auf MonoDroid, können Sie einige seltsame/unerwartete Aktivität/Ansichtsmodell Lifecycle-Verhalten sehen - sehen Sie können im Grunde genommen, dass die Aktivität Sie das Foto nehmen von entladen wird/aus dem Speicher während des Fotonehmens gewischt. Wenn dies bei Ihrer App passiert, müssen Sie wahrscheinlich Fragen wie die folgende angehen: Saving Android Activity state using Save Instance State - dies wird (noch) nicht automatisch in MvvmCross behandelt.

Ich glaube, dass das Blooor-Beispiel von diesem Problem leiden könnte - aber ob ein Benutzer es jemals in der normalen App-Verwendung sehen würde, ist umstritten.


Als eine Alternative zum IMvxPictureChooserTask Service, auch bei Verwendung von einigen der Cross-Plattform-APIs von Xamarin.Mobile aussehen kann - MvvmCross vnext : monodroid use a VideoView inside a plugin für einen möglichen Startplatz sehen - oder nur für Android können Sie einfach implementieren Ihre besitzen.

+0

Das VideoRecorder-Beispiel - https://gist.github.com/3945799 - basiert auf Xamarin.Mobile - und es könnte ein großartiger Ort sein, um mit In-App-Fotoaufnahmen zu beginnen. – Stuart

+0

Momentan benutze ich den Meisterbrunch. Ich werde auf den vnext upgraden und es hoffentlich zum Laufen bringen! Danke @Stuart – ptorrezao

+1

Dieser Code, den ich gepostet habe, sollte in der Master-Zweig arbeiten - wenn Sie bereits arbeiten in Master, dann denke ich, dass Sie es einfacher finden wird, es in Master arbeiten statt auf PCLs in vNext wechseln :) – Stuart

Verwandte Themen