Android 需要一个使用MonoDroid和MVVMCross拍照的示例

Android 需要一个使用MonoDroid和MVVMCross拍照的示例,android,camera,xamarin.android,mvvmcross,Android,Camera,Xamarin.android,Mvvmcross,有人能给我举一个拍照并使用MVVMCross存储的例子吗 我一直在搜索,但只找到以下内容: (不实现MVVMCross) (这是视频,我无法让它工作:s) (它可以工作,但不实现MVVMCross) 谢谢 决心谢谢! 未来参考:(使用主分支) 感谢斯图尔特,我只是改变了代码来适应我的现实 使用cirries.MvvmCross.ExtensionMethods; 使用cirries.MvvmCross.Interfaces.Platform.Tasks; 使用cirries.MvvmCro

有人能给我举一个拍照并使用
MVVMCross
存储的例子吗

我一直在搜索,但只找到以下内容:

  • (不实现MVVMCross)

  • (这是视频,我无法让它工作:s)

  • (它可以工作,但不实现MVVMCross)

谢谢

决心谢谢!
未来参考:(使用主分支)
感谢斯图尔特,我只是改变了代码来适应我的现实

使用cirries.MvvmCross.ExtensionMethods;
使用cirries.MvvmCross.Interfaces.Platform.Tasks;
使用cirries.MvvmCross.Interfaces.ServiceProvider;
使用SIGEP.DummyService;
使用SIGEP.Mobile.Core.Interfaces;
命名空间SIGEP.Mobile.Core.Models
{
公共类PhotoService:IMvxServiceConsumer
{
私有常量int MaxPixelDimension=1024;
private const int DefaultJpegQuality=92;
public void GetNewPhoto()
{
此.GetService()文件已被删除(
MaxPixelDimension,
质量,
手持照片可用,
()=>{/*取消被忽略*/});
}
公共事件事件处理程序PhotoStreamAvailable;
私有void HandlePhotoAvailable(流图片流)
{
var handler=PhotoStreamAvailable;
if(处理程序!=null)
{
处理程序(这是新的PhotoStreamEventArgs(){PictureStream=PictureStream,onSucesGettingPhotoFileName=onSucesGettingPhotoFileName});
}
}
公共静态void TakePhoto(操作成功文件名,操作错误)
{
var service=newphotoservice();
service.onSucesGettingPhotoFileName=成功文件名;
service.OnError=错误;
service.GetNewPhoto();
service.PhotoStreamAvailable+=新事件处理程序(service\u PhotoStreamAvailable);
}
静态无效服务\u PhotoStreamAvailable(对象发送方,PhotoStreamEventArgs e)
{
//格拉瓦普拉菲切罗!!!
var directory=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var filename=Path.Combine(目录“photo.jpeg”);
字符串saveTo=文件名;
FileStream writeStream=newfilestream(saveTo,FileMode.Create,FileAccess.Write);
ReadWriteStream(例如PictureStream,writeStream);
e、 OnSucesGettingPhotoFileName(文件名);
}
私有静态void ReadWriteStream(流readStream、流writeStream)
{
整数长度=256;
字节[]缓冲区=新字节[长度];
int bytesRead=readStream.Read(缓冲区,0,长度);
//写入所需的字节
而(字节读取>0)
{
writeStream.Write(缓冲区,0,字节读取);
bytesRead=readStream.Read(缓冲区,0,长度);
}
readStream.Close();
writeStream.Close();
}
有关SucesGettingPhotoFileName{get;set;}的公共操作
公共操作OnError{get;set;}
}
[可序列化]
[ComVisible(true)]
公共类PhotoStreamEventArgs:EventArgs
{
公共流PictureStream{get;set;}
有关SucesGettingPhotoFileName{get;set;}的公共操作
}
}

我通常使用内置的
IMvxPictureChooserTask
实现服务(如果使用vNext,则在插件中):

使用cirries.MvvmCross.ExtensionMethods;
使用cirries.MvvmCross.Interfaces.Platform.Tasks;
使用cirries.MvvmCross.Interfaces.ServiceProvider;
公共类光服务
:IMvxServiceConsumer
,IPhotoService
{
私有常量int MaxPixelDimension=1024;
private const int DefaultJpegQuality=92;
public void GetNewPhoto()
{
Trace.Info(“开始拍摄新照片”);
此.GetService()文件已被删除(
MaxPixelDimension,
质量,
手持照片可用,
()=>{/*取消被忽略*/});
}
公共事件事件处理程序PhotoStreamAvailable;
私有void HandlePhotoAvailable(流图片流)
{
Trace.Info(“图片可用”);
var handler=PhotoStreamAvailable;
if(处理程序!=null)
{
处理程序(这是新的PhotoStreamEventArgs(){PictureStream=PictureStream});
}
}
}
我通常在启动时将此服务注册为单例,然后从ViewModel ICommand处理程序调用它


使用这项服务的一个应用程序是示例-看-这不是一个与我无关的示例,但我相信它同时带来了拍照和ZXing-两者都使用外部服务


一个警告:在MonoDroid上,您可以看到一些奇怪的/意外的活动/ViewModel生命周期行为-基本上,您可以看到您拍摄照片的活动在拍摄过程中从内存中卸载/擦除。如果这种情况发生在你的应用程序上,那么你可能需要开始考虑这样的问题:MvvmCross(尚未)不会自动处理这一问题

我相信Blooor示例可能会遇到这个问题,但用户是否会在正常的应用程序使用中看到它是有争议的



作为
imvxPictureChoserTask
服务的替代方案,您还可以查看使用Xamarin.Mobile的一些跨平台API的情况——请参阅可能的起点——或者对于Android,只有您可以轻松实现自己的API。

该录像机示例基于Xamarin.Mobile——这可能是一个开始应用程序内拍照的好地方。目前,我正在使用master早午餐。我将升级到vnext,希望它能正常工作!谢谢@stuarth我发布的代码应该在master分支中工作-如果你已经在master中工作,那么我想你会发现在master中工作比在vNext中切换到PCLs更容易:)谢谢你的问题。请不要拘泥于你所学的任何东西,写博客吧-帮助你添加到文档中!
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; }
}
}
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 });
        }
    }
}