Si vous souhaitez soumettre une application utilisant un audio playback agent ou un audio stream agent (qui permettent notamment à votre application de jouer de la musique même si l’application est fermée), il se peut que votre application plante sur le marketplace alors qu’elle fonctionne correctement sur votre téléphone de développement.
Ce problème provient de la détection automatique des capabilities de votre application.
Qu’est ce qu’une Capability ?
Dans le répertoire Properties de votre application, vous trouverez une fichier WMAppManifest.xml. Ce dernier représente les informations de déploiement de votre application, on y trouve notamment le nom de l’application, la description des Tasks, ou encore la description de votre tuile principale. Ce qui nous intéresse dans notre cas est l’élément Capabilities, voici à quoi il peut ressembler :
<Capabilities> <Capability Name="ID_CAP_GAMERSERVICES"/> <Capability Name="ID_CAP_IDENTITY_DEVICE"/> <Capability Name="ID_CAP_MEDIALIB"/> <Capability Name="ID_CAP_MICROPHONE"/> <Capability Name="ID_CAP_PHONEDIALER"/> <Capability Name="ID_CAP_PUSH_NOTIFICATION"/> <Capability Name="ID_CAP_SENSORS"/> <Capability Name="ID_CAP_CONTACTS"/> <Capability Name="ID_CAP_APPOINTMENTS"/> <Capability Name="ID_CAP_IDENTITY_USER" /> <Capability Name="ID_CAP_LOCATION" /> <Capability Name="ID_CAP_ISV_CAMERA" /> <Capability Name="ID_CAP_NETWORKING" /> <Capability Name="ID_CAP_WEBBROWSERCOMPONENT"/> </Capabilities>
Cet élément permet de spécifier quelles sont les fonctionnalités utilisé par votre application, par exemple ID_CAP_LOCATION permet d’indiquer que votre application utilise la géolocalisation GPS ou encore ID_CAP_CONTACTS qui indique que votre application pourra accéder aux contacts du téléphone. Ces capabilities sont notamment utilisé sur le marketplace pour alerter l’utilisateur que l’application aura accès à la géolocalisation.
Dans 99% des cas, vous n’aurez pas à vous soucier de ces capabilities, en effet, lorsque vous créez un projet sous visual ou blend, ceux-ci active la totalité des capabilities. Lorsque vous allez soumettre votre application sur le marketplace, un programme va analyser automatiquement votre code et va définir selon les appels aux fonctions du SDK, les capabilities à activer. Suite à cela, votre fichier WMAppManifest.xml sera écrasé avec le nouveau fichier généré.
Pourquoi l’application plante alors ?
Le problème vient de la détection automatique du marketplace, celle-ci n’arrive pas toujours à détecter que vous utilisez un audio background agent et donc ne vas pas activer la capabilities ID_CAP_MEDIALIB correspondant à la lecture de média. Lorsque votre application va tenter de lire un flux audio, votre application va planter car le runtime va détecter que vous n’avez pas accès à cette fonctionnalité.
Comment le vérifier ?
Le SDK 7.1 de windows phone, dispose d’un outil appelé le marketplace test kit, il suffit de faire un clic droit sur votre projet, de cliquer sur « Open Marketplace Test Kit », allez dans « Automated Tests » et cliquez sur « run tests » (il faudra préalablemenet avoir compilé son application en mode release)
Assurez vous alors que ID_CAP_MEDIALIB est bien listé dans la colonne « Result Details ».
Comment contourner ce problème ?
Il est assez facile de forcer cette capabilities au niveau de la détection, il suffit juste de créer une page jamais appelée, et d’y insérer dedans un élément MediaElement. Le détecteur ne va jamais analyser si votre page est accessible ou pas, il va donc la considérer au même titre que vos autres pages.
<phone:PhoneApplicationPage xmlns:my="clr-namespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x:Class="MonApp.DummyPage" mc:Ignorable="d"> <MediaElement Source="http://contoso.com/contoso.mp3"/> </phone:PhoneApplicationPage>
Le programme va alors analyser vos assemblies, va bien détecter qu’un mediaelement est utilisé et que donc votre application à besoin de la capability ID_CAP_MEDIALIB.
Une autre méthode est forcer dans votre code, l’appel à certaines assemblies, par exemple :
Si vous référencez Microsoft.Phone.dll, ajoutez quelque part dans votre code :
Microsoft.Devices.MediaHistory history = null;
Si vous référencez Microsoft.Xna.Framework.dll, ajoutez :
Microsoft.Xna.Framework.Media.MediaLibrary lib = null;
Et si aucune des deux précédentes :
System.Windows.Controls.MediaElement me = null;





