2015-03-26 9 views
14

Poiché un binario di rilascio verrà eseguito su pc, xbox e telefoni, ho bisogno di un modo per recuperare il tipo di dispositivo su runtime.Come ottenere la piattaforma del dispositivo su Windows 10

È possibile controllando con lo ApiInformation per tipi, metodi, ecc., Ma credo che ci sia un modo più affidabile.

+1

Cosa si intende fare esattamente con le informazioni sul "tipo di dispositivo"? –

risposta

7

Sembra che ci sia una nuova API per rilevare dispositivo Famiglia: Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily

È possibile trovare maggiori informazioni qui: https://msdn.microsoft.com/en-us/library/windows/apps/dn705767.aspx

Aggiornato:

https://msdn.microsoft.com/en-us/library/windows/apps/windows.system.profile.analyticsversioninfo.aspx

+1

degno di nota del collegamento interrotto :( – bc3tech

+0

@ bc3tech collegamento aggiornato a MSDN riferimento API – pauliusnrk

+2

Lo scopo del '' Windows.System.Profile''' Le proprietà 'AnalyticsInfo'' sono per la registrazione diagnostica. Dovresti trattarli come stringhe opache che * non analizzi in fase di esecuzione sul client *. Basandosi su questo come il rilevamento della piattaforma è fragile. –

9

Attualmente (con gli strumenti di anteprima rilasciati il ​​23 marzo 2015) non esiste un modo semplice per farlo, diverso da (come si cita) utilizzando i metodi ApiInformation per rilevare le implementazioni di cose che esistono solo sullo specifico piattaforma che stai cercando.

Sarebbe bello se ci fossero alcuni aiutanti a fare questo e se nessuno è nel tooling finale sono sicuro che alcuni saranno creati da persone utili nella comunità.

Tuttavia, vi è una buona ragione per non avere questo in quanto incoraggia le ipotesi generali sul dispositivo.

Se fosse possibile dire "Sono in esecuzione su un telefono?" quindi se hai la risposta "Sì", allora sarebbe facile fare delle supposizioni su ciò che era possibile con quel dispositivo, ma non tutti i telefoni hanno le stesse funzionalità.
Sembra che ci sarà una versione "mobile" di Windows 10 sia per i telefoni che per i tablet di piccole dimensioni. Se tu fossi in grado di dire "Sono io la versione" mobile "?" anche in questo caso non risponderebbe a tutte le tue domande e dovresti comunque verificare le singole disponibilità dell'API in quanto le capacità di un tablet economico e di un telefono di fascia alta potrebbero essere molto diverse. (L'inclusione di pulsanti fisici sul dispositivo e la possibilità di effettuare chiamate telefoniche sono due ovvi esempi.) Estendendo questo ulteriore, ci sono molti scenari in cui si trattano piattaforme diverse come tutte le funzionalità esistenti. In questo scenario il tuo codice sarebbe meglio dire "È disponibile una tale API?", Piuttosto che dire "Sono in esecuzione su desktop, Xbox o SurfaceHub?".
La piattaforma IOT probabilmente complicherà ulteriormente questo a causa della gamma di funzionalità e funzionalità che i diversi dispositivi IOT avranno a disposizione.

Esistono pochissimi scenari in cui si desidera conoscere la piattaforma su cui si sta eseguendo e non se è disponibile un'API specifica. Si spera che, esponendo la disponibilità dell'API, Microsoft stia incoraggiando gli sviluppatori a pensare di verificare ciò di cui hanno realmente bisogno, piuttosto che basarsi su classificazioni di dispositivi ampie e potenzialmente incomplete.

Proprio come con lo sviluppo web in cui non si conosce su quale piattaforma o browser si sta eseguendo, non si dovrebbe rilevare la piattaforma e fare ipotesi su quali funzionalità avrà quindi il dispositivo, si dovrebbe rilevare se la capacità specifica richiesto è supportato/abilitato sul dispositivo prima di utilizzarlo o esporre l'interfaccia utente associata nella tua app.

+1

Un semplice scenario realistico in cui potresti aver bisogno di questo: hai creato più app (alcune funzionano su tutto, alcune solo su tipi specifici di dispositivi) e crei una finestra di dialogo "circa" universale per tutte le tue app con una parte che promuove l'altro app. Tuttavia, quando l'app corrente viene eseguita sul telefono, non si desidera promuovere app eseguite solo su desktop e viceversa. –

+1

Inoltre, immagino che avresti creato un layout diverso per dire un phablet (quindi un telefono con un grande schermo) rispetto a un tablet piccolo. Non sono sicuro di quale scenario, ma sentendomi che ci potrebbero essere alcune occasioni in cui vuoi dividerli – Depechie

+0

Le indicazioni generali sono buone (di solito non vuoi sapere se sei su un telefono) ma se hai davvero bisogno di sapere , c'è un modo migliore di usare 'ApiInformation' come ho notato qui sotto - usa MRT invece. –

4

Oltre a supportare lo scenario descritto da Alan nel suo commento, è possibile verificare un Contratto piuttosto che un tipo specifico poiché indica un blocco di funzionalità correlate. Esiste uno di questi contratti per le API specifiche di Windows Phone - Ho descritto qui http://inthehand.com/2015/03/26/determine-if-running-on-windows-phone-from-a-uap-application/ Poiché questo contratto fornisce API di compatibilità per le attuali app di Windows Phone, possiamo supporre che non verrà implementato in tablet di piccole dimensioni poiché non lo saranno avere questo Ovviamente poiché il sistema operativo o le API non sono definitive, questo non è ancora definito. Questa è una cosa utile da sapere per Windows Phone, specialmente se durante la transizione si desidera incrociare le app WP legacy solo su dispositivi WP. Per i dispositivi IoT personalizzati controllerei la disponibilità a livello di API.

7

[Edit 3 luglio per sostituire // build-epoca di informazioni con le informazioni correnti]

Anche se si può provare e dedurre il dispositivo si è in utilizzando i ApiInformation API per rilevare le API, questo è una pessima soluzione dal momento che le API possono essere aggiunte ai dispositivi nel tempo. Per favore non farlo; il tuo io futuro (o il tuo sostituto ;-)) ti ringrazierà.

Se si ha realmente bisogno per rilevare a livello di codice della famiglia di dispositivi che si sta eseguendo su (e nella maggior parte dei casi non fa), allora è possibile utilizzare AnalyticsInfo.VersionInfo.DeviceFamliy. Restituisce una stringa per la quale non esiste un set standard di valori pubblicato, poiché le famiglie di dispositivi possono essere introdotte o ritirate in qualsiasi momento.

Se si desidera fornire risorse diverse per dispositivo-famiglia (stringhe, immagini, file XAML, pagine HTML, ecc.), Non è necessario rilevare il codice famiglia del dispositivo; invece è possibile utilizzare un qualificatore MRT DeviceFamily (ad esempio Logo.DeviceFamily-Mobile.png). Assicurati di avere sempre una risorsa di fallback (immagine, stringa, ecc.) Da utilizzare quando l'app è in esecuzione su una famiglia di dispositivi di cui non hai mai sentito parlare prima. E non cadere nella trappola di assumere cose come "Desktop richiede risorse ad alta risoluzione rispetto a Mobile" perché spesso non è vero.

+0

Questo non sembra funzionare per me. :(Ho un file denominato Sketch1.DeviceFamily-Desktop.scale-125.png e un file denominato Sketch1.scale-100.png e sul desktop, quello non qualificato viene caricato. –

+1

Il dispositivo ha una scala del 100%? priorità più alta della famiglia di dispositivi –

+0

Sì - scala del 100% Quindi posso avere solo 1 qualificatore? Significa che se voglio avere più fattori di scala per un'immagine su desktop e telefono, non posso usare la risoluzione automatica e invece lo fai manualmente? –

2

I utilizzare questo per telefono (cellulare):

if (Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Mobile") 
{ 
     // code for phone 
} 
else 
{ 
     // other code 
} 

extample è here

+0

Puoi inserire più della documentazione dal link nella tua risposta per renderla più completa? La ragione di ciò è che i collegamenti esterni a SO potrebbero rompersi o andare offline dopo il tempo e quando qualcuno viene e trova questa domanda da una ricerca non sarà così rilevante se quella fonte scompare. Grazie! – Shawn

0

Questo è solo ripetendo una delle risposte precedenti, che suggerisce di utilizzare Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily ma ho pensato di includere il codice completo per un controllo:

// ---------------------------------------------------------------------- 
// IsRunningOnXbox 
// Determines whether or not the game is running on an xbox console 
bool IsRunningOnXbox() 
{ 
    // Skip if already checked 
    static bool bChecked = false; 
    static bool bRunningOnXbox = false; 
    if (bChecked) 
     return bRunningOnXbox; 

    // Retrieve the platform device family 
    Platform::String^ strVersionInfoDeviceFamily = Windows::System::Profile::AnalyticsInfo::VersionInfo->DeviceFamily; 
    if (strVersionInfoDeviceFamily != nullptr) 
    { 
     // Check to see if the device belongs to the xbox family 
     std::wstring strDeviceFamily = strVersionInfoDeviceFamily->Data(); 
     std::transform(strDeviceFamily.begin(), strDeviceFamily.end(), strDeviceFamily.begin(), ::tolower); 
     if (strDeviceFamily.find(L"xbox") != std::wstring::npos) 
      bRunningOnXbox = true; 
    } 

    // Check complete 
    bChecked = true; 

    // Return whether or not the host platform is xbox 
    return bRunningOnXbox; 
} 

Sono d'accordo con il commento di Chuck che questo probabilmente non è ciò che AnalyticsInfo è destinato a ... ma allo stesso tempo, stiamo parlando della xbox - un dispositivo con un singolo produttore che è anche responsabile per il sistema operativo. Quindi, almeno nella mia mente, sembra abbastanza sicuro. Inoltre, se lo avvolgi in questo modo, è incredibilmente facile scambiare un assegno diverso nel caso in cui qualcosa di meglio accada.

Problemi correlati