Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

WP7: Microsoft.Phone.Info, un namespace à découvrir...

[new:30/07/2011]Je ne parle pas trop de Silverlight sous WP7 car beaucoup de choses sont identiques. L’association avec Nokia va bientôt porter ses fruits et il est donc toujours d’actualité, et peut-être bien plus que lors de sa sortie, de s’intéresser à cette version  particulière de Silverlight. Par exemple identifier un utilisateur ou un téléphone de façon fiable et unique est un besoin assez courant et bien spécifique à cet environnement. Analyser la mémoire utilisée est aussi quelque chose d’essentiel sur des petites machines. Ces informations et bien d’autres se trouvent dans Microsoft.Phone.Info...

Le namespace Microsoft.Phone.Info

Ce namespace donne accès à des nombreuses informations et les curieux qui y fouineront trouveront là des données et des fonctions bien utiles.

La classe DeviceStatus

Un bon exemple de cette niche d’informations est donné par la classe DeviceStatus. A partir de cette dernière on peut accéder à la consommation mémoire actuelle de l’application, ou à des statistiques bien pratiques en debug comme le pic de consommation mémoire. Le nom du fabriquant, le modèle de téléphone, la mémoire totale installée, la présence ou non d’un clavier, sont autant d’autres éléments qui peuvent s’avérer essentiels. De même que PowerSource qui permet de savoir si le téléphone est sur batterie ou branché au secteur. Il existe même un évènement indiquant le changement de cette information.

DeviceExtendedProperties

Obtenir des informations étendues sur la device elle-même est tout aussi intéressant. Même si à première vue cette classe est assez vide, elle cache des informations de premier plan.

La classe expose GetValue et TryGetValue. Toute l’astuce se trouve dans le nom qu’on passe à ces méthodes pour obtenir la valeur...

Par exemple, on peut obtenir l’ID unique du téléphone de la façon suivante :

var id = (byte[]) DeviceExtendedProperties.GetValue("DeviceUniqueId");
var idStr  = BitConverter.ToString(id);

L’id est un tableau de 20 octets, transformé en chaine cela donne quelque chose dans ce style :

"EE-7A-95-56-BE-19-56-1B-60-1C-91-C9-55-FB-32-3A-E1-7B-A5-54"

A noter que l’utilisation de cette classe affiche une demande de confirmation d’accès aux informations du téléphone. L’utilisateur doit valider cette demande. S’il refuse, l’information n’est pas accessible.

Grace à d’autres identificateurs on accède à d’autres informations, mais la classe DeviceStatus sait en retourner la plupart sans le problème du dialogue à l’utilisateur. L’identificateur unique de la machine reste donc l’intérêt principal de DeviceExtendedProperties.

UserExtendedProperties

La logique est la même : deux méthodes pour soutirer des informations un peu cachées. Ici il s’agit de l’identité de l’utilisateur.

var anid = UserExtendedProperties.GetValue("ANID") as string;

L’intérêt est ici d’obtenir une chaine de caractères identifiant l’utilisateur de façon unique. Cela peut s’avérer pratique pour soumettre un score à un jeu et que ce score soit bien accroché à la même personne quelque soit le téléphone utilisé.

ID_CAP_IDENTITY_USER doit être ajouté au manifest pour espérer obtenir une réponse. La même contrainte existe pour la classe précédente. Le manifest doit ainsi contenir :

<Capabilities>  
  ...  
  <Capability Name="ID_CAP_IDENTITY_DEVICE"/>  
  <Capability Name="ID_CAP_IDENTITY_USER"/>  
  ...  
</Capabilities> 

La chaine retournée est un ensemble de valeurs sous la forme “clé=valeur” . Il s’agit d’informations anonymes sur le Live ID de l’utilisateur. La chaine peut s’utiliser directement, même s’il semble préférable d’en extraire la partie efficace, le fameux ID :

private static readonly int ANIDLength = 32;  
private static readonly int ANIDOffset = 2;  
 
public static string GetWindowsLiveAnonymousID()  
{  
    string result = string.Empty;  
    object anid;  
    if (UserExtendedProperties.TryGetValue("ANID", out anid))  
    {  
        if (anid != null && anid.ToString().Length >= (ANIDLength + ANIDOffset))  
        {  
            result = anid.ToString().Substring(ANIDOffset, ANIDLength);  
        }  
    }  
    return result;  
}  

 

Conclusion

Certaines informations ne sont pas difficiles à obtenir mais elles sont bien cachées... Le namespace Microsoft.Phone.Info en contient quelques unes, et maintenant vous savez comment y accéder !

Stay Tuned !

blog comments powered by Disqus