Recepción de datos compartidos en la aplicación de Windows

El contrato de Windows Compartir permite que la aplicación aparezca en la hoja de recursos compartidos de Windows como una aplicación de destino, lo que permite a los usuarios compartir contenido de otras aplicaciones directamente en la suya. En este artículo se explica cómo controlar el contenido compartido una vez que la aplicación se activa como destino de recurso compartido.

Antes de seguir estos pasos, registre la aplicación como destino de recurso compartido:

Note

El modelo de activación para aplicaciones de escritorio winUI 3 difiere de UWP. En WinUI 3, la activación del recurso compartido se controla mediante AppInstance.GetActivatedEventArgs() en el código de inicio de la aplicación, no a través de Application.OnShareTargetActivated(). Las API ShareOperation y DataPackageView descritas en este artículo funcionan igual una vez que se obtiene ShareTargetActivatedEventArgs. Consulte Integración de aplicaciones empaquetadas con Windows Share para obtener el patrón de activación de SDK de Aplicaciones para Windows.

Elección de formatos de datos para admitir

Al declarar la aplicación como destino de recurso compartido en su manifiesto de paquete, se especifican los tipos de archivo y los formatos de datos que puede recibir la aplicación. Solo las aplicaciones que admiten los formatos que se comparten aparecen en la hoja de recursos compartidos.

Puede configurar los tipos admitidos de dos maneras:

Con el editor de manifiestos de Visual Studio:

  1. Abra package.appxmanifest en Visual Studio.
  2. Seleccione la pestaña Declaraciones .
  3. Elija Share Target (Compartir destino ) en la lista Declaraciones disponibles y, a continuación, seleccione Agregar.
  4. En Tipos de archivo admitidos, agregue las extensiones de archivo que controla la aplicación (por ejemplo, .jpg, .png). Seleccione SupportsAnyFileType para aceptar todos los tipos de archivo.
  5. En Formatos de datos, agregue los nombres de formato que controla la aplicación (por ejemplo, Text, Uri, Bitmap).

Directamente en el XML del manifiesto:

<Extensions>
  <uap:Extension Category="windows.shareTarget">
    <uap:ShareTarget>
      <uap:SupportedFileTypes>
        <uap:SupportsAnyFileType />
      </uap:SupportedFileTypes>
      <uap:DataFormat>Text</uap:DataFormat>
      <uap:DataFormat>Uri</uap:DataFormat>
      <uap:DataFormat>Bitmap</uap:DataFormat>
      <uap:DataFormat>StorageItems</uap:DataFormat>
    </uap:ShareTarget>
  </uap:Extension>
</Extensions>

Regístrate solo en los formatos que tu aplicación pueda manejar. Si declara un formato pero no puede procesarlo, la experiencia del usuario sufre.

Leer datos compartidos

Cuando tu aplicación se activa como destino para compartir, recibes un objeto ShareOperation a través de ShareTargetActivatedEventArgs. La propiedad Data es un DataPackageView que expone el contenido compartido.

Use Contains para comprobar qué formatos están disponibles y, a continuación, llame al método asincrónico adecuado para recuperar los datos:

ShareOperation shareOperation = args.ShareOperation;

if (shareOperation.Data.Contains(StandardDataFormats.Text))
{
    string text = await shareOperation.Data.GetTextAsync();
    // Process the shared text.
}

if (shareOperation.Data.Contains(StandardDataFormats.WebLink))
{
    Uri webLink = await shareOperation.Data.GetWebLinkAsync();
    // Process the shared link.
}

if (shareOperation.Data.Contains(StandardDataFormats.StorageItems))
{
    IReadOnlyList<IStorageItem> items = await shareOperation.Data.GetStorageItemsAsync();
    // Process the shared files or folders.
}

Estado de compartición de informes

Si el procesamiento de los datos compartidos tarda tiempo (por ejemplo, cargar archivos en un servidor), informe del progreso del sistema mediante los métodos de estado shareOperation . Esto permite al sistema administrar el ciclo de vida de la aplicación de origen de forma adecuada.

Llama a estos métodos en el orden indicado a medida que avanza la operación de uso compartido:

Método Cuándo llamar
ReportStarted En cuanto tu app empiece a procesar lo compartido. A partir de este momento, no se espera ninguna interacción adicional del usuario con la interfaz de usuario para compartir.
ReportDataRetrieved Una vez que la aplicación haya obtenido todos los datos que necesita de DataPackageView. Esto permite al sistema suspender o finalizar la aplicación de origen.
ReportSubmittedBackgroundTask Si la aplicación continúa procesando en segundo plano una vez que se cierra la interfaz para compartir.
ReportCompleted Cuando la aplicación haya terminado correctamente de procesar el contenido compartido.
ReportError Si se produce un error grave. El usuario ve el mensaje y finaliza la operación de uso compartido.
shareOperation.ReportStarted();

try
{
    string text = await shareOperation.Data.GetTextAsync();
    shareOperation.ReportDataRetrieved();

    // Perform any additional processing here...
    await ProcessSharedDataAsync(text);

    shareOperation.ReportCompleted();
}
catch (Exception)
{
    shareOperation.ReportError("Something went wrong. Please try again.");
}

Note

Llame a ReportError únicamente en caso de errores lo suficientemente graves como para interrumpir la operación de uso compartido. Para los errores recuperables, puede continuar procesando sin llamar a ReportError.

Note

Hay casos en los que una aplicación de destino puede llamar a ReportDataRetrieved antes ReportStarted, por ejemplo, si la aplicación recupera datos como parte del control de activación, pero solo llama ReportStarted más adelante cuando el usuario selecciona explícitamente un botón Compartir .

Cuando un usuario comparte contenido en tu aplicación, puedes devolver un QuickLink para agilizar el uso compartido en el futuro. Aparece QuickLink como un acceso directo en la hoja de recursos compartidos, por ejemplo, un acceso directo de contacto que permite al usuario compartir rápidamente con ese contacto sin navegar por la interfaz de usuario de la aplicación.

Un QuickLink tiene un título, un icono y un ID. El ID es el identificador interno de su aplicación para el acceso directo, como un ID de contacto o un nombre de cuenta. Cuando el usuario selecciona posteriormente un QuickLink, el sistema activa su aplicación y devuelve el identificador QuickLink mediante ShareOperation.QuickLinkId.

Devuelva un QuickLink pasándolo a ReportCompleted:

private async Task ReportCompletedWithQuickLink(
    ShareOperation shareOperation, string quickLinkId, string quickLinkTitle)
{
    QuickLink quickLinkInfo = new QuickLink
    {
        Id = quickLinkId,
        Title = quickLinkTitle,

        // QuickLink supported types are configured independently from the manifest.
        SupportedFileTypes = { "*" },
        SupportedDataFormats =
        {
            StandardDataFormats.Text,
            StandardDataFormats.WebLink,
            StandardDataFormats.Bitmap,
            StandardDataFormats.StorageItems
        }
    };

    StorageFile iconFile = await Windows.ApplicationModel.Package.Current
        .InstalledLocation.CreateFileAsync(
            "assets\\contact.png", CreationCollisionOption.OpenIfExists);
    quickLinkInfo.Thumbnail = RandomAccessStreamReference.CreateFromFile(iconFile);

    shareOperation.ReportCompleted(quickLinkInfo);
}

Note

Un QuickLink almacena solo el identificador, no los datos asociados. La aplicación se encarga de guardar los datos del usuario (como los datos de contacto) y recuperarlos cuando se activa QuickLink a través de ShareOperation.QuickLinkId.

Consulte también