Como devo proceder para acionar a camera do IPhone? É da mesma forma que do Android?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Como devo proceder para acionar a camera do IPhone? É da mesma forma que do Android?
Olá, João Paulo!
Infelizmente no nosso curso não apresentamos o código para realizar essa tarefa com iOS. Porém, como é um assunto recorrente no fórum da própria Xamarin, você pode baixar o código criado por um usuário daquele fórum (Vaka Gopi Nadh Reddy) e comparar a implementação da captura da imagem da câmera do iOS com a do Android.
O link para o fórum é:
Baixe o código do aplicativo "Gallery And Camera Sample" no link abaixo:
https://us.v-cdn.net/5019960/uploads/editor/nu/299jnzqx1yry.zip
Basicamente, o que ele faz é criar uma interface ICameraGallery e implementar duas versões dessa interface, uma chamada Android_dependency e outra Ios_Dependency, que são obtidas pela aplicação Xamarin através do Dependency Service do Xamarin Forms.
Código do ICameraGallery:
public interface ICameraGallery
{
void CameraMedia();
void GalleryMedia();
}
Código da Android_dependency
using System;
using Android.App;
using Android.Content;
using Android.Provider;
using GalleryAndCameraSample.Droid;
using Xamarin.Forms;
using Environment = Android.OS.Environment;
using Uri = Android.Net.Uri;
[assembly: Dependency(typeof(Android_dependency))]
namespace GalleryAndCameraSample.Droid
{
public class Android_dependency : Activity, ICameraGallery
{
public void CameraMedia()
{
AppClass._dir = new Java.IO.File(Environment.GetExternalStoragePublicDirectory(Environment.DirectoryPictures), "CameraAppDemo");
if (!AppClass._dir.Exists())
{
AppClass._dir.Mkdirs();
}
Intent intent = new Intent(MediaStore.ActionImageCapture);
AppClass._file = new Java.IO.File(AppClass._dir, String.Format("myPhoto_{0}.jpg", Guid.NewGuid()));
intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(AppClass._file));
Activity activity = (Activity)Forms.Context;
activity.StartActivityForResult(intent, 0);
}
public void GalleryMedia()
{
var imageIntent = new Intent();
imageIntent.SetType("image/*");
imageIntent.SetAction(Intent.ActionGetContent);
((Activity)Forms.Context).StartActivityForResult(Intent.CreateChooser(imageIntent, "Select photo"), 1);
}
}
}
Código da Ios_Dependency:
using System;
using AVFoundation;
using CoreGraphics;
using Foundation;
using GalleryAndCameraSample.iOS;
using UIKit;
using Xamarin.Forms;
[assembly: Dependency(typeof(Ios_Dependency))]
namespace GalleryAndCameraSample.iOS
{
public class Ios_Dependency : ICameraGallery
{
public async void CameraMedia()
{
var authorizationStatus = AVCaptureDevice.GetAuthorizationStatus(AVMediaType.Video);
if (authorizationStatus != AVAuthorizationStatus.Authorized)
{
var access = await AVCaptureDevice.RequestAccessForMediaTypeAsync(AVMediaType.Video);
if (access)
{
GotAccessToCamera();
}
}
else
{
GotAccessToCamera();
}
}
public void GalleryMedia()
{
var imagePicker = new UIImagePickerController { SourceType = UIImagePickerControllerSourceType.PhotoLibrary, MediaTypes = UIImagePickerController.AvailableMediaTypes(UIImagePickerControllerSourceType.PhotoLibrary) };
imagePicker.AllowsEditing = true;
var window = UIApplication.SharedApplication.KeyWindow;
var vc = window.RootViewController;
while (vc.PresentedViewController != null)
{
vc = vc.PresentedViewController;
}
vc.PresentViewController(imagePicker, true, null);
imagePicker.FinishedPickingMedia += (sender, e) =>
{
UIImage originalImage = e.Info[UIImagePickerController.EditedImage] as UIImage;
if (originalImage != null)
{
var pngImage = originalImage.AsPNG();
byte[] myByteArray = new byte[pngImage.Length];
System.Runtime.InteropServices.Marshal.Copy(pngImage.Bytes, myByteArray, 0, Convert.ToInt32(pngImage.Length));
SamplePage.Galleryimage(myByteArray);
}
Device.BeginInvokeOnMainThread(() =>
{
vc.DismissViewController(true, null);
});
};
imagePicker.Canceled += (sender, e) => vc.DismissViewController(true, null);
}
private void GotAccessToCamera()
{
var imagePicker = new UIImagePickerController { SourceType = UIImagePickerControllerSourceType.Camera };
var window = UIApplication.SharedApplication.KeyWindow;
var vc = window.RootViewController;
while (vc.PresentedViewController != null)
{
vc = vc.PresentedViewController;
}
vc.PresentViewController(imagePicker, true, null);
imagePicker.FinishedPickingMedia += (sender, e) =>
{
UIImage image = (UIImage)e.Info.ObjectForKey(new NSString("UIImagePickerControllerOriginalImage"));
UIImage rotateImage = RotateImage(image, image.Orientation);
rotateImage = rotateImage.Scale(new CGSize(rotateImage.Size.Width, rotateImage.Size.Height), 0.5f);
var jpegImage = rotateImage.AsJPEG();
byte[] myByteArray = new byte[jpegImage.Length];
System.Runtime.InteropServices.Marshal.Copy(jpegImage.Bytes, myByteArray, 0, Convert.ToInt32(jpegImage.Length));
SamplePage.Cameraimage(myByteArray);
Device.BeginInvokeOnMainThread(() =>
{
vc.DismissViewController(true, null);
});
};
imagePicker.Canceled += (sender, e) => vc.DismissViewController(true, null);
}
double radians(double degrees) { return degrees * Math.PI / 180; }
private UIImage RotateImage(UIImage src, UIImageOrientation orientation)
{
UIGraphics.BeginImageContext(src.Size);
if (orientation == UIImageOrientation.Right)
{
CGAffineTransform.MakeRotation((nfloat)radians(90));
}
else if (orientation == UIImageOrientation.Left)
{
CGAffineTransform.MakeRotation((nfloat)radians(-90));
}
else if (orientation == UIImageOrientation.Down)
{
}
else if (orientation == UIImageOrientation.Up)
{
CGAffineTransform.MakeRotation((nfloat)radians(90));
}
src.Draw(new CGPoint(0, 0));
UIImage image = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return image;
}
}
}
Então você pode baixar o código, adaptar para o seu projeto e ver se funciona. E nos avise se encontrar alguma dificuldade.
Boa sorte e bons estudos!