Upload
microsoft
View
1.051
Download
0
Embed Size (px)
Citation preview
Alex Danvy
Rudy Huyn
WINDOWS PHONE 8rendre votre application plus visible
Rudy HUYN
Responsable technique pour Orange Business Services
MVP Windows Phone Development
@rudyhuyn
http://www.rudyhuyn.com
Faciliter le téléchargement
Encourager l’utilisation
Tuiles dynamiques
LES TYPES DE TUILES
Flip
Iconic
Cycle
Permet une mise en avant :
SUR LE TELEPHONE DE
L’UTILISATEUR
SUR LE WINDOWS PHONE
STORE
WINDOWS PHONE 7.8 ?
OUI !
*Ce
slid
ee
st sp
on
so
risé
pa
r le
s m
éd
ica
me
nts
Do
lipra
ne
ALTERNATIVE ?
METTRE A JOUR SA TUILE ?
Solution : background agent
Attention !
ALTERNATIVE
Mise à jour programmée
var scheduler = new ShellTileSchedule(maintile){
Recurrence = UpdateRecurrence.Onetime,
StartTime = date,
MaxUpdateCount = 1,
RemoteImageUri = new Uri("http://www.monsite.com/generateTile.php");
};
Ecran de verrouillage
Différentes mises en avant :
IMAGE DE FOND
ZONE TEXTUELLE
ICONE DE NOTIFICATIONS
Icône de notification :
JUSQU’À 5 APPLICATIONS
AJOUT EXPLICITE
COMPTEUR LIÉ A LA TUILE
PRINCIPALE
Zone textuelle
UNE SEULE APPLICATION
CHOIX EXPLICITE
LIÉE A LA TUILE PRINCIPALE
PAS TUILE CYCLIQUE
INCIDENCE SUR LA TUILE
Contraintes fortes sur le
design
Alternative : Proposer une
tuile secondaire
Image de fond
RESPECTER LES
DEFINITIONS
OBLIGATOIREMENT UNE
IMAGE LOCALE
ATTENTION A L’OCCUPATION
DE L’ESPACE
DEMO
Locke Screen
if
(!Windows.Phone.System.UserProfile.LockScreenManager.IsPro
videdByCurrentApplication)
{
Windows.Phone.System.UserProfile.LockScreenManager.
RequestAccessAsync();
}
LockScreen.SetImageUri(new System.Uri("ms-
appdata:///local/" + filename, UriKind.Absolute));
Windows.System.Launcher.LaunchUriAsync(ne
w Uri("ms-settings-lock:"));
Hub musique + vidéo
Mise en avant de l’application
<App xmlns="" ProductID=""
Title="WindowsPhoneApplication"
Genre="NormalApp" HubType="1">
Lecture en cours
var media = new MediaHistoryItem(){
ImageStream = stream;
Source = "";
Title = "Techdays Radio";
};
MediaHistory.Instance.NowPlaying = media;
Historique + nouveautés
MediaHistory.Instance.WriteRecentPlay(media);
MediaHistory.Instance.WriteAcquiredItem(media);
Photo !
Intégration au hub
<Extension ExtensionName="Photos_Extra_Hub"
ConsumerID="{5B04B775-356B-4AA0-AAF8-
6491FFEA5632}"
TaskID="_default" />
Intégration aux menus
<Capability Name="ID_CAP_MEDIALIB_PHOTO"
/>
<Extension ExtensionName="Photos_Extra_Share"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}"
TaskID="_default" />
<Extension ExtensionName="Photos_Extra_Image_Editor"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}"
TaskID="_default" />
<Extension ExtensionName="Photos_Extra_Viewer"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}"
TaskID="_default" />
RICH MEDIA
€
NOUVEAUTÉ WINDOWS PHONE 8(UNE PRESQUE)
Principe
Ajoute un indicateur : « capturé par XYZ»
Ajoute un menu « ouvrir dans XYZ »
<Extension
ExtensionName="Photos_Rich_Media_Edit"
ConsumerID="{5B04B775-356B-4AA0-AAF8-
6491FFEA5632}"
TaskID="_default" />
DEMO
Super Courgette*
* Il va faire noir
POURQUOI PRESQUE ?
Un nouveau service pour l’utilisateur
Mais aucune nouvelle API
SAUVEGARDER
Vous générez une image
Vous la sauvegardez dans le hub
photo
Vous récupérez le chemin de l’image
Vous stockez dans votre isolated
storage l’ensemble des informations
qui ont permis la génération de l’image
+ le chemin
MODIFIER
Récupérez l’image à partir du token
Retrouvez le chemin : GetPath()
Récupérez les données
correspondant au chemin
Affichez l’image
Duplication et non édition
AUTO UPLOADIL N’Y A PAS QUE SKYDRIVE DANS LA VIE
PRINCIPE ?
Mise en avant
<Extension ExtensionName="Photos_Auto_Upload"
ConsumerID="{5B04B775-356B-4AA0-AAF8-
6491FFEA5632}" TaskID="_default" />
• Créer un agent
• Lancer l’agent en tant que ressource intensive
• Explorer les albums du téléphone
• Identifier les nouvelles photos
• Uploader les photos vers un serveur
DEMO
AUTO UPLOADR.
foreach (PictureAlbum album in new
MediaLibrary().RootPictureAlbum.Albums)
{
if (album.Name == "Screenshots")
return album;
}
return null;
var pictures=album.Pictures.Where(p => p.Date >
lastuploadedPicture).OrderBy(p=>p.Date).ToList();
foreach(var picture in pictures)
{
var res= await UploadPicture(picture);
if(res==SUCCESS)
{
SaveLastUploadedPictureDate(picture.Date);
}
}
LES LENTILLESLESLENSES
DEMO
LES LENSES
SEARCH EXTENSIBILITY
Principe
Principe
<Extensions>
<Extension ExtensionName="Bing_Products_Computing"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
TaskID="_default" ExtraFile="Extensions\\Extras.xml" />
<Extension ExtensionName="Bing_Products_Electronics"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
TaskID="_default" ExtraFile="Extensions\\Extras.xml" />
<Extension ExtensionName="Bing_Products_Software"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
TaskID="_default" ExtraFile="Extensions\\Extras.xml" />
</Extensions>
<?xml version="1.0" encoding="utf-8" ?>
<ExtrasInfo>
<AppTitle>
<default></default>
<fr-FR>LoPrestiAimeur</fr-FR>
</AppTitle>
<Consumer ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}">
<ExtensionInfo>
<Extensions>
<ExtensionName>Bing_Products_Computing</ExtensionName>
<ExtensionName>Bing_Products_Electronics</ExtensionName>
</Extensions>
<CaptionString>
<default>Research computer product details</default>
<fr-FR>Recherche retraits d’ordinateurs</fr-FR>
</CaptionString>
</ExtensionInfo>
</Consumer>
</ExtrasInfo>
<Extensions>
<Extension ExtensionName="Bing_Products_Computing"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
TaskID="_default" ExtraFile="Extensions\\Extras.xml" />
<Extension ExtensionName="Bing_Products_Electronics"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
TaskID="_default" ExtraFile="Extensions\\Extras.xml" />
<Extension ExtensionName="Bing_Products_Software"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
TaskID="_default" ExtraFile="Extensions\\Extras.xml" />
</Extensions>
<Extensions>
<Extension ExtensionName="Bing_Products_Computing"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
TaskID="_default" />
<Extension ExtensionName="Bing_Products_Electronics"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
TaskID="_default" />
<Extension ExtensionName="Bing_Products_Software"
ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
TaskID="_default" />
</Extensions>
/SearchExtras?MovieName=The+Trey+Research+C
ompany&ReleaseDate=129836124000000000
&Category=Bing_Movies
COMMANDES VOCALES
Principe
Permet de lancer une
application grâce à la
reconnaissance vocale
Mise en avant
Mise en avant
VOICE COMMAND vs SPEECH-TO-TEXT
• Uniquement pour lancer une
application
• Reconnaissance déterministe
DEMO
SUDOKAL
ID_CAP_SPEECH_RECOGNITION
ID_CAP_MICROPHONE
ID_CAP_NETWORKING
Créer fichier VCD
<VoiceCommands
xmlns="http://schemas.microsoft.com/voicecommands/1.0">
<CommandSet xml:lang="fr-FR" Name="French">
<CommandPrefix>TVShow</CommandPrefix>
<Example> Calendrier, Ouvre Lost </Example>
<Command Name="OpenTVShow">
<Example> ouvre Lost, Desperate Housewives, etc... </Example>
<ListenFor> [ouvre] {TVShows} </ListenFor>
<ListenFor> ouvrir {TVShows} </ListenFor>
<ListenFor> lance {TVShows} </ListenFor>
<Feedback> Ouverture de la série... </Feedback>
<Navigate Target="/Pages/TVShowPage.xaml"/>
</Command>
VoiceCommandService.InstallCommandSetsFromFileAsync
(
new Uri("ms-appx:///command.xml"));
NavigationContext.QueryString["number"]
NavigationContext.QueryString["voiceCommandName"];
WALLET
CONTACT STORE
<Capability Name="ID_CAP_CONTACTS" />
Créer store
store = await
ContactStore.CreateOrOpenAsync(ContactStoreSys
temAccessMode.ReadOnly, ContactStoreApplication
AccessMode.ReadOnly);
var contact = new StoredContact(store);
var props=await contact.GetPropertiesAsync();
props[KnownContactProperties.Email] =
props[KnownContactProperties.Telephone] = "09 99 99 99
99";
props[KnownContactProperties.Birthdate] = new
DateTimeOffset(new DateTime(2012, 12, 25));
Ajouter image
await
contact.SetDisplayPictureAsync(stream.AsInputStream());
await contact.SaveAsync();
Extra properties
var extprops = await contact.GetExtendedPropertiesAsync();
extprops["PictureETAG"] = "AB654654E545D5F";
DEMO
LONG CONTACT
Comment mettre en avant mon application ?
var props = await contact.GetPropertiesAsync();
props[KnownContactProperties.Notes] = "contact créé par
l'application LongContact";
props[KnownContactProperties.Url] =
"miaou://www.longcontact.com/foot";
EXTENSION DE
PROTOCOLE
<Extensions>
<Protocol Name="miaou" TaskID="_default"
NavUriFragment="uri=%s" />
</Extensions>
/Protocol?uri=%s
public class MyUriMapper : UriMapperBase
{
public override Uri MapUri(Uri uri)
{
if (uri.OriginalString.StartsWith("/Protocol?uri="))
{
var exturi = HttpUtility.UrlDecode(uri.OriginalString.Substring(14));
if (exturi == "miaou://www.longcontact.com/foot")
return new Uri("/FootPage.xaml", UriKind.Relative);
}
return uri;
}
}
QUESTIONS ?
http://www.facebook.com/groups/devwp7/