Работа с камерой

Содержание

Слайд 2

Работа с камерой на Xamarin Используется платформо-зависимый код, специфичный для каждой

Работа с камерой на Xamarin

Используется платформо-зависимый код, специфичный для каждой платформы
Класс MediaPicker из

пакета Xamarin.Essentials позволяет выполнять функции: съемка/просмотр фото/видео
Слайд 3

Установка разрешений В проекте для Android в файл AssemblyInfo.cs в папке

Установка разрешений

В проекте для Android в файл AssemblyInfo.cs в папке Properties
// Needed for Picking

photo/video
[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage)]
// Needed for Taking photo/video
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
[assembly: UsesPermission(Android.Manifest.Permission.Camera)]
// Add these properties if you would like to filter out devices that do not have cameras, or set to false to make them optional
[assembly: UsesFeature("android.hardware.camera", Required = true)]
[assembly: UsesFeature("android.hardware.camera.autofocus", Required = true)]
Слайд 4

2 способ Либо добавить в файл AndroidManifest.xml, который располагается там же

2 способ

Либо добавить в файл AndroidManifest.xml, который располагается там же в папке Properties,

в узел manifest содержимое



Слайд 5

Для платформы IOS NSCameraUsageDescription This app needs access to the camera

Для платформы IOS

NSCameraUsageDescription
This app needs access to the camera to take

photos.
NSMicrophoneUsageDescription
This app needs access to microphone for taking videos.
NSPhotoLibraryAddUsageDescription
This app needs access to the photo gallery for picking photos and videos.
NSPhotoLibraryUsageDescription
This app needs access to photos gallery for picking photos and videos.
Слайд 6

Для платформы UWP Отметить в файле Package.appxmanifest в секции Capabilities пункты Microphone и Webcam.

Для платформы UWP

Отметить в файле Package.appxmanifest в секции Capabilities пункты Microphone и Webcam.

Слайд 7

Класс MediaPicker методы для работы с камерой PickPhotoAsync: открывает на устройстве

Класс MediaPicker

методы для работы с камерой
PickPhotoAsync: открывает на устройстве проводник для

выбора фото
CapturePhotoAsync: открывает приложение камеры для съемки фото
PickVideoAsync: открывает проводник для выбора файла видео
CaptureVideoAsync: открывает приложение камеры для съемки видео
Слайд 8

Пояснение Все методы возвращают объект FileResult - наследник класса Stream, с

Пояснение

Все методы возвращают объект FileResult - наследник класса Stream, с которым можно работать как

с файловым потоком, например, сохранить его данные в файл.
Слайд 9

Пример Изменим главную страницу MainPage таким образом, чтобы она имела кнопки

Пример

Изменим главную страницу MainPage таким образом, чтобы она имела кнопки для

съемки и выбора фото и областью просмотра снятой фотографии
Слайд 10

Код проекта using System; using System.IO; using Xamarin.Essentials; using Xamarin.Forms; namespace

Код проекта

using System;
using System.IO;
using Xamarin.Essentials;
using Xamarin.Forms;
namespace HelloApp
{
    public partial class MainPage :

ContentPage
    {
        Image img;
        Button takePhotoBtn;
        Button getPhotoBtn;
        public MainPage()
        {
            //InitializeComponent();
            takePhotoBtn = new Button { Text = "Сделать фото" };
            getPhotoBtn = new Button { Text = "Выбрать фото" };
            img = new Image();
// выбор фото
            getPhotoBtn.Clicked += GetPhotoAsync;
Слайд 11

Код проекта // съемка фото takePhotoBtn.Clicked += TakePhotoAsync; Content = new

Код проекта

 
            // съемка фото
            takePhotoBtn.Clicked += TakePhotoAsync;
Content = new StackLayout
            {
                HorizontalOptions = LayoutOptions.Center,
                Children

= {
                    new StackLayout
                    {
                         Children = {takePhotoBtn, getPhotoBtn},
                         Orientation =StackOrientation.Horizontal,
                         HorizontalOptions = LayoutOptions.CenterAndExpand
                    },
                    img
                }
            };
        }
Слайд 12

Код проекта async void GetPhotoAsync(object sender, EventArgs e) { try {

Код проекта

        async void GetPhotoAsync(object sender, EventArgs e)
        {
            try
            {
                // выбираем фото
                var photo =

await MediaPicker.PickPhotoAsync();
                // загружаем в ImageView
                img.Source = ImageSource.FromFile(photo.FullPath);
            }
            catch (Exception ex)
            {
                await DisplayAlert("Сообщение об ошибке", ex.Message, "OK");
            }
        }
Слайд 13

Код проекта async void TakePhotoAsync(object sender, EventArgs e) { try {

Код проекта

        async void TakePhotoAsync(object sender, EventArgs e)
        {
            try
            {
                var photo = await MediaPicker.CapturePhotoAsync(new

MediaPickerOptions
                {
                 Title = $"xamarin.{DateTime.Now.ToString("dd.MM.yyyy_hh.mm.ss")}.png"
                });
// для примера сохраняем файл в локальном хранилище
                var newFile = Path.Combine(FileSystem.AppDataDirectory, photo.FileName);
                using (var stream = await photo.OpenReadAsync())
                using (var newStream = File.OpenWrite(newFile))
                    await stream.CopyToAsync(newStream);
// загружаем в ImageView
                img.Source = ImageSource.FromFile(photo.FullPath);
            }
            catch (Exception ex)
            {
                await DisplayAlert("Сообщение об ошибке", ex.Message, "OK");
            }
        }
    }
}
Слайд 14

Задания №1-2 Написать комментарий к коду Создать и протестировать приложение с использованием камеры.

Задания №1-2

Написать комментарий к коду
Создать и протестировать приложение с использованием камеры.

Слайд 15

Результат

Результат

Слайд 16

Контейнер компоновки - FlexLayout За основу нового контейнера компоновки была взята

Контейнер компоновки - FlexLayout

За основу нового контейнера компоновки была взята концепция FlexBox - модуля

CSS, который обеспечивает гибкую настройку размещения вложенных элементов.
Слайд 17

Свойство Direction устанавливает режим направления элементов: по горизонтали в строку или по вертикали в столбик.

Свойство Direction

устанавливает режим направления элементов: по горизонтали в строку или по

вертикали в столбик.
Слайд 18

Значения перечисления FlexDirection Row: расположение в строку RowReverse: расположение в строку

Значения перечисления FlexDirection

Row: расположение в строку
RowReverse: расположение в строку в обратном порядке
Column:

расположение в столбец
ColumnReverse: расположение в столбец в обратном порядке
Слайд 19

Пример №1. Расположение элементов в строке. xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="FlexLayoutApp.MainPage">

Пример №1. Расположение элементов в строке.


             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="FlexLayoutApp.MainPage">

        

BackgroundColor="SeaGreen" Text="Item 1" />
        
Слайд 20

Пример №1. Расположение элементов в строке. При таком расположении по умолчанию

Пример №1. Расположение элементов в строке.

При таком расположении по умолчанию высота

каждого элемента равна высоте контейнера, а ширина имеет значение, необходимое для отображения данного элемента.
Однако с помощью свойств HeightRequest и WidthRequest мы можем настроить соответственно высоту и ширину элемента.