In my previous post, I described how to authenticate your Windows Phone app to Twitter, without using TweetSharp. Now that we’re set up, posting a status to Twitter is fairly easy (see below, after code for posting photo). But posting a photo is a little more challenging. Once again, we’ll be using the Hammock library by Daniel Crenna.First, we need to set a few things up:
var twitterUser = new TwitterUserQuery().Get(); _credentials = new OAuthCredentials { Type = OAuthType.ProtectedResource, SignatureMethod = OAuthSignatureMethod.HmacSha1, ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, ConsumerKey = TwitterSettings.ConsumerKey, ConsumerSecret = TwitterSettings.ConsumerKeySecret, Token = twitterUser.AccessToken, TokenSecret = twitterUser.AccessTokenSecret, Version = TwitterSettings.OAuthVersion }; _client = new RestClient { Authority = "http://api.twitter.com", HasElevatedPermissions = true }; var mediaLibrary = new MediaLibrary(); latestPicture = mediaLibrary.Pictures .Where(x => x.Name.Contains("PixImg")) .OrderByDescending(x => x.Date) .FirstOrDefault(); if (_latestPicture == null) { // TODO handle case where no pictures have been taken yet } var bitmapImage = new BitmapImage(); bitmapImage.SetSource(_latestPicture.GetImage()); Image.Source = bitmapImage;
What we’re doing here is getting the Twitter data we saved in the previous post. With that, we can create the necessary credentials. Then, we take a picture from our Windows Phone media library and show it to the user.When the user clicks the Tweet button, we need to make a new REST request:
private void OnTweetButtonClicked(object sender, EventArgs e) { var twitterRequest = new RestRequest { Credentials = _credentials, Path = "/1.1/statuses/update_with_media.json", Method = WebMethod.Post }; twitterRequest.AddParameter("status", TweetTextBox.Text); twitterRequest.AddFile("media[]", _latestPicture.Name, _latestPicture.GetImage(), "image/jpeg"); _client.BeginRequest(twitterRequest, NewTweetCompleted); }
That’s actually all there’s to it. If you just want to post a status, leave out the media-parameter and change the path to /1.1/statuses/update.json. Now, when the request is completed, I just navigate back:
private void NewTweetCompleted(RestRequest request, RestResponse response, object userstate) { // We want to ensure we are running on our thread UI Deployment.Current.Dispatcher.BeginInvoke(() => { if (response.StatusCode == HttpStatusCode.OK) { if (NavigationService.CanGoBack) { NavigationService.GoBack(); } else { NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); } } else { MessageBox.Show("There was an error connecting to Twitter"); } }); }
If you’re interested, you can check my code on GitHub.