Xamarin.Essentials: Selector
La clase Launcher permite que una aplicación abra un URI por el sistema. A menudo se usa al vincular en profundidad en los esquemas de URI personalizados de otra aplicación. Si quiere abrir el explorador en un sitio web, debe hacer referencia a la API Browser .
Primeros pasos
Para empezar a usar esta API, lea la guía de introducción para Xamarin.Essentials con el fin de asegurarse de que la biblioteca está correctamente instalada y configurada en los proyectos.
Uso de Launcher
Agregue una referencia a Xamarin.Essentials en la clase:
using Xamarin.Essentials;
Para usar la funcionalidad Launcher, llame al método OpenAsync
y pase un string
o Uri
para abrirla. Si quiere, el método CanOpenAsync
se puede usar para comprobar si el esquema de URI se puede administrar desde una aplicación del dispositivo.
public class LauncherTest
{
public async Task OpenRideShareAsync()
{
var supportsUri = await Launcher.CanOpenAsync("lyft://");
if (supportsUri)
await Launcher.OpenAsync("lyft://ridetype?id=lyft_line");
}
}
Esto se puede combinar en una sola llamada con TryOpenAsync
, que comprueba si se puede abrir el parámetro y, si es así, lo abre.
public class LauncherTest
{
public async Task<bool> OpenRideShareAsync()
{
return await Launcher.TryOpenAsync("lyft://ridetype?id=lyft_line");
}
}
Configuración de una plataforma adicional
Archivos
Esta característica permite a una aplicación solicitar a otras que abran y vean un archivo. Xamarin.Essentials detectará automáticamente el tipo de archivo (MIME) y solicitará su apertura.
A continuación se muestra un ejemplo de cómo escribir texto y cómo solicitar la apertura:
var fn = "File.txt";
var file = Path.Combine(FileSystem.CacheDirectory, fn);
File.WriteAllText(file, "Hello World");
await Launcher.OpenAsync(new OpenFileRequest
{
File = new ReadOnlyFile(file)
});
Ubicación de presentación al abrir archivos
Al solicitar un recurso compartido o abrir el iniciador en iPadOS, tiene la posibilidad de presentar un control emergente. Esto especifica dónde aparecerá la ventana emergente y dónde apuntará directamente una flecha. Esta ubicación suele ser el control que inició la acción. Puede especificar la ubicación con la propiedad PresentationSourceBounds
:
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
});
await Launcher.OpenAsync(new OpenFileRequest
{
File = new ReadOnlyFile(file),
PresentationSourceBounds = DeviceInfo.Platform== DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
? new System.Drawing.Rectangle(0, 20, 0, 0)
: System.Drawing.Rectangle.Empty
});
Todo lo que se describe aquí funciona igual para Share
y Launcher
.
Si usa Xamarin.Forms, podrá pasar View
y calcular los límites:
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);
}
Después, se puede usar al llamar a RequestAsync
:
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
}
}
Puede pasar el elemento que realiza la llamada cuando se desencadene Command
:
<Button Text="Share"
Command="{Binding ShareWithFriendsCommand}"
CommandParameter="{Binding Source={RelativeSource Self}}"/>