Compartir a través de


Iniciar una aplicación en un dispositivo remoto

En este artículo se explica cómo iniciar una aplicación de Windows en un dispositivo remoto.

A partir de Windows 10, versión 1607, una aplicación para UWP puede iniciar una aplicación para UWP o una aplicación de escritorio de Windows de forma remota en otro dispositivo que también ejecuta Windows 10, versión 1607 o posterior, siempre que ambos dispositivos estén conectados con la misma cuenta Microsoft (MSA). Este es el caso de uso más sencillo de Project Rome.

La característica de inicio remoto permite experiencias de usuario orientadas a tareas; un usuario puede iniciar una tarea en un dispositivo y finalizarla en otra. Por ejemplo, si el usuario está escuchando música en su teléfono en su automóvil, entonces podría entregar la funcionalidad de reproducción a su Xbox One cuando llegan a casa. El inicio remoto permite que las aplicaciones pasen datos contextuales a la aplicación remota que se está iniciando, con el fin de recoger dónde se dejó la tarea.

Configuración preliminar

Adición de la funcionalidad remoteSystem

Para que la aplicación inicie una aplicación en un dispositivo remoto, debes agregar la remoteSystem funcionalidad al manifiesto del paquete de la aplicación. Puede usar el diseñador de manifiestos de paquete para agregarlo seleccionando Sistema remoto en la pestaña Capacidades, o bien puede agregar manualmente la siguiente línea al archivo Package.appxmanifest del proyecto.

<Capabilities>
   <uap3:Capability Name="remoteSystem"/>
</Capabilities>

Habilitación del uso compartido entre dispositivos

Además, el dispositivo cliente debe establecerse para permitir el uso compartido entre dispositivos. Esta configuración, a la que se accede en Configuración: Experiencias compartidas>del sistema>Compartir entre dispositivos, está habilitada de forma predeterminada.

página de configuración de experiencias compartidas

Buscar un dispositivo remoto

Primero debe encontrar el dispositivo con el que desea conectarse. Detectar dispositivos remotos describe cómo hacerlo con detalle. Usaremos un enfoque sencillo aquí que forgo el filtrado por dispositivo o tipo de conectividad. Crearemos un monitor de sistema remoto que busque dispositivos remotos y escribiremos controladores para los eventos que se generan cuando se detectan o quitan los dispositivos. Esto nos proporcionará una colección de dispositivos remotos.

El código de estos ejemplos requiere que tenga una using Windows.System.RemoteSystems instrucción en los archivos de clase.

private async Task BuildDeviceList()
{
    RemoteSystemAccessStatus accessStatus = await RemoteSystem.RequestAccessAsync();

    if (accessStatus == RemoteSystemAccessStatus.Allowed)
    {
        m_remoteSystemWatcher = RemoteSystem.CreateWatcher();

        // Subscribing to the event raised when a new remote system is found by the watcher.
        m_remoteSystemWatcher.RemoteSystemAdded += RemoteSystemWatcher_RemoteSystemAdded;

        // Subscribing to the event raised when a previously found remote system is no longer available.
        m_remoteSystemWatcher.RemoteSystemRemoved += RemoteSystemWatcher_RemoteSystemRemoved;

        m_remoteSystemWatcher.Start();
    }
}

Lo primero que debe hacer antes de realizar un inicio remoto es llamar a RemoteSystem.RequestAccessAsync(). Compruebe el valor devuelto para asegurarse de que la aplicación tenga permiso para acceder a dispositivos remotos. Una razón por la que esta comprobación podría producir un error es si no has agregado la funcionalidad a la remoteSystem aplicación.

Se llama a los controladores de eventos del monitor del sistema cuando se detecta un dispositivo con el que podemos conectarse o ya no está disponible. Usaremos estos controladores de eventos para mantener una lista actualizada de dispositivos a los que podemos conectarse.

private void RemoteSystemWatcher_RemoteSystemRemoved(
    RemoteSystemWatcher sender, RemoteSystemRemovedEventArgs args)
{
    if ( m_deviceMap.ContainsKey(args.RemoteSystemId))
    {
        m_deviceList.Remove(m_deviceMap[args.RemoteSystemId]);
        m_deviceMap.Remove(args.RemoteSystemId);
    }
}

private void RemoteSystemWatcher_RemoteSystemAdded(
    RemoteSystemWatcher sender, RemoteSystemAddedEventArgs args)
{
    m_deviceList.Add(args.RemoteSystem);
    m_deviceMap.Add(args.RemoteSystem.Id, args.RemoteSystem);
}

Realizaremos un seguimiento de los dispositivos por identificador de sistema remoto mediante un diccionario. ObservableCollection se usa para contener la lista de dispositivos que podemos enumerar. Un ObservableCollection también facilita el enlace de la lista de dispositivos a la interfaz de usuario, aunque no lo haremos en este ejemplo.

private RemoteSystemWatcher m_remoteSystemWatcher;
private ObservableCollection<RemoteSystem> m_deviceList = new ObservableCollection<RemoteSystem>();
private Dictionary<string, RemoteSystem> m_deviceMap = new Dictionary<string, RemoteSystem>();

Agregue una llamada a BuildDeviceList() en el código de inicio de la aplicación antes de intentar iniciar una aplicación remota.

Iniciar una aplicación en un dispositivo remoto

Inicie una aplicación de forma remota pasando el dispositivo con el que desea conectarse a la API RemoteLauncher.LaunchUriAsync. Hay tres sobrecargas para este método. El más sencillo, que muestra este ejemplo, especifica el URI que activará la aplicación en el dispositivo remoto. En este ejemplo, el URI abre la aplicación Maps en el equipo remoto con una vista 3D de space Needle.

Otras sobrecargas RemoteLauncher.LaunchUriAsync permiten especificar opciones como el URI del sitio web para ver si no se puede iniciar ninguna aplicación adecuada en el dispositivo remoto y una lista opcional de nombres de familia de paquetes que se podrían usar para iniciar el URI en el dispositivo remoto. También puede proporcionar datos en forma de pares clave-valor. Puede pasar datos a la aplicación que está activando para proporcionar contexto a la aplicación remota, como el nombre de la canción para reproducir y la ubicación de reproducción actual al entregar la reproducción de un dispositivo a otro.

En escenarios prácticos, puede proporcionar la interfaz de usuario para seleccionar el dispositivo al que desea dirigirse. Pero para simplificar este ejemplo, solo usaremos el primer dispositivo remoto de la lista.

if ( m_deviceList.Count > 0)
{
    RemoteSystem SelectedDevice = m_deviceList[0];
    RemoteLaunchUriStatus launchUriStatus = 
        await RemoteLauncher.LaunchUriAsync(
            new RemoteSystemConnectionRequest(SelectedDevice), 
            new Uri("bingmaps:?cp=47.6204~-122.3491&sty=3d&rad=200&pit=75&hdg=165"));
}

El objeto RemoteLaunchUriStatus que se devuelve desde RemoteLauncher.LaunchUriAsync() proporciona información sobre si el inicio remoto se realizó correctamente y, de lo contrario, el motivo por el que.

Referencia de api de sistemas remotos
Introducción a aplicaciones y dispositivos conectados (Project Rome)
Detectar dispositivos remotos
El ejemplo de sistemas remotos muestra cómo detectar un sistema remoto, iniciar una aplicación en un sistema remoto y usar servicios de aplicaciones para enviar mensajes entre aplicaciones que se ejecutan en dos sistemas.