Xamarin ile Visual Studio 2015’de Android Programlama Bölüm2

Selamlar;

Bugünkü uygulamamızda bir Webservis’den aldığımız haberleri android telefon üzerinde göstericeğiz. Haberleri servisden çekmeden önce mobile cihazın internet durumuna bakıcağız. Internet var ise Wifi durumuna göre servise bağlanacağız. Telefonu salladığımız zaman bir sonraki haber gurubunu çekiceğiz. İlgili haberlere tıklayınca detayını okuyacağız. Böylece telefonun farklı farklı birçok özelliğini kullanmış olucağız.

Öncelikle haberleri göstermek için Main.axml dosyasına aşağıda görüldüğü gibi button eklemek gerekir. Text’i “@string/GameListButton” olarak tanımlanmıştır. Strings.xml deki karşılığı Oyun Haberleridir.

history

Strings.xml: Oyun Haberleri Buttonu text’i aşağıdaki satır eklenerek tanımlanır.

Main.axml: Oyun Haberleri buttonun propertyleri için alttaki satırlar eklenir.

 MainActivity.cs: Oyun Haberler’i button’una tıklanınca ilgili sayfaya gitmek için gerekli kodlar aşağıdaki gibi tanımlanmıştır.

Şimdi gelelim Oyun Haberleri yani GameListActivity.cs sayfasına. Öncelikle mobile cihazın internet durumunu aşağıdaki gibi kontrol edelim. 3 durum söz konusudur. GetSystemService() methodu ile öncelikle ConnectivityManager class’ına erişilir. İlgili classın ActiveNetworkInfo propertysi ile internet bağlantısı olup olmadığına bakılır. Internet var ise GetNetworkInfo(ConnectivityType.Wifi).GetState() methodu ile bağlantı tipinin WiFi olup olmadığına bakılır. Wifi var ise  State “2” döndürülür. Internet var ama Wifi yok ise State “1” döndürülür. Hiç internet yok ise State “0” döndürülür. Ve kullanıcı ilgili duruma göre bilgilendirilir.

Yukarıdaki telefonun özelliklerine erişebilmek için aşağıdaki izinleri Properties çift tıklanarak Android Mainfest sekmesi altında ilgili permissions’lar işaretlenerek verilir.

permision

Uygulamanın yüklenme sırasında ilgili izinler için kullanıcı aşağıda görüldüğü gibi uyarılır.

permision2

İnternet’in bağlantı durumu WiFi ise yani State “2” ise ilgi Web servisine bağlanılarak oyun haberleri çekilir. Oyun haberlerini Steam’den aşağıdaki url’den çekicez. Ilgili servis’e bağlanabilmek için telefona yukarıda görülen Tam internet erişim yetkisi verilmesi gerekmektedir. İlgili servisten 20 adet haber Maximum 300 karakter olucak şekilde json formatında çekilmektedir.

Screenshot_2014-12-11-17-02-59  2

Örnek Result aşağıdaki gibidir.

MyData: İlgili servisten çekilen datanın atılacağı View Model MyData’dır. Burada Key haberin başlığı Value‘de haberin detayıdır.

  •  Ilgli servise bağlanmak için aşağıdaki HttpWebRequest class’ı kullanılmıştır.

var httpReq = (HttpWebRequest)HttpWebRequest.Create(new System.Uri(searchUrl));

  • İlk sayfa açıldığında ilgili haberler response.GetResponseStream() methodu ile bir stream objesine çekilerek JsonObject nesnesine convert edilir. Ilgili Json nesnesinden aşağıdaki linq sorgusu ile ilk 5 kayıt alınıp MyData View Model’i doldurulur.

