Xamarin.Essentials. Общий доступXamarin.Essentials: Share

Класс Share позволяет приложению обмениваться данными, такими как текст и веб-ссылки, с другими приложениями на устройстве.The Share class enables an application to share data such as text and web links to other applications on the device.

Начало работыGet started

Чтобы начать использовать этот API, ознакомьтесь с руководством по началу работы с Xamarin.Essentials, чтобы правильно настроить и установить библиотеку в проектах.To start using this API, read the getting started guide for Xamarin.Essentials to ensure the library is properly installed and set up in your projects.

Использование класса ShareUsing Share

Добавьте ссылку на Xamarin.Essentials в своем классе:Add a reference to Xamarin.Essentials in your class:

using Xamarin.Essentials;

Чтобы использовать функции класса Share, вызовите метод RequestAsync с полезными данными запроса, включающего сведения для обмена с другими приложениями.The Share functionality works by calling the RequestAsync method with a data request payload that includes information to share to other applications. Текст и URI могут сочетаться, и каждая платформа будет выполнять фильтрацию по содержимому.Text and Uri can be mixed and each platform will handle filtering based on content.


public class ShareTest
{
    public async Task ShareText(string text)
    {
        await Share.RequestAsync(new ShareTextRequest
            {
                Text = text,
                Title = "Share Text"
            });
    }

    public async Task ShareUri(string uri)
    {
        await Share.RequestAsync(new ShareTextRequest
            {
                Uri = uri,
                Title = "Share Web Link"
            });
    }
}

Пользовательский интерфейс для общего использования с внешним приложением, отображаемый при запросе:User interface to share to external application that appears when request is made:

Пользовательский интерфейс для общего использования с внешним приложением

ФайлFile

Эта функция позволяет приложению предоставлять общий доступ к файлам для других приложений на устройстве.This features enables an app to share files to other applications on the device. Xamarin.Essentials автоматически обнаруживает тип файла (MIME) и запрашивает его добавление в общий доступ.Xamarin.Essentials will automatically detect the file type (MIME) and request a share. Каждая платформа может поддерживать только определенные расширения файлов.Each platform may only support specific file extensions.

Ниже приведен пример записи текста на диск и предоставления общего доступа к нему другим приложениям.Here is a sample of writing text to disk and sharing it to other apps:

var fn =  "Attachment.txt";
var file = Path.Combine(FileSystem.CacheDirectory, fn);
File.WriteAllText(file, "Hello World");

await Share.RequestAsync(new ShareFileRequest
{
    Title = Title,
    File = new ShareFile(file)
});

несколько файловMultiple Files

Использование нескольких общих файлов отличается от использования одного файла только возможностью одновременно отправлять несколько файлов:The usage of share multiple files differs from the single file only in the ability of sending several files at once:

var file1 = Path.Combine(FileSystem.CacheDirectory, "Attachment1.txt");
File.WriteAllText(file, "Content 1");
var file2 = Path.Combine(FileSystem.CacheDirectory, "Attachment2.txt");
File.WriteAllText(file, "Content 2");

await Share.RequestAsync(new ShareMultipleFilesRequest
{
    Title = ShareFilesTitle,
    Files = new ShareFile[] { new ShareFile(file1), new ShareFile(file2) }
});

Расположение презентацииPresentation Location

Запрашивая общую папку на iPadOS, вы можете использовать всплывающий элемент поверх элемента управления.When requesting a share on iPadOS you have the ability to present in a pop over control. При этом определяется место отображения всплывающего элемента, а также указывается стрелка на него.This specifies where the pop over will appear and point an arrow directly to. В этом расположении обычно указывается элемент управления, который инициировал действие.This location is often the control that launched the action. Расположение можно указать с помощью свойства PresentationSourceBounds:You can specify the location using the PresentationSourceBounds property:

await Share.RequestAsync(new ShareFileRequest
{
    Title = Title,
    File = new ShareFile(file),
    PresentationSourceBounds = DeviceInfo.Platform== DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
                            ? new System.Drawing.Rectangle(0, 20, 0, 0)
                            : System.Drawing.Rectangle.Empty
});

Если вы используете Xamarin.Forms, можете передать View и вычислить границы:If you are using Xamarin.Forms you are able to pass in a View and calculate the bounds:

public static class ViewHelpers
{
    public static Rectangle GetAbsoluteBounds(this Xamarin.Forms.View element)
    {
        Element looper = element;

        var absoluteX = element.X + element.Margin.Top;
        var absoluteY = element.Y + element.Margin.Left;

        // Add logic to handle titles, headers, or other non-view bars

        while (looper.Parent != null)
        {
            looper = looper.Parent;
            if (looper is Xamarin.Forms.View v)
            {
                absoluteX += v.X + v.Margin.Top;
                absoluteY += v.Y + v.Margin.Left;
            }
        }

        return new Rectangle(absoluteX, absoluteY, element.Width, element.Height);
    }

    public static System.Drawing.Rectangle ToSystemRectangle(this Rectangle rect) =>
        new System.Drawing.Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height);
}

Затем при вызове RequstAsync можете использовать следующий код:This can then be used when calling RequstAsync:

public Command<Xamarin.Forms.View> ShareCommand { get; } = new Command<Xamarin.Forms.View>(Share);
async void Share(Xamarin.Forms.View element)
{
    try
    {
        Analytics.TrackEvent("ShareWithFriends");
        var bounds = element.GetAbsoluteBounds();

        await Share.RequestAsync(new ShareTextRequest
        {
            PresentationSourceBounds = bounds.ToSystemRectangle(),
            Title = "Title",
            Text = "Text"
        });
    }
    catch (Exception)
    {
        // Handle exception that share failed
    }
}

Вы можете передать вызывающий элемент при активации Command:You can pass in the calling element when the Command is triggered:

<Button Text="Share"
        Command="{Binding ShareWithFriendsCommand}"
        CommandParameter="{Binding Source={RelativeSource Self}}"/>

Различия платформPlatform Differences

  • Свойство Subject используется для требуемой темы сообщения.Subject property is used for desired subject of a message.

APIAPI

Другие видео о Xamarin см. на Channel 9 и YouTube.Find more Xamarin videos on Channel 9 and YouTube.