Enumerar dispositivos

As APIs Windows.Devices.Enumeration permitem localizar dispositivos conectados internamente ao sistema, conectados externamente ou detectáveis por meio de protocolos sem fio ou de rede.

Samples

A maneira mais fácil de enumerar todos os dispositivos disponíveis é tirar um instantâneo com o comando FindAllAsync (explicado mais adiante em uma seção abaixo).

async void enumerateSnapshot(){
  DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}

Consulte o exemplo de enumeração e emparelhamento de dispositivos para ver um exemplo mais avançado das APIs Windows.Devices.Enumeration.

APIs de enumeração

O Windows. Devices.Enumeration namespace permite encontrar dispositivos conectados internamente ao sistema, conectados externamente ou detectáveis por protocolos sem fio ou de rede. Alguns dos recursos compatíveis com essas APIs incluem:

  • Localizando um dispositivo ao qual se conectar com seu aplicativo.
  • Obter informações sobre dispositivos conectados ou detectáveis pelo sistema.
  • Fazer com que um aplicativo receba notificações quando os dispositivos são adicionados, se conectam, desconectam, alteram o status online ou alteram outras propriedades.
  • Fazer com que um aplicativo receba gatilhos em segundo plano quando os dispositivos se conectam, desconectam, alteram o status online ou alteram outras propriedades.

Essas APIs podem enumerar dispositivos por qualquer um dos seguintes protocolos e barramentos, desde que cada dispositivo e o sistema em que o aplicativo é executado sejam compatíveis com essa tecnologia. Essa não é uma lista completa e outros protocolos podem ser compatíveis com um dispositivo específico.

Em muitos casos, você não precisará se preocupar em usar as APIs de enumeração. Isso ocorre porque muitas APIs que usam dispositivos selecionarão automaticamente o dispositivo padrão apropriado ou fornecerão uma API de enumeração mais simplificada. Por exemplo, MediaElement usará automaticamente o dispositivo de renderizador de áudio padrão. Desde que seu aplicativo possa usar o dispositivo padrão, não é necessário usar as APIs de enumeração em seu aplicativo. As APIs de enumeração fornecem uma maneira geral e flexível para você descobrir e se conectar aos dispositivos disponíveis. Este tópico fornece informações sobre a enumeração de dispositivos e descreve as quatro maneiras comuns de enumerar dispositivos.

  • Usando o DevicePicker interface do usuário
  • Enumerando um instantâneo de dispositivos atualmente detectáveis pelo sistema
  • Enumerando dispositivos atualmente detectáveis e observe as alterações
  • Enumerar os dispositivos atualmente passíveis de descoberta e monitorar alterações em uma tarefa em segundo plano

objetos DeviceInformation

Trabalhando com as APIs de enumeração, você precisará usar frequentemente DeviceInformation objetos. Esses objetos contêm a maioria das informações disponíveis sobre o dispositivo. A tabela a seguir explica algumas das propriedades DeviceInformation nas quais você se interessará. Para obter uma lista completa, consulte a página de referência para DeviceInformation.

Property Comments
DeviceInformation.Id Esse é o identificador exclusivo do dispositivo e é fornecido como uma variável de cadeia de caracteres. Na maioria dos casos, esse é um valor opaco que você simplesmente passará de um método para outro para indicar o dispositivo específico em que você está interessado. Você também pode usar essa propriedade e a propriedade DeviceInformation.Kind depois de fechar seu aplicativo e reabri-lo. Isso garantirá que você possa recuperar e reutilizar o mesmo objeto DeviceInformation.
DeviceInformation.Kind Isso indica o tipo de objeto de dispositivo representado pelo objeto DeviceInformation. Esta não é a categoria do dispositivo nem o tipo de dispositivo. Um único dispositivo pode ser representado por vários objetos DeviceInformation diferentes de diferentes tipos. Os valores possíveis para essa propriedade são listados em DeviceInformationKind , bem como como eles se relacionam entre si.
DeviceInformation.Properties Este conjunto de propriedades contém informações solicitadas para o objeto DeviceInformation. As propriedades mais comuns são facilmente referenciadas como propriedades do objeto DeviceInformation , como com DeviceInformation.Name. Para obter mais informações, consulte as propriedades de informações do dispositivo.

 

Interface do usuário do DevicePicker