results = (from result in (JsonArray)j[“appnews”][“newsitems”]
let jResult = result as JsonObject
select new MyData
{
Key = jResult[“title”].ToString(),
Value = jResult[“contents”].ToString()
}).ToArray();
var results2 = results.Take(5).ToArray();

  •  Alınan 5 haber Thread ile ListAdapter’a atanıp user’a gösterilir. İşlemin arkada çalışması uygulamanın telefonu kitlememesi açısından çok önemlidir.

 RunOnUiThread(() =>
{
ListAdapter = new ArrayAdapter<MyData>(this,
Android.Resource.Layout.SimpleListItem1, Android.Resource.Id.Text1, results2);
});

Shake-Lock-App-805x450

  •  Geldik mobile cihazımızın Accelerator özelliğini kullanarak, telefonun sallanma durumunda bir sonraki 5 haberi göstermesi senaryosuna:

Telefonun son x.y.z kordinatllarının tutulacağı last_x, last_y ve last_z değişkenleri, 2 salınım arasında enaz 150 milisecond zaman geçmesini sağlıyan ShakeDetectionTimeLapse  ve lastUpdate değişkenleri,  bir sonraki haberler çekilirken aynı anda bir istek daha gelmemesini sağlıyan hasUpdated  değişkeni, sallanma hızını belirleyen ShakeThreshold değişkeni ve son olarak enson kaçıncı sayfadaki haberlerin çekildiğini tutan page değişkeni aşağıdaki gibi tanımlanmıştır.

İlgili video aşağıdadır:

Mobile cihazın salınım durumunda OnSensorChanged() methodu tetiklenir. Nedeni classımız aşağıda görüldüğü gibi ISensorEventListener interface’inden türetilmiştir.

public class GameListActivity : ListActivity, Android.Hardware.ISensorEventListener

Screenshot_2014-12-10-22-03-33

UtOgFLBKs4zWHfUOefmpw_m

