Хобрук: Ваш путь к мастерству в программировании

Нужен пример сфотографироваться с MonoDroid и MVVMCross

Кто-нибудь может указать мне пример сделать фото и сохранить его с помощью MVVMCross?

Я искал, но нашел только это:

Спасибо!!!

Решено! Спасибо!
К ссылкам на будущее: (используя Master Branch)
Спасибо Стюарту, я только что изменил код, чтобы он работал с моей реальностью

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

Ответы:


1

Обычно я реализую службу, используя встроенный 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 ICommand.


Одним из приложений, использующих эту службу, является образец Blooor — см. BaseEditProductViewModel.cs — это не образец, который у меня был ничего общего с этим, но я считаю, что это включает в себя как фотосъемку, так и ZXing - оба с использованием внешних сервисов.


Одно предупреждение: на MonoDroid вы можете увидеть какое-то странное/неожиданное поведение жизненного цикла Activity/ViewModel - в основном вы можете видеть, что Activity, из которого вы делаете фотографию, выгружается/стирается из памяти во время фотосъемки. Если это произойдет с вашим приложением, вам, вероятно, придется начать рассматривать такие вопросы, как: Сохранение активности Android состояние с помощью сохранения состояния экземпляра — это не обрабатывается автоматически в MvvmCross (пока).

Я считаю, что образец Blooor может страдать от этой проблемы, но вопрос о том, увидит ли пользователь когда-либо его при обычном использовании приложения, остается спорным.


В качестве альтернативы службе IMvxPictureChooserTask вы также можете использовать некоторые межплатформенные API-интерфейсы из Xamarin.Mobile — см. MvvmCross vnext : monodroid использует VideoView внутри плагина для возможной отправной точки - или только для Android вы можете легко реализовать свой собственный.

20.11.2012
  • Этот образец VideoRecorder — gist.github.com/3945799 — основан на Xamarin.Mobile — и может быть отличным местом для начала фотосъемки в приложении. 20.11.2012
  • В настоящее время я использую мастер-бранч. Я перейду на vnext и, надеюсь, он заработает! Спасибо @Стюарт 20.11.2012
  • Этот код, который я разместил, должен работать в ветке master — если вы уже работаете в master, то, я думаю, вам будет проще заставить его работать в master, а не переключаться на PCL в vNext :) 20.11.2012
  • Спасибо за вопрос. Пожалуйста, не стесняйтесь писать в блог обо всем, что вы узнали, — это поможет добавить в документацию! 21.11.2012
  • Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..