2012-11-20 14 views
5

के साथ एक चित्र लेने का एक उदाहरण चाहिए क्या कोई मुझे का उदाहरण ले सकता है और इसे MVVMCross का उपयोग करके स्टोर कर सकता है?मोनोड्रॉइड और एमवीवीएमसीआर

मैं खोज की है, लेकिन केवल पाया है यह:

  • Monodroid Take a picture with Camera (MVVMCross लागू नहीं करता है)

  • Video Recording (यह वीडियो है और मैं यह काम नहीं कर सकते हैं: एस)

  • The Oficialy Recipe Example (यह काम करता है लेकिन 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 से कॉल डी हैंडलर। देख BaseEditProductViewModel.cs - - जो इस सेवा का उपयोग करता


एक ऐप Blooor नमूना है यह एक नमूना मैं से कोई लेना देना था नहीं है, लेकिन मेरा मानना ​​है कि यह लेने के दोनों पिक्चर में लाता है और ZXing - दोनों बाह्य सेवाओं का उपयोग ।


एक चेतावनी: MonoDroid पर, आप कुछ अजीब/अप्रत्याशित गतिविधि/ViewModel जीवन चक्र व्यवहार देख सकते हैं - मूल रूप से आपको लगता है कि गतिविधि आप से उतार रहा है तस्वीर/फोटो लेने के दौरान स्मृति से मिटा दिया ले देख सकते हैं। यदि यह आपके ऐप के साथ होता है तो आपको शायद Saving Android Activity state using Save Instance State जैसे प्रश्नों को देखना शुरू करना होगा - यह स्वचालित रूप से MvvmCross (अभी तक) में प्रबंधित नहीं होता है।

मेरा मानना ​​है कि ब्लूअर नमूना इस मुद्दे से पीड़ित हो सकता है - लेकिन क्या उपयोगकर्ता कभी भी सामान्य ऐप उपयोग में इसे देखेगा तो बहस योग्य है।


IMvxPictureChooserTask सेवा के लिए एक विकल्प है, तो आप भी Xamarin.Mobile से पार मंच एपीआई का उपयोग कर देख सकते हैं के रूप में - एक संभव शुरू करने के लिए जगह MvvmCross vnext : monodroid use a VideoView inside a plugin देखते हैं - या Android के लिए केवल आप आसानी से लागू कर सकते हैं अपने खुद।

+0

वह वीडियो रिकॉर्डक नमूना - https://gist.github.com/3945799 - Xamarin.Mobile के आसपास आधारित है - और यह ऐप-एप फोटो लेने से शुरू करने के लिए एक शानदार जगह हो सकती है। – Stuart

+0

वर्तमान में मैं मास्टर ब्रंच का उपयोग कर रहा हूं। मैं vnext में अपग्रेड करूँगा और उम्मीद है कि यह काम कर रहा है! धन्यवाद @ स्टुअर्ट – ptorrezao

+1

जो कोड मैंने पोस्ट किया है उसे मास्टर शाखा में काम करना चाहिए - अगर आप पहले से ही मास्टर में काम कर रहे हैं, तो मुझे लगता है कि आपको vNext में पीसीएल पर स्विच करने के बजाए मास्टर में काम करना आसान लगेगा :) – Stuart