Yukarıdaki formüle göre cihazın( (son x,y,z kordinatları ile – ilk x.y.z kordinatlarının) farkı alınıp /, (son hareket zamanı ile – ilk hareket zamanın) milisecond cinsine göre zaman farkına bölümünden çıkan hız) >500 ise salınım gerçekleştiği kabul edilir. 500 değeri görecelidir. İstendiği gibi ayarlanabilir. Eğer salınım işlemi var ise pageList Listesinde 1,2,3 page numberlarından olmayan ilk sayfa alınarak ilgili data yandaki gibi çekilir. Amaç önceden gelmemiş bir haberin gelmesini sağlamaktır. results.Skip(5 * page).Take(5).ToArray(); Daha sonra çekilen 5 oyun haberi datası ListAdapter’a RunOnUiThread(() => thread objesi ile gene arkada çalışan bir yapı ile atanarak, kullanıcıya gösterilir. Bu işlem sırasında Android.Widget.Toast.MakeText() methodu ile yukarıda görüldüğü gibi kullanıcı ekranın altında beliren bir text ile kaçıncı sayfadan data çekildiği bilgisi verilir. Dikkat edilecek olursa, gösterilecek toplam 20 haber servisten daha enbaştan uygulama  ilk yüklenilirken çekilmiştir. Böylece telefon sallandığında bir sonraki çekilecek 5 haber için servise bağlanılmamış ve var olan kaynaktan çekilmiştir.

İlgili haberin tıklanmasından sonra haber detayının gösterilmesi aşağıdaki gibi OnListItemClick() methodu ile ViewModel olarak kullandığımız MyData class’ının getValue() methodu ile ilgili Key’in Value değerini göstermesi ile olmaktadır.

 GameListActivity.cs (Tüm Kod) :

Bu örnekden de anlaşılacağı gibi mobile ile yapılabilecek işlerin sınırı yoktur. Sınır sizin hayel gücünüzdür. Unutulmaması gereken tek şey mobile için yazlacak uygulamaların light olması gerektiği ve optimizasyonun önemidir. Sonucta bir pc değildir. Telefonun erişilmesi gereken tüm özellikleri için izin alınması gerektiğide akıldan çıkarılmaması gereken bir husustur.

Source Code : http://www.borakasmer.com/projects/PhoneTest.rar

Yeni bir makalede görüşmek üzere hoşçakalın.

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

10 Cevaplar

  1. Murat dedi ki:

    Selamlar Hocam;
    Gene muhteşem bir makale olmuş. Kitap gibi baştan sona nefessiz okudum. Akşam evde aynen deniyeceğim.
    Böyle güzel yazılar ve emeğiniz için çok teşekkür ederim.

  2. Omer dedi ki:

    Hocam elinize saglik.

    Harika bir makale olmus. Cok yonlulugunuze hayranim. Gecen microsoft’un seminerinde telefonun arka rengini random degistirdiler. Keske sizde katilsa idiniz hocam! Umarim mobile uzerine ornekleriniz devam eder.

    Iyi calismalar.

    • borsoft dedi ki:

      Tesekkürler Ömer. Ben bahsettiğin semineri online izleyebildim. Ziyaretçi olarak katılacaktım. Ama akşam bir işim çıkmıştı. Yoksa yakın arkadaşım Engin Polatı kaçırmazdım:)

  3. Hayri dedi ki:

    Hocam ellerinize sağlık mükemmel bir yazı olmuş. Özellikle mobil üzerine yazılarınızın devam etmenizi istiyorum.

    • borsoft dedi ki:

      Teşekkürler Hayri. Aslında ben web application konuları uzmanıyım. Ama size güzel ve kapsamlı bir örnek hazırlıyorum.
      Ya seminerde ya da makale olarak sizlerle paylaşacam.

  4. FıratKaran dedi ki:

    Selamlar Hocam;

    Nerde ise bu konuda türkçe hiç kaynak yok iken böyle bir makale çölde su gibi oldu hocam. Elinize sağlık. Benim merak ettiğim bir konu var. Öncelikle kodları nezaman koyucaksınız? Bir de sallama eylemini daha hafif bir şekilde yapınca anlamasını sağlamak için ne yapabiliriz?

    Yakında semineriniz olursa katılmaktan mutluluk duyarım hocam.
    Hoşçakalın.

    • borsoft dedi ki:

      Teşekkürler Fırat.Öncelikle ilgin için teşekkürler. Kodları koydum. Sallamanın şiddetini azaltmak istiyorsan öncelikle ShakeThreshold = 500; olan değeri daha aşağıya mesela 300 gibi bir değere çeker isen daha yavaş bir hızda da event tetiklenmiş olur. Yine const int ShakeDetectionTimeLapse = 150; değerini azaltırsan yine daha hafif sallama eylemi ile yeni haberleri çekebilirsin.

  5. Bertan dedi ki:

    Merhabalar
    Yine mükemmel bir yazı olmuş. Zevk ile soluksuz okuyorum ve deneme yanılma yöntemi ile kendimi geliştiriyorum.
    Bu uygulamayı yapmak için kulladığınız kaynaklar nedir?
    Merak ettiğim bir konu var VS de Xamarin kullanarak IOS uygulaması yaptık diyelim. Bu Xamarin bu uygulamayı hem Android için hemde Windows Phone için derleyip navite hale getirebiliyor mu?

    Emeğinize sağlık Teşekkürler.

    • borsoft dedi ki:

      Teşekkürler Bertan;
      Kullandığım kaynaklar Visual Studio Ultimate 2015 Preview, Xamarin Free( Bu nedenle Native uygulama geliştiriyorum.). İşletim sistemi Windows 10. Xamarin Bussines Pack kullanırsan Xamarin Form’da yazabilirsin. O zaman da birkez geliştiriğin kodları hem Android hem Windows Mobile hem de IOS için kullanabilirsin. Hepsi için ayrı ayrı kod geliştirmene gerek kalmaz. Mesela bir alert çıkarıcak isen Android’de ortada, IOS’da yukardan Windows Mobile’da ise alttan çıkacak şekilde Xamarin tarafından derlenir. Yakında Xamarin Bussines Pack kullanacam. Deneyimlerimi paylaşırım.

      İyi çalışmalar Bertan. Yazamaya devam:)

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.