Partager une image dans votre Universal App (Share contract)

Mise en situation

Pour les besoins de cet exemple, j’ai réalisé une petite application dessin toute bête qui permet de dessiner dans 4 couleurs différentes et ensuite de partager le dessin (Le but n’étant pas de faire une app utile et jolie, mais de faire un exemple un peu fonctionnel pour démontrer certaines fonctionnalités) (Voir l’article en entier).

Exemple

Avec l’article précédent, je peux maintenant faire mon dessin et le prendre en screenshot, mais il faudrait maintenant que je puisse le partager. Pour se faire on va utiliser les apis à notre disposition et dans notre cas, le Share Contract
La première chose à faire est de s’inscrire au share contract via le DataTransferManager. Dans mon exemple, je le fais dans le constructeur de ma page

[code lang=”csharp”]
// on s’inscrit pour le partage du dessin via le share contract
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(ShareMyPaintRequest);
[/code]

Ensuite lors qu’on va utiliser le partage que ce soit via un bouton ou via la Charm Bar, notre méthode ShareMyPaintRequest va être appelée.
Petite astuce, pour forcer l’ouverture du share via un bouton par exemple, voici le code :

[code lang=”csharp”]
// on lance l’ui du share contract
DataTransferManager.ShowShareUI();
[/code]

Dans notre méthode ShareMyPaintRequest, on aura donc le code qui génère notre screenshot et ensuite le code qui var servir au partage (Titre, description … )

[code lang=”csharp”]
private async void ShareMyPaintRequest(DataTransferManager sender, DataRequestedEventArgs args) {
//titre de notre partage
args.Request.Data.Properties.Title = "Je suis un artiste";
//description de notre partage
args.Request.Data.Properties.Description = "Partagez votre oeuvre";
DataRequest request = args.Request; DataRequestDeferral deferral = request.GetDeferral(); try {
//Creation de notre image
var memoryStream = …
//texte de notre partage
request.Data.SetText("Regarde quel artiste je suis avec ce superbe dessin rien que pour toi !");
//création d’une preview de notre image partagée
request.Data.Properties.Thumbnail = RandomAccessStreamReference.CreateFromStream(memoryStream);
//image qui sera partagée
request.Data.SetBitmap(RandomAccessStreamReference.CreateFromStream(memoryStream));
}
finally
{ deferral.Complete(); } }
[/code]

PS : Il est obligatoire d’utiliser le deferral car nous sommes dans une méthode asynchrone. Si la méthode avait été synchrone, il n’aurait pas été obligatoire, mais dans notre cas, si nous ne l’avions pas mis, le lancement du share aurait tourné en boucle sans jamais se lancer
Et voilà, maintenant nous partageons l’image via le share contract et c’est lui qui gère le reste, l’utilisateur pourra choisir le mode de partage qu’il préfère mail, facebook ….
Attention sur Windows Phone certaines propriétés peuvent ne pas être utilisées.

Liens

No Comments

Post a Comment