Enumerar dispositivos
As APIs Windows.Devices.Enumeration permitem que você encontre dispositivos conectados internamente ao sistema, conectados externamente ou detectáveis por protocolos sem fio ou de rede.
Amostras
A maneira mais fácil de enumerar todos os dispositivos disponíveis é tirar um instantâneo com o comando FindAllAsync (explicado mais detalhadamente em uma seção abaixo).
async void enumerateSnapshot(){
DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}
Consulte o exemplo de enumeração e emparelhamento de dispositivos para obter um exemplo mais avançado das APIs Windows.Devices.Enumeration.
APIs de enumeração
O namespace Windows.Devices.Enumeration permite que você encontre dispositivos conectados internamente ao sistema, conectados externamente ou detectáveis por protocolos sem fio ou de rede. Alguns dos recursos suportados por essas APIs incluem:
- Encontrar um dispositivo para se conectar ao seu aplicativo.
- Obter informações sobre dispositivos conectados ou detectáveis pelo sistema.
- Faça com que um aplicativo receba notificações quando os dispositivos forem adicionados, conectados, desconectados, alterados o status online ou outras propriedades.
- Faça com que um aplicativo receba gatilhos em segundo plano quando os dispositivos se conectarem, se desconectarem, alterarem o status online ou alterarem outras propriedades.
Essas APIs podem enumerar dispositivos em qualquer um dos seguintes protocolos e barramentos, desde que o dispositivo individual e o sistema que executa o aplicativo ofereçam suporte a essa tecnologia. Esta não é uma lista exaustiva e outros protocolos podem ser suportados por um dispositivo específico.
- Ônibus fisicamente conectados. Isso inclui PCI e USB. Por exemplo, qualquer coisa que você possa ver no Gerenciador de dispositivos.
- UPnP
- Aliança da Rede de Vida Digital (DLNA)
- Descoberta e lançamento (DIAL)
- Descoberta de serviço DNS (DNS-SD)
- Serviços Web em dispositivos (WSD)
- Bluetooth
- Wi-Fi Direct
- WiGig
- Ponto de Serviço
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 renderizador de áudio padrão. Contanto que seu aplicativo possa usar o dispositivo padrão, não há necessidade de usar as APIs de enumeração em seu aplicativo. As APIs de enumeração fornecem uma maneira geral e flexível de descobrir e se conectar a dispositivos disponíveis. Este tópico fornece informações sobre como enumerar dispositivos e descreve as quatro maneiras comuns de enumerar dispositivos.
- Usando a interface do usuário do DevicePicker
- Enumerando um instantâneo de dispositivos atualmente detectáveis pelo sistema
- Enumerar dispositivos atualmente detectáveis e observar as alterações
- Enumerar dispositivos atualmente detectáveis e observar alterações em uma tarefa em segundo plano
Objetos DeviceInformation
Trabalhando com as APIs de enumeração, você frequentemente precisará usar objetos DeviceInformation . 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ê estará interessado. Para obter uma lista completa, consulte a página de referência de DeviceInformation.
Propriedade | Comentários |
---|---|
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ê apenas passará de um método para outro para indicar o dispositivo específico no qual 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 . Essa não é a categoria do dispositivo ou 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 | Esse recipiente 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 Propriedades de informações do dispositivo. |
Interface do usuário do DevicePicker
O DevicePicker é um controle fornecido pelo Windows que cria uma pequena interface do usuário que permite ao usuário selecionar um dispositivo em uma lista. Ele pode ser personalizado de algumas maneiras, como:
- Controle os 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 Aparência.
- Especifique o tamanho e o local do DevicePicker quando ele for exibido.
Enquanto o DevicePicker é exibido, o conteúdo da interface do usuário será atualizado automaticamente se os dispositivos forem adicionados, removidos ou atualizados.
Observação Você não pode especificar o DeviceInformationKind usando o DevicePicker. Se você quiser ter dispositivos de um DeviceInformationKind específico, precisará criar um DeviceWatcher e fornecer sua própria interface do usuário.
A transmissão de conteúdo de mídia e o DIAL também fornecem seus próprios seletores se você quiser usá-los. Eles são CastingDevicePicker e DialDevicePicker, respectivamente.
Enumerar um instantâneo de 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 precise enumerar dispositivos sem exibir uma interface do usuário para o usuário. Nessas situações, você pode enumerar um instantâneo de 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 examina apenas um instantâneo dos dispositivos disponíveis, portanto, você não poderá encontrar dispositivos que se conectam depois de enumerar a lista. Você também não será notificado se um dispositivo for atualizado ou removido. Outra desvantagem potencial a ser observada é que esse método reterá todos os 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 dispositivos. Para ver quais propriedades estão disponíveis para quais tipos de dispositivo, consulte 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 quando você está enumerando dispositivos. Ele permite que você enumere os dispositivos que estão presentes no momento e também receba notificações quando os dispositivos que correspondem ao seletor de dispositivos são adicionados, removidos ou as propriedades são alteradas. 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 seguintes notificações para qualquer dispositivo que corresponda aos critérios fornecidos.
- Adicione notificação quando um novo dispositivo for adicionado.
- Atualize a notificação quando uma propriedade na qual você está interessado for alterada.
- Remova a notificação quando um dispositivo não estiver mais disponível ou não corresponder mais ao seu filtro.
Na maioria dos casos em que você está usando um DeviceWatcher, você está mantendo uma lista de dispositivos e adicionando a ela, removendo itens dela ou atualizando itens à medida que seu observador recebe atualizações dos dispositivos que você está observando. 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 as informações de dispositivo apropriadas que foram alteradas. Em seguida, chame o método Update para esse objeto, fornecendo o objeto DeviceInformationUpdate. Essa é uma função de conveniência que atualizará automaticamente seu 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 objetos AssociationEndpoint, AssociationEndpointContainer ou AssociationEndpointService, pois eles são enumerados em protocolos de rede ou sem fio.
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 está interessado. Você pode fazer isso fornecendo um DeviceClass ou passando um seletor de dispositivo. O seletor de dispositivo é uma cadeia de caracteres 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 recuperar para os dispositivos e nas 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 dispositivos. Para ver quais propriedades estão disponíveis para quais tipos de dispositivo, consulte 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, chame GetBackgroundTrigger em vez de DeviceWatcher.Start. Ao chamar GetBackgroundTrigger, você deve especificar em qual das notificações está interessado: adicionar, remover ou atualizar. Você não pode solicitar atualização ou remoção sem solicitar adicionar também. Depois de registrar o gatilho, o DeviceWatcher começará a ser executado imediatamente em segundo plano. Deste ponto em diante, sempre que receber uma nova notificação para seu aplicativo que corresponda aos seus critérios, a tarefa em segundo plano será acionada e fornecerá as alterações mais recentes desde a última vez que disparou seu aplicativo.
Importante A primeira vez que um DeviceWatcherTrigger dispara seu aplicativo será quando o observador atingir o estado EnumerationCompleted. Isso significa que ele conterá todos os resultados iniciais. Em todas as vezes futuras em que ele 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 vêm um de cada vez e só são entregues em um pacote depois que o EnumerationCompleted é atingido.
Alguns protocolos sem fio se comportam de maneira diferente se estiverem digitalizando em segundo plano ou em primeiro plano, ou podem não oferecer suporte à digitalização em segundo plano. Existem três possibilidades em relação à digitalizaçã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.
Comportamento | Impacto |
---|---|
Mesmo comportamento em segundo plano | Nenhum |
Apenas varreduras passivas são possíveis em segundo plano | O dispositivo pode levar mais tempo para ser descoberto enquanto aguarda a ocorrência de uma verificação passiva. |
Verificações em segundo plano não suportadas | Nenhum dispositivo será detectável pelo DeviceWatcherTrigger e nenhuma atualização será relatada. |
Se o DeviceWatcherTrigger incluir um protocolo que não dá suporte à verificação como uma tarefa em segundo plano, o gatilho ainda funcionará. No entanto, você não poderá obter atualizações ou resultados por meio desse protocolo. As atualizações para 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ê esteja obtendo os tipos corretos de objetos de dispositivo para usar com sua API. 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 em 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, em seguida, usá-los usando as APIs de soquete.
Se você estiver criando seu próprio seletor de dispositivo para enumerar por meio de objetos de dispositivo, DeviceInformationKind será importante para você entender. Todos os tipos possíveis, bem como a forma como eles se relacionam entre si, são descritos na página de referência de 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, ele garante que você enumere apenas os dispositivos que correspondem ao DeviceInformationKind fornecido. Por exemplo, você pode localizar um objeto DeviceInterface e 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 de um objeto DeviceInformation variam dependendo do DeviceInformationKind do dispositivo. Certas propriedades estão disponíveis apenas com determinados tipos. Para obter mais informações sobre quais propriedades estão disponíveis para quais tipos, consulte Propriedades de informações do dispositivo. Portanto, no exemplo acima, pesquisar o dispositivo pai lhe dará acesso a mais informações que não estavam disponíveis no objeto de dispositivo DeviceInterface. Por isso, quando você cria suas cadeias de caracteres de filtro 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 em 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 a pesquisa em uma rede geralmente resulta em operações de pesquisa que não atingem o tempo limite por 10 ou mais segundos 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 por uma combinação de duas informações: 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 a CreateFromIdAsync. Se você fizer isso, poderá salvar as preferências do usuário para um dispositivo que se integra ao seu aplicativo.