Compartilhar via


Iniciar um app em um dispositivo remoto

Este artigo explica como iniciar um aplicativo do Windows em um dispositivo remoto.

A partir do Windows 10, versão 1607, um aplicativo UWP pode iniciar um aplicativo UWP ou aplicativo da área de trabalho do Windows remotamente em outro dispositivo que também esteja executando o Windows 10, versão 1607 ou posterior, desde que ambos os dispositivos estejam conectados com a mesma MSA (Conta Microsoft). Este é o caso de uso mais simples do Projeto Roma.

O recurso de inicialização remota permite experiências de usuário orientadas a tarefas; Um usuário pode iniciar uma tarefa em um dispositivo e terminá-la em outro. Por exemplo, se o usuário estiver ouvindo música em seu telefone no carro, ele poderá transferir a funcionalidade de reprodução para o Xbox One quando chegar em casa. A inicialização remota permite que os aplicativos passem dados contextuais para o aplicativo remoto que está sendo iniciado, a fim de continuar de onde a tarefa foi interrompida.

Configuração preliminar

Adicionar a funcionalidade remoteSystem

Para que seu aplicativo inicie um aplicativo em um dispositivo remoto, você deve adicionar a funcionalidade ao manifesto remoteSystem do pacote do aplicativo. Você pode usar o designer de manifesto do pacote para adicioná-lo selecionando Sistema Remoto na guia Recursos ou pode adicionar manualmente a linha a seguir ao arquivo Package.appxmanifest do projeto.

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

Ativar o compartilhamento entre dispositivos

Além disso, o dispositivo cliente deve ser configurado para permitir o compartilhamento entre dispositivos. Essa configuração, que é acessada em Configurações: Experiências>compartilhadas do sistema>Compartilhar entre dispositivos, é ativada por padrão.

Página de configurações de experiências compartilhadas

Localizar um dispositivo remoto

Você deve primeiro encontrar o dispositivo com o qual deseja se conectar. Descubra dispositivos remotos discute como fazer isso em detalhes. Usaremos uma abordagem simples aqui que renuncia à filtragem por dispositivo ou tipo de conectividade. Criaremos um observador de sistema remoto que procura dispositivos remotos e gravaremos manipuladores para os eventos que são gerados quando os dispositivos são descobertos ou removidos. Isso nos fornecerá uma coleção de dispositivos remotos.

O código nesses exemplos requer que você tenha uma using Windows.System.RemoteSystems instrução em seus arquivos de classe.

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();
    }
}

A primeira coisa que você deve fazer antes de fazer um lançamento remoto é chamar RemoteSystem.RequestAccessAsync(). Verifique o valor retornado para garantir que seu aplicativo tenha permissão para acessar dispositivos remotos. Um motivo pelo qual essa verificação pode falhar é se você não tiver adicionado o remoteSystem recurso ao seu aplicativo.

Os manipuladores de eventos do inspetor do sistema são chamados quando um dispositivo com o qual podemos nos conectar é descoberto ou não está mais disponível. Usaremos esses manipuladores de eventos para manter uma lista atualizada de dispositivos aos quais podemos nos conectar.

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);
}

Rastrearemos os dispositivos por ID de sistema remoto usando um dicionário. Um ObservableCollection é usado para manter a lista de dispositivos que podemos enumerar. Um ObservableCollection também facilita a associação da lista de dispositivos à interface do usuário, embora não façamos isso neste exemplo.

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

Adicione uma chamada ao código de inicialização do BuildDeviceList() aplicativo antes de tentar iniciar um aplicativo remoto.

Iniciar um app em um dispositivo remoto

Inicie um aplicativo remotamente passando o dispositivo com o qual você deseja se conectar para a API RemoteLauncher.LaunchUriAsync. Há três sobrecargas para esse método. O mais simples, que este exemplo demonstra, especifica o URI que ativará o aplicativo no dispositivo remoto. Neste exemplo, o URI abre o aplicativo Mapas na máquina remota com uma exibição 3D do Space Needle.

Outras sobrecargas RemoteLauncher.LaunchUriAsync permitem que você especifique opções como o URI do site a ser exibido se nenhum aplicativo apropriado pode ser iniciado no dispositivo remoto e uma lista opcional de nomes de família de pacotes que podem ser usados para iniciar o URI no dispositivo remoto. Você também pode fornecer dados na forma de pares chave/valor. Você pode passar dados para o aplicativo que está ativando para fornecer contexto ao aplicativo remoto, como o nome da música a ser reproduzida e o local de reprodução atual ao transferir a reprodução de um dispositivo para outro.

Em cenários práticos, você pode fornecer a interface do usuário para selecionar o dispositivo que deseja direcionar. Mas, para simplificar este exemplo, usaremos apenas o primeiro dispositivo remoto da 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"));
}

O objeto RemoteLaunchUriStatus retornado de RemoteLauncher.LaunchUriAsync() fornece informações sobre se a inicialização remota foi bem-sucedida e, se não, o motivo.

Referência da API de Sistemas Remotos
Visão geral de aplicativos e dispositivos conectados (Project Rome)
Descobrir dispositivos remotos
O exemplo de Sistemas Remotos demonstra como descobrir um sistema remoto, iniciar um aplicativo em um sistema remoto e usar os serviços de aplicativo para enviar mensagens entre aplicativos em execução em dois sistemas.