O DevicePicker é um controle fornecido por Windows que cria uma interface do usuário pequena que permite ao usuário selecionar um dispositivo em uma lista. Ele pode ser personalizado de algumas maneiras, como:

  • Controlar dispositivos exibidos na interface do usuário adicionando um SupportedDeviceSelectors, um SupportedDeviceClasses ou ambos ao DevicePicker.Filter. Na maioria dos casos, você só precisa adicionar um seletor ou classe, mas se precisar de mais de um, poderá adicionar vários. Se você adicionar vários seletores ou classes, eles serão unidos usando uma função lógica OR.
  • Especifique as propriedades que você deseja recuperar para os dispositivos. Você pode fazer isso adicionando propriedades a DevicePicker.RequestedProperties.
  • Altere a aparência do DevicePicker usando Appearance.
  • Especifique o tamanho e o local do DevicePicker quando ele é exibido.

Embora o DevicePicker seja exibido, o conteúdo da interface do usuário será atualizado automaticamente se os dispositivos forem adicionados, removidos ou atualizados.

Note

Não é possível especificar o DeviceInformationKind usando o DevicePicker. Se você quiser ter dispositivos de um DeviceInformationKind específico, será necessário criar um DeviceWatcher e fornecer sua própria interface do usuário.

A transmissão de conteúdo e o DIAL também oferecem, cada um, seu próprio seletor, se você quiser usá-los. Eles são CastingDevicePicker e DialDevicePicker, respectivamente.

Enumerar uma captura dos dispositivos

Em alguns cenários, o DevicePicker não será adequado para suas necessidades e você precisará de algo mais flexível. Talvez você queira criar sua própria interface do usuário ou precisar enumerar dispositivos sem exibir uma interface do usuário para o usuário. Nessas situações, você pode listar instantaneamente os dispositivos. Isso envolve examinar os dispositivos que estão atualmente conectados ou emparelhados com o sistema. No entanto, você precisa estar ciente de que esse método considera apenas um retrato dos dispositivos disponíveis no momento, portanto, não será possível encontrar dispositivos que se conectarem após percorrer a lista. Você também não será notificado se um dispositivo for atualizado ou removido. Outra possível desvantagem a se considerar é que esse método reterá quaisquer resultados até que toda a enumeração seja concluída. Por esse motivo, você não deve usar esse método quando estiver interessado em objetos AssociationEndpoint, AssociationEndpointContainer ou AssociationEndpointService , pois eles são encontrados em uma rede ou protocolo sem fio. Isso pode levar até 30 segundos para ser concluído. Nesse cenário, você deve usar um objeto DeviceWatcher para enumerar por meio dos dispositivos possíveis.

Para enumerar por meio de um instantâneo de dispositivos, use o método FindAllAsync . Esse método aguarda até que todo o processo de enumeração seja concluído e retorna todos os resultados como um objeto DeviceInformationCollection . Esse método também é sobrecarregado para fornecer várias opções para filtrar seus resultados e limitá-los aos dispositivos nos quais você está interessado. Você pode fazer isso fornecendo um DeviceClass ou passando um seletor de dispositivo. O seletor de dispositivo é uma cadeia de caracteres AQS (Sintaxe de Consulta Avançada) que especifica os dispositivos que você deseja enumerar. Para obter mais informações, consulte Criar um seletor de dispositivo.

Além de limitar os resultados, você também pode especificar as propriedades que deseja recuperar para os dispositivos. Se você fizer isso, as propriedades especificadas estarão disponíveis no recipiente de propriedades para cada um dos objetos DeviceInformation retornados na coleção. É importante observar que nem todas as propriedades estão disponíveis para todos os tipos de dispositivo. Para ver quais propriedades estão disponíveis para quais tipos de dispositivo, consulte as propriedades de informações do dispositivo.

Enumerar e observar dispositivos

