Enumerare i dispositivi
Gli API di Windows.Devices.Enumeration permettono di trovare i dispositivi connessi al sistema, internamente o esternamente, oppure individuabili su protocolli wireless o di rete.
Esempi
Il modo più semplice per enumerare tutti i dispositivi disponibili consiste nell'eseguire uno snapshot con il comando FindAllAsync (illustrato più avanti in una sezione).
async void enumerateSnapshot(){
DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}
Vedere Esempio di enumerazione e associazione di dispositivi per un esempio più avanzato delle API Windows.Devices.Enumeration.
API di enumerazione
Lo spazio dei nomi Windows.Devices.Enumeration consente di trovare i dispositivi connessi al sistema, internamente o esternamente, oppure individuabili su protocolli wireless o di rete. Alcune delle funzionalità supportate da queste API includono:
- Trovare un dispositivo a cui connettersi con l'applicazione.
- Ottenere informazioni sui dispositivi connessi o individuabili dal sistema.
- Chiedere a un'app di ricevere notifiche quando i dispositivi vengono aggiunti, connettersi, disconnettersi, modificare lo stato online o modificare altre proprietà.
- Chiedere a un'app di ricevere trigger in background quando i dispositivi si connettono, disconnettono, modificano lo stato online o modificano altre proprietà.
Queste API possono enumerare i dispositivi su uno dei protocolli e bus seguenti, a condizione che il singolo dispositivo e il sistema che esegue l'app supportino tale tecnologia. Questo non è un elenco completo e altri protocolli possono essere supportati da un dispositivo specifico.
- Bus collegati fisicamente. Ciò include PCI e USB. Ad esempio, qualsiasi elemento visualizzato nella Gestione dispositivi.
- UPnP
- Digital Living Network Alliance (DLNA)
- Individuazione e avvio (DIAL)
- Individuazione servizio DNS (DNS-SD)
- Servizi Web nei dispositivi (WSD)
- Bluetooth
- Wi-Fi Direct
- WiGig
- Punto di servizio
In molti casi, non è necessario preoccuparsi di usare le API di enumerazione. Questo avviene perché molte API che usano dispositivi selezioneranno automaticamente l'apposito dispositivo predefinito o forniranno un'API di enumerazione più semplificata. Ad esempio, MediaElement userà automaticamente il dispositivo renderer audio predefinito. Se l'app può usare il dispositivo predefinito, non è necessario usare le API di enumerazione nell'applicazione. Le API di enumerazione offrono un modo generale e flessibile per individuare e connettersi ai dispositivi disponibili. In questo argomento vengono fornite informazioni sull'enumerazione dei dispositivi e vengono descritti i quattro modi comuni per enumerare i dispositivi.
- Uso dell'interfaccia utente DevicePicker
- Enumerazione di uno snapshot dei dispositivi attualmente individuabili dal sistema
- Enumerazione dei dispositivi attualmente individuabili e controllo delle modifiche
- Enumerazione dei dispositivi attualmente individuabili e controllo delle modifiche in un'attività in background
Oggetti DeviceInformation
L'uso delle API di enumerazione richiede spesso l'uso degli oggetti DeviceInformation . Questi oggetti contengono la maggior parte delle informazioni disponibili sul dispositivo. La tabella seguente illustra alcune delle proprietà DeviceInformation che interesseranno l'utente. Per un elenco completo, vedere la pagina di riferimento per DeviceInformation.
Proprietà | Commenti |
---|---|
DeviceInformation.Id | Si tratta dell'identificatore univoco del dispositivo e viene fornito come variabile stringa. Nella maggior parte dei casi, si tratta di un valore opaco che si passerà da un metodo a un altro per indicare il dispositivo specifico a cui si è interessati. È anche possibile usare questa proprietà, ma anche la proprietà DeviceInformation.Kind dopo aver chiuso l'app e riaprirla. In questo modo sarà possibile recuperare e riutilizzare lo stesso oggetto DeviceInformation. |
DeviceInformation.Kind | Indica il tipo di oggetto dispositivo rappresentato dall'oggetto DeviceInformation . Questa non è la categoria di dispositivo o il tipo di dispositivo. Un singolo dispositivo può essere rappresentato da diversi oggetti DeviceInformation di diversi tipi. I valori possibili per questa proprietà sono elencati in DeviceInformationKind così come il modo in cui sono correlati l'uno all'altro. |
DeviceInformation.Properties | Questo contenitore delle proprietà contiene informazioni richieste per l'oggetto DeviceInformation . Le proprietà più comuni sono facilmente referenziate come proprietà dell'oggetto DeviceInformation ad esempio con DeviceInformation.Name. Per altre informazioni, vedere Proprietà di informazione dei dispositivi. |
Interfaccia utente devicePicker
DevicePicker è un controllo fornito da Windows che crea un'interfaccia utente di piccole dimensioni che consente all'utente di selezionare un dispositivo da un elenco. Può essere personalizzato in alcuni modi, ad esempio:
- Controllare i dispositivi visualizzati nell'interfaccia utente aggiungendo a SupportedDeviceSelectors, un SupportedDeviceClasses, o entrambi al DevicePicker.Filter. Nella maggior parte dei casi, è sufficiente aggiungere un selettore o una classe, ma se è necessario più di uno è possibile aggiungere più di un selettore. Se si aggiungono più selettori o classi, questi vengono uniti usando una funzione logica OR.
- Specificare le proprietà da recuperare per i dispositivi. A tale scopo, è possibile aggiungere proprietà a DevicePicker.RequestedProperties.
- Modificare l'aspetto di DevicePicker usando Appearance.
- Specificare le dimensioni e il luogo di DevicePicker quando viene visualizzato.
Durante la visualizzazione di DevicePicker , il contenuto dell'interfaccia utente verrà aggiornato automaticamente se i dispositivi vengono aggiunti, rimossi o aggiornati.
Nota Non è possibile specificare DeviceInformationKind usando DevicePicker. Se si desidera avere dispositivi di uno specifico DeviceInformationKind, occorrerà creare un DeviceWatcher e fornire la propria interfaccia utente.
Il cast di contenuti multimediali e DIAL forniscono anche i propri selettori se si desidera usarli. Rispettivamente, sono CastingDevicePicker e DialDevicePicker, respectively.
Enumerare uno snapshot dei dispositivi
In alcuni scenari, DevicePicker non sarà adatto alle proprie esigenze, pertanto sarà necessario qualcosa di più flessibile. È possibile che si voglia creare un'interfaccia utente personalizzata o che sia necessario enumerare i dispositivi senza visualizzare un'interfaccia per l'utente. In queste situazioni, è possibile enumerare uno snapshot dei dispositivi. Ciò comporta l'analisi dei dispositivi attualmente connessi o associati al sistema. Tuttavia, è necessario tenere presente che questo metodo esamina solo uno snapshot dei dispositivi disponibili, quindi non sarà possibile trovare i dispositivi che si connettono dopo aver enumerato l'elenco. Inoltre, non verrà ricevuta alcuna notifica se un dispositivo viene aggiornato o rimosso. Un altro potenziale svantaggio da tenere presente è che questo metodo conterrà tutti i risultati fino al completamento dell'intera enumerazione. Per questo motivo, non è consigliabile utilizzare questo metodo quando si è interessati a oggetti AssociationEndpoint, AssociationEndpointContainer o AssociationEndpointService , poiché vengono trovati tramite una rete o un protocollo wireless. Per completare questa operazione possono essere necessari fino a 30 secondi. In questo scenario, è consigliabile usare un oggetto DeviceWatcher per enumerare i dispositivi possibili.
Per enumerare uno snapshot dei dispositivi, usare il metodo FindAllAsync. Questo metodo attende il completamento dell'intero processo di enumerazione e restituisce tutti i risultati come un oggetto DeviceInformationCollection. Questo metodo è anche sottoposto a overload per offrire diverse opzioni per filtrare i risultati e limitarli ai dispositivi a cui si è interessati. A tale scopo, è possibile specificare una classe DeviceClass o passare un selettore di dispositivo. Il selettore di dispositivo è una stringa AQS (Advanced Query Syntax) che specifica i dispositivi da enumerare. Per altre informazioni, vedere Crea un selettore di dispositivo .
Oltre a limitare i risultati, è anche possibile specificare le proprietà da recuperare per i dispositivi. In tal caso, le proprietà specificate saranno disponibili nel contenitore delle proprietà per ognuno degli oggetti DeviceInformation restituiti nella raccolta. È importante notare che non tutte le proprietà sono disponibili per tutti i tipi di dispositivo. Per visualizzare le proprietà disponibili per i tipi di dispositivo, vedere Proprietà delle informazioni sul dispositivo.
Enumera e controlla i dispositivi
Un metodo più potente e flessibile per enumerare i dispositivi consiste nel creare un DeviceWatcher. Questa opzione offre la massima flessibilità durante l'enumerazione dei dispositivi. Consente di enumerare i dispositivi attualmente presenti e ricevere notifiche anche quando vengono aggiunti, rimossi o modificati i dispositivi che corrispondono al selettore di dispositivo. Quando si crea un DeviceWatcher, si specifica un selettore di dispositivo. Per altre informazioni sui selettori di dispositivo, vedere Crea un selettore di dispositivo. Dopo aver creato il watcher, verranno ricevute le notifiche seguenti per qualsiasi dispositivo che corrisponda ai criteri specificati.
- Aggiungere una notifica quando viene aggiunto un nuovo dispositivo.
- Notifica di aggiornamento quando viene modificata una proprietà a cui si è interessati.
- Rimuovere la notifica quando un dispositivo non è più disponibile o non corrisponde più al filtro.
Nella maggior parte dei casi in cui si usa un DeviceWatcher, si mantiene un elenco di dispositivi e si aggiunge ad esso, rimuovendo gli elementi da esso o aggiornando gli elementi man mano che il watcher riceve gli aggiornamenti dai dispositivi che si stanno guardando. Quando si riceve una notifica di aggiornamento, le informazioni aggiornate saranno disponibili come oggetto DeviceInformationUpdate. Per aggiornare l'elenco dei dispositivi, trovare prima di tutto l'elemento appropriato DeviceInformation che è stato modificato. Richiamare quindi il metodo Update per quell'oggetto, fornendo l'oggetto DeviceInformationUpdate. Si tratta di una funzione di praticità che aggiornerà automaticamente l'oggetto DeviceInformation .
Poiché un DeviceWatcher invia notifiche man mano che arrivano i dispositivi e quando cambiano, è consigliabile usare questo metodo di enumerazione dei dispositivi quando si è interessati agli oggetti AssociationEndpoint, AssociationEndpointContainer, o AssociationEndpointService in quanto vengono enumerati su protocolli di rete o wireless.
Per creare un DeviceWatcher, usare uno dei metodi CreateWatcher. Tali metodi vengono sovraccaricati per consentire di specificare i dispositivi a cui si è interessati. A tale scopo, è possibile specificare una classe DeviceClass o passare un selettore di dispositivo. Il selettore di dispositivo è una stringa AQS che specifica i dispositivi da enumerare. Per altre informazioni, vedere Crea un selettore di dispositivo . È anche possibile specificare le proprietà che si desidera recuperare per i dispositivi e a cui si è interessati. In tal caso, le proprietà specificate saranno disponibili nel contenitore delle proprietà per ognuno degli oggetti DeviceInformation restituiti nella raccolta. È importante notare che non tutte le proprietà sono disponibili per tutti i tipi di dispositivo. Per visualizzare le proprietà disponibili per i tipi di dispositivo, vedere Proprietà delle informazioni sul dispositivo.
Controllare i dispositivi come attività in background
Guardare i dispositivi come attività in background è molto simile alla creazione di un DeviceWatcher come descritto in precedenza. Infatti, sarà comunque necessario creare un normale oggetto DeviceWatcher come descritto nella sezione precedente. Dopo averlo creato, richiamare GetBackgroundTrigger anziché DeviceWatcher.Start. Quando si richiama GetBackgroundTrigger, è necessario specificare quale delle notifiche a cui si è interessato (aggiungere, rimuovere o aggiornare). Non è possibile richiedere l'aggiornamento o rimuovere senza richiedere anche l'aggiunta. Dopo aver registrato il trigger, DeviceWatcher verrà avviato immediatamente in background. Da questo punto in poi, ogni volta che riceve una nuova notifica per l'applicazione che corrisponde ai criteri, l'attività in background verrà attivata e fornirà le modifiche più recenti dall'ultima attivazione dell'applicazione.
Importante La prima volta che un DeviceWatcherTrigger attiva l'applicazione sarà quando il watcher raggiunge lo stato EnumerationCompleted . Ciò significa che conterrà tutti i risultati iniziali. Ogni volta che attiva l'applicazione in futuro, conterrà solo l'aggiunta, l'aggiornamento e la rimozione delle notifiche che si sono verificate dopo l'ultimo trigger. Questo valore è leggermente diverso da un oggetto DeviceWatcher in primo piano perché i risultati iniziali non arrivano uno alla volta e vengono recapitati solo in un bundle dopo aver ottenuto EnumerationCompleted.
Alcuni protocolli wireless si comportano in modo diverso se si analizzano in background rispetto al primo piano o potrebbero non supportare l'analisi in background. Esistono tre possibilità in relazione alla scansione in background. La tabella seguente elenca le possibilità e gli effetti che possono avere sull'applicazione. Ad esempio, Bluetooth e Wi-Fi Direct non supportano le analisi in background, quindi, per estensione, non supportano un DeviceWatcherTrigger.
Comportamento | Impatto |
---|---|
Stesso comportamento in background | None |
Solo le analisi passive possibili in background | Il dispositivo potrebbe richiedere più tempo durante l'attesa di un'analisi passiva. |
Analisi in background non supportate | Nessun dispositivo sarà rilevabile da DeviceWatcherTrigger e non verranno segnalati aggiornamenti. |
Se DeviceWatcherTrigger include un protocollo che non supporta l'analisi come attività in background, il trigger funzionerà comunque. Tuttavia, non sarà possibile ottenere aggiornamenti o risultati su tale protocollo. Gli aggiornamenti per altri protocolli o dispositivi verranno comunque rilevati normalmente.
Uso di DeviceInformationKind
Nella maggior parte degli scenari non è necessario preoccuparsi del DeviceInformationKind di un oggetto DeviceInformation. Questo perché il selettore del dispositivo restituito dall'API che si sta utilizzando spesso garantisce l'ottenimento dei tipi corretti di oggetti dispositivo da utilizzare con la loro API. Tuttavia, in alcuni scenari vuoi ottenere DeviceInformation per i dispositivi, ma non esiste un'API del dispositivo corrispondente per fornire un selettore di dispositivo. In questi casi è necessario creare un selettore personalizzato. Ad esempio, i servizi Web nei dispositivi non hanno un'API dedicata, ma è possibile individuare tali dispositivi e ottenere informazioni su di loro usando le API Windows.Devices.Enumeration e quindi usarle attraverso le API del socket.
Se si sta creando un selettore di dispositivo personalizzato per enumerare gli oggetti dispositivo, DeviceInformationKind sarà importante ai fini della comprensione. Tutti i tipi possibili, oltre al modo in cui sono correlati tra loro, sono descritti nella pagina di riferimento per DeviceInformationKind. Uno degli usi più comuni di DeviceInformationKind consiste nel specificare il tipo di dispositivi che si sta cercando quando si invia una query in combinazione con un selettore di dispositivo. In questo modo, garantisce di enumerare solo i dispositivi che corrispondono all'oggetto DeviceInformationKind fornito. Ad esempio, è possibile trovare un oggetto DeviceInterface e quindi eseguire una query per ottenere le informazioni per l'oggetto Dispositivo padre. Tale oggetto padre può contenere informazioni aggiuntive.
È importante notare che le proprietà disponibili nel contenitore delle proprietà per un oggetto DeviceInformation varierà a seconda dell'oggetto DeviceInformationKind del dispositivo. Alcune proprietà sono disponibili solo con determinati tipi. Per altre informazioni sulle proprietà disponibili per i tipi, vedere Proprietà delle informazioni sul dispositivo. Di conseguenza, nell'esempio precedente, la ricerca del Dispositivo padre consentirà di accedere ad altre informazioni non disponibili dall'oggetto dispositivo DeviceInterface. Per questo motivo, quando si creano le stringhe di filtro AQS, è importante assicurarsi che le proprietà richieste siano disponibili per gli oggetti DeviceInformationKind che stai enumerando. Per altre informazioni sulla creazione di un filtro, vedere Crea un selettore del dispositivo.
Durante l'enumerazione di AssociationEndpoint, AssociationEndpointContainer o AssociationEndpointService , tale processo si esegue tramite un protocollo wireless o di rete. In queste situazioni, è consigliabile non usare FindAllAsync e usare invece CreateWatcher. Ciò è dovuto al fatto che la ricerca in una rete comporta spesso operazioni di ricerca che non raggiungeranno il timeout per 10 o più secondi prima di generare EnumerationCompleted. FindAllAsync non completa l'operazione finché non viene attivato EnumerationCompleted . Se si usa un DeviceWatcher, si otterranno risultati più vicini al tempo reale indipendentemente dal momento in cui viene richiamato EnumerationCompleted.
Salvare un dispositivo per usarlo in un secondo momento
Qualsiasi oggetto DeviceInformation viene identificato in modo univoco da una combinazione di due informazioni: DeviceInformation.Id e DeviceInformation.Kind. Se si mantengono queste due informazioni, è possibile ricreare un oggetto DeviceInformation dopo che è andato perduto, fornendo queste informazioni a CreateFromIdAsync. In questo caso, è possibile salvare le preferenze utente per un dispositivo che si integra con l'app.