12 Şubat 2012 Pazar

WP7 Picasa Upload

Yeni yazi dizimizde (cok cool bir insan gibi hissetmek (aslinda coolum selam.)) telefonumuzdan picasa'ya resim upload edecegiz. Benim gibi bir bardak sütü önünüze alıp, Visual Studio'nuzu açın. Arkadan MFÖ çalsın, yoksa  Exception veriyor.


Projeyi açalım, adı PicasaUploader olsun. Sayfaya 1 adet Button koyalım, adı uploadBtn, content'ı "Fotoğraf Çek" olsun.


Blend ile sayfamızı açalım, 8gb ramli i7 makinamda, Visual Studio nedense designer'da çok yavaş. Evet.


private void uploadBtn_Click(object sender, RoutedEventArgs e)
{
     Microsoft.Phone.Tasks.CameraCaptureTask task = new Microsoft.Phone.Tasks.CameraCaptureTask();
     task.Completed += new EventHandler<Microsoft.Phone.Tasks.PhotoResult>(task_Completed);
     task.Show();
}
Evet, button'a bastığımızda, CameraCaptureTask açılıyor. Task bittiğinde event handler yoluyla task_Complete fonksiyonuna gidiyor. Event Handler'ı verdikten sonra task'ı çalıştırıyoruz.


Şimdi, kod yazacağımız yer completed eventı.


Eğer kullanıcı, resim çekmiş yada seçmiş, ardından OK tuşuna basmışsa, upload yapıcaz.


if (e.TaskResult == Microsoft.Phone.Tasks.TaskResult.OK)
{

}

İşte o IF ifadesi.

Amacımız çekilen resmi byte arrayine çevirmek, stream'e yani.

BitmapImage bmpl = new BitmapImage();
bmpl.SetSource(e.ChosenPhoto);
WriteableBitmap wb = new WriteableBitmap(bmpl);
MemoryStream memSt = new MemoryStream();
wb.SaveJpeg(memSt, 1024, 768, 0, 70);
Sırasıyla, bitmap image yaratıyoruz, çekilen resmi içine atıyoruz, bu bitmapten writablebitmap yaratıyoruz, bu obje içeriğini bir stream'e yazabiliyor, o stream ise MemoryStream'i.

Neyse, bir şekilde resmi, stream'e çevirmeyi başardık. 
Şimdi yapmamız gereken şey, bir rest client bulmak.

RestSharp gayet güzel, kullanışlı. Buyrun: http://restsharp.org/
var client = new RestClient("https://www.google.com");
var request = new RestRequest("accounts/CLientLogin"Method.POST);
request.AddParameter("service""lh2"ParameterType.GetOrPost);
request.AddParameter("accountType""google"ParameterType.GetOrPost);
request.AddParameter("source""exampleCo-exampleApp-1"ParameterType.GetOrPost);
request.AddParameter("Email""upload@hebele.me"ParameterType.GetOrPost);
request.AddParameter("Passwd""91sa99113d"ParameterType.GetOrPost);

Buradan account bilgilerinizi giriyorsunuz, o account'un picasa hesabına upload edeceğiz. Albüm ID vermek mümkün, default albüme atmak ta mümkün. Lütfen mail hesabıma girmeyin, kredi kart bilgilerimin hepsi onda.

Source kısmı ne işe yarıyor çok merak ediyorum. Application adı sanki ama, laylaylom koysam olcak gibi.

Belli bir aşamada bu stream'i byte array'e çevirmek gerek tabi.

byte[] array = new byte[memSt.Length];
array = memSt.ToArray();
Onu da bu şekilde yapabiliyoruz. Kod geliyor!

client.ExecuteAsync(request, (response) =>
{
     try
     {
          string token = response.Content.Substring(response.Content.IndexOf("Auth"));
          token = token.Substring(token.IndexOf("=") + 1);
          if (String.IsNullOrEmpty(token) == false)
          {
              WebRequest webRequest = HttpWebRequest.CreateHttp("https://picasaweb.google.com/data/feed/api/user/default/albumid/default");
              webRequest.Method = "POST";
              webRequest.Headers["Authorization"] = "GoogleLogin auth=" + token;
              webRequest.BeginGetRequestStream(new AsyncCallback(delegate(IAsyncResult asynchronousResult)
              {
                    try
                    {
                          var currentRequest = (HttpWebRequest)asynchronousResult.AsyncState;
                          Stream postStream = currentRequest.EndGetRequestStream(asynchronousResult);
                          webRequest.ContentType = "image/jpeg";
                          webRequest.Headers["Content-Length"] = array.Length.ToString();
                          webRequest.Headers["Slug"] = "daddycool";
                          postStream.Write(array, 0, array.Length);
                          postStream.Close();
                          currentRequest.BeginGetResponse(new AsyncCallback(delegate(IAsyncResult asyncResponse)
                               {
                                   HttpWebRequest resp = asyncResponse.AsyncState as HttpWebRequest;
                                   var xml = System.Xml.Linq.XElement.Parse(new StreamReader(resp.EndGetResponse(asyncResponse).GetResponseStream()).ReadToEnd());
                                   if (xml.Name.LocalName == "entry")
                                   {
                                        this.Dispatcher.BeginInvoke(() =>
                                        {
                                             MessageBox.Show("Resim başarıyla gönderildi.");
                                        });
                                   }
                                   else
                                   {
                                        this.Dispatcher.BeginInvoke(() =>
                                        {
                                             MessageBox.Show("Resim gönderilemedi.");
                                        });
                               }
                          }), currentRequest);
                     }
                     catch
                     {
                          this.Dispatcher.BeginInvoke(() =>
                          {
                               MessageBox.Show("Resim gönderilemedi.");
                          });
                                      
                     }
               }), webRequest);
             }
             else
             {
                 this.Dispatcher.BeginInvoke(() =>
                 {
                     MessageBox.Show("Resim gönderilemedi.");
                 });
             }
         }
         catch
         {
             this.Dispatcher.BeginInvoke(() =>
             {
                  MessageBox.Show("Resim gönderilemedi.");
             });
         }
});

Göründüğü kadar kötü değil, bir anın çılgınlığı sadece. RequestStream'e arrayimizi yazıyoruz, en son gelen response'da entry adında bir xml elementi varsa, işlem başarılı olmuş demektir aziz dostlarım.

Test ederken Zune'u falan kapatın yalnız, kamera açılmıyor zune açıkken. WPConnect.exe den tanıtın cihazı.

Koda buradan erisebilirsiniz. Hata cikmaz heralde, ama cikarsa durtun duzeltiyim. Calistirmaya usendim gece gece.

http://dl.dropbox.com/u/32347217/PicasaUploadBeyb.rar

Hiç yorum yok:

Yorum Gönder