Um método mais poderoso e flexível de enumerar dispositivos é criar um DeviceWatcher. Essa opção fornece a maior flexibilidade ao enumerar dispositivos. Ele permite enumerar dispositivos que estão presentes no momento e também receber notificações quando os dispositivos que correspondem ao seletor de dispositivo forem adicionados, removidos ou as propriedades forem alterados. Ao criar um DeviceWatcher, você fornece um seletor de dispositivo. Para obter mais informações sobre seletores de dispositivo, consulte Criar um seletor de dispositivo. Depois de criar o observador, você receberá as notificações a seguir para qualquer dispositivo que corresponda aos critérios fornecidos.

  • Adicione uma notificação quando um novo dispositivo for adicionado.
  • Atualize a notificação quando uma propriedade em que você está interessado for alterada.
  • Remova a notificação quando um dispositivo não estiver mais disponível ou não corresponder mais ao filtro.

Na maioria dos casos em que você está usando um DeviceWatcher, você está mantendo uma lista de dispositivos e adicionando a ele, removendo itens dele ou atualizando itens à medida que seu observador recebe atualizações dos dispositivos que você está assistindo. Quando você receber uma notificação de atualização, as informações atualizadas estarão disponíveis como um objeto DeviceInformationUpdate . Para atualizar sua lista de dispositivos, primeiro encontre a DeviceInformation adequada que foi alterada. Em seguida, chame o método Update para esse objeto, fornecendo o objeto DeviceInformationUpdate . Essa é uma função de conveniência que atualizará automaticamente o objeto DeviceInformation .

Como um DeviceWatcher envia notificações à medida que os dispositivos chegam e, quando eles são alterados, você deve usar esse método de enumeração de dispositivos quando estiver interessado em AssociationEndpoint, AssociationEndpointContainer ou AssociationEndpointService objetos, pois eles são enumerados por meio de protocolos sem fio ou de rede.

Para criar um DeviceWatcher, use um dos métodos CreateWatcher. Esses métodos são sobrecarregados para permitir que você especifique os dispositivos nos quais você está interessado. Você pode fazer isso fornecendo um DeviceClass ou passando um seletor de dispositivo. O seletor de dispositivo é uma cadeia de caracteres do AQS que especifica os dispositivos que você deseja enumerar. Para obter mais informações, consulte Criar um seletor de dispositivo. Você também pode especificar as propriedades que deseja obter para os dispositivos nos quais está interessado. Se você fizer isso, as propriedades especificadas estarão disponíveis no recipiente de propriedades para cada um dos objetos DeviceInformation retornados na coleção. É importante observar que nem todas as propriedades estão disponíveis para todos os tipos de dispositivo. Para ver quais propriedades estão disponíveis para quais tipos de dispositivo, consulte as propriedades de informações do dispositivo

Observar dispositivos como uma tarefa em segundo plano

Observar dispositivos como uma tarefa em segundo plano é muito semelhante à criação de um DeviceWatcher conforme descrito acima. Na verdade, você ainda precisará criar um objeto DeviceWatcher normal primeiro, conforme descrito na seção anterior. Depois de criá-lo, você chama GetBackgroundTrigger em vez de DeviceWatcher.Start. Ao chamar GetBackgroundTrigger, você deve especificar em quais notificações você está interessado: adicionar, remover ou atualizar. Você não pode solicitar atualização ou remoção sem solicitar adição também. Depois de registrar o gatilho, o DeviceWatcher começará a ser executado imediatamente em segundo plano. Daqui em diante, sempre que a tarefa em segundo plano receber uma nova notificação para seu aplicativo que atenda aos seus critérios, ela será acionada e fornecerá as alterações mais recentes desde a última vez que acionou seu aplicativo.

Importante

A primeira vez em que o DeviceWatcherTrigger acionará o aplicativo será quando o monitor atingir o estado EnumerationCompleted. Isso significa que ele conterá todos os resultados iniciais. Em tempos futuros em que disparar seu aplicativo, ele conterá apenas as notificações de adição, atualização e remoção que ocorreram desde o último gatilho. Isso é um pouco diferente de um objeto DeviceWatcher em primeiro plano, porque os resultados iniciais não são retornados um de cada vez e são fornecidos apenas em um lote, somente depois que EnumerationCompleted é alcançado.

Alguns protocolos sem fio se comportam de forma diferente se estiverem fazendo varredura em segundo plano ou em primeiro plano, ou podem não oferecer suporte à varredura em segundo plano de forma alguma. Há três possibilidades com relação à verificação em segundo plano. A tabela a seguir lista as possibilidades e os efeitos que isso pode ter em seu aplicativo. Por exemplo, Bluetooth e Wi-Fi Direct não dão suporte a verificações em segundo plano, portanto, por extensão, eles não dão suporte a um DeviceWatcherTrigger.

Behavior Impacto
Mesmo comportamento em segundo plano None
Somente verificações passivas possíveis em segundo plano O dispositivo pode demorar mais para ser detectado enquanto aguarda a ocorrência de uma varredura passiva.
Não há suporte para verificações em segundo plano Nenhum dispositivo será detectável pelo DeviceWatcherTrigger e nenhuma atualização será relatada.

 Se o DeviceWatcherTrigger incluir um protocolo que não oferece suporte à varredura em uma tarefa em segundo plano, o gatilho ainda funcionará. No entanto, você não poderá obter atualizações ou resultados sobre esse protocolo. As atualizações de outros protocolos ou dispositivos ainda serão detectadas normalmente.

Usando DeviceInformationKind

Na maioria dos cenários, você não precisará se preocupar com o DeviceInformationKind de um objeto DeviceInformation. Isso ocorre porque o seletor de dispositivo retornado pela API do dispositivo que você está usando geralmente garante que você está recebendo os tipos corretos de objetos de dispositivo a serem usados com a API deles. No entanto, em alguns cenários, você desejará obter o DeviceInformation para dispositivos, mas não há uma API de dispositivo correspondente para fornecer um seletor de dispositivo. Nesses casos, você precisará criar seu próprio seletor. Por exemplo, os Serviços Web para Dispositivos não têm uma API dedicada, mas você pode descobrir esses dispositivos e obter informações sobre eles usando as APIs Windows.Devices.Enumeration e depois usá-los por meio das APIs de soquete.

Se você estiver criando seu próprio seletor de dispositivos para enumerar objetos de dispositivo, DeviceInformationKind será importante que você entenda. Todos os tipos possíveis, bem como como eles se relacionam entre si, são descritos na página de referência para DeviceInformationKind. Um dos usos mais comuns de DeviceInformationKind é especificar que tipo de dispositivos você está procurando ao enviar uma consulta em conjunto com um seletor de dispositivo. Ao fazer isso, garante-se que você enumere apenas os dispositivos que correspondem ao DeviceInformationKind fornecido. Por exemplo, você pode encontrar um objeto DeviceInterface e, em seguida, executar uma consulta para obter as informações do objeto device pai. Esse objeto pai pode conter informações adicionais.

É importante observar que as propriedades disponíveis no recipiente de propriedades para um objeto DeviceInformation variam dependendo do DeviceInformationKind do dispositivo. Determinadas propriedades só estão disponíveis com determinados tipos. Para obter mais informações sobre quais propriedades estão disponíveis para quais tipos, consulte as propriedades de informações do dispositivo. Portanto, no exemplo acima, a pesquisa do dispositivo pai lhe dará acesso a mais informações que não estavam disponíveis no objeto do dispositivo DeviceInterface . Por isso, quando você cria suas cadeias de caracteres de filtro do AQS, é importante garantir que as propriedades solicitadas estejam disponíveis para os objetos DeviceInformationKind que você está enumerando. Para obter mais informações sobre como criar um filtro, consulte Criar um seletor de dispositivo.

Ao enumerar objetos AssociationEndpoint, AssociationEndpointContainer ou AssociationEndpointService , você está enumerando por um protocolo sem fio ou de rede. Nessas situações, recomendamos que você não use FindAllAsync e, em vez disso, use CreateWatcher. Isso ocorre porque pesquisar em uma rede geralmente resulta em operações de pesquisa que não expiram antes de 10 segundos ou mais, antes de gerar EnumerationCompleted. FindAllAsync não conclui sua operação até que EnumerationCompleted seja disparado. Se você estiver usando um DeviceWatcher, obterá resultados mais próximos do tempo real, independentemente de quando EnumerationCompleted for chamado.

Salvar um dispositivo para uso posterior

Qualquer objeto DeviceInformation é identificado exclusivamente pela combinação de duas partes de informação: DeviceInformation.Id e DeviceInformation.Kind. Se você mantiver essas duas informações, poderá recriar um objeto DeviceInformation depois que ele for perdido fornecendo essas informações para CreateFromIdAsync. Se você fizer isso, poderá salvar as preferências do usuário para um dispositivo que se integra ao seu aplicativo.