26 Haziran 2012 Salı

Sony Xperia S'ten örnek fotoğraflar 2

Sony Xperia S'in 12 MP kamerasının nasıl fotoğraflar çektiğini daha önce paylaşmıştım. Şimdi de yakın çekim ve az ışık performansına dair fotoğraflar paylaşmak istedim.

Güçlü güneş ışığı altında bir Kindle'ın yakın çekim fotoğrafı:


Bir cafede yapay ışık altında makro çekim:


Bir gülün yakın çekimi:



Düşük ışıkta noise seviyesi artabiliyor:



Xperia S'de xenon flash yok ama normal led flash'ı noise düzeyini azaltıyor:



Xperia S incelemesini okumak isterseniz tıklayın.

Yayınlanan tüm fotoğraflar Mobil Yazılar'a aittir. İzinsiz kullanılamaz.

24 Haziran 2012 Pazar

Carnivores: Dinosaur Hunter HD v1.3.1 Android oyunu



Android HD Savaş oyunu
Kategori : Android oyunları
Açıklama: Android telefonlarınız için graifkleri gayet iyi bir aksiyon oyunudur. Oyunda geçmiş yıllardan gelen dinozorları öldürmeye çalışıyorsunuz
Dosya Türü: APK
Destekleyen Mobil Telefonlar:Android 2.1 ve üzeri

Sports Car Challenge v1.0.760 Android apk oyunu

Sports Car Challenge
Sports Car Challenge apk

Sports Car Challenge Android oyunu
Kategori : Android oyunları
Açıklama: Android telefonlarınız için yeni ve güzel bir android yarış oyunudur, önizleme bakarsak grafikler son derece iyiye benziyor
Dosya Türü: Apk
Destekleyen Mobil Telefonlar:Android 2.3+

22 Haziran 2012 Cuma

Android Programlama XIX - Servis Kullanımı

Herkese merhaba!

Bu yazımda sizlere servis kullanımını anlatmaya çalışacağım. Servis kullanarak uygulamanıza arka planda çalışacak özellikler ekleyebilirsiniz. Bu yazıda yazacağımız uygulama arka planda çalışacak ve düzenli aralıklarla ekrana sistem tarihini ve saatini yazdıracak.

ServisOgreniyorum isimli bir proje oluşturarak işe başlayalım.

Projeyle beraber oluşturduğumuz ana etkinliğin tasarımını yaparak işe başlayalım. Servisi durdurup başlatmak için bir düğme ekleyelim. Layout dosyamız aşağıdaki gibi görünmeli.
Kullanacağımız metinleri belirlediğimiz strings.xml dosyamız da şöyle görünmeli.
Şimdi servis sınıfımızı oluşturalım. Ana etkinlik dosyamızdan bir kopya oluşturup içeriğini aşağıdaki gibi değiştirelim.
Projemizin temelleri hazır. Şimdi ana etkinliğimizi açıp servisi başlatıp durdurmakla ilgili kodları yazarak başlayalım.

İlk iş olarak eklediğimiz düğmenin tıklama olayını oluşturalım.
Bu düğmeye tıklandığında servis durdurulmuş haldeyse servis başlatılacak, başlatılmış haldeyse durdurulacak. Bunun için servisin çalışıp çalışmadığını kontrol etmemiz gerekiyor. Haydi bunun için bir metod yazalım.
Bu metod çağrıldığında eğer servisimiz çalışıyorsa geriye true döndürülecek. Eğer çalışmıyorsa false döndürülecek.

Bunun için bir ActivityManager nesnesi oluşturup sistemin etkinlik servisini alıyoruz. Java'nın gelişmiş for döngüsü yapısını kullanarak getRunningServices() metodu ile sistemde çalışan tüm servisleri alıyoruz. Bu metodun döndürdüğü RunningServiceInfo nesnelerinden oluşan dizi içinde servis isimli değişken ile dönüyoruz. Döngü sırasındaki servis nesnesinin paket adı, bizim uygulamamızın paket adına eşitse bizim servisimiz çalışıyor demektir. Bu mantığı kullanarak tüm çalışan servisleri geziyoruz ve bizim servisimiz çalışıyor mu kontrol ediyoruz.

Şimdi tıklama metodumuzun içini dolduralım ve yazdığımız metodu da kullanalım.
Temel mantık bu şekilde olacak. Servis başlatılacağı zaman ilgili metod çağrılacak ve düğmenin üzerindeki yazı durdur yazısına çevrilecek. Servis durdurulacağı zaman da tam tersi yapılacak.

Oluşturduğumuz tıklama olayının parametresi (daha önceki yazılarda bahsettiğim gibi) üzerine tıklanan nesneyi temsil ettiği için v nesnesini Button türüne dönüştürerek dugme ismiyle saklıyoruz. Daha sonra bu nesne üzerinden yazı değişikliğini yapıyoruz.

Tıklama olayımızın kodları bittiğinde aşağıdaki gibi görünmeli.
Şimdi etkinliğin onCreate() metoduna da bir ekleme yapalım. Servis arka planda çalışacağı için servisin çalışıp çalışmama durumuna göre uygulama başlangıcında düğmenin üzerindeki yazıyı belirlememiz gerekiyor. Bunun için aşağıdaki gibi bir ekleme yapıyoruz.
Şimdi servisimizin kodlarını yazalım.

İlk önce düzenli aralıklarla iş yapmak için bir Timer nesnesi ve servis içinden ekrana Toast ile yazı yazabilmek için bir Handler nesnesi tanımlayalım.
Eksik import bilgilerini Ctrl + Shift + O ile ekleyelim. Burada Eclipse birden fazla Handler sınıfı bulduğu için bize hangisini eklemek istediğimizi soracak. Bizim ihtiyacımız olan android.os.Handler olacak.
Şimdi de zamanlayıcının çalışacağı aralığı bir sabit olarak belirleyelim. Buraya milisaniye cinsinden bir zaman belirtmemiz gerekiyor. (1 sn = 1000 ms) Örneğin ben 10 saniyede bir çalışmasını istedim.
Şimdi servisimiz oluşturulduğunda çalıştırılacak onCreate() metodu içinde bu nesnelerimize ilk değerlerini verelim.

yardimci nesnesine uygulamanın ana Looper nesnesini atıyoruz. Böylece bu Handler nesnesine göndereceğimiz bilgiler, içinde bulunduğumuz sınıf yerine (bu durumda bizim servisimiz) uygulamanın kendisi üzerinde işletilecek. Eğer bunu yapmazsak servis sınıfı içinden Toast nesnesi ile bilgi vermemiz mümkün olmayacak.

Şimdi zamanlayıcımıza bir görev verelim. Bunun için TimerTask türünden bir nesneye ihtiyacımız olacak. Ama biz bunu metod çağrısı içinde bir iç sınıf (inner class) oluşturarak yapacağız. Haydi başlayalım.

zamanlayici nesnemiz üzerinden scheduleAtFixedRate() metodunu çağırıyoruz ve parametre olarak yeni bir TimerTask iç sınıfı oluşturuyoruz. Burada Eclipse'in bize sağladığı imkanlardan faydalanacağız.

zamanlayici yazıp yanına bir nokta koyduktan sonra Eclipse bize kullanabileceğimiz metodları listeliyor. Buradan scheduleAtFixedRate() metodunu seçiyoruz.


Daha sonra ilk parametreye new yazıp bir boşluk bırakıyoruz ve Ctrl + Boşluk tuşlarına basıyoruz. Eclipse bize yazıyor olduğumuz parametreyle ilgili önerilerde bulunuyor. Buradan yeni bir iç sınıf oluşturacağız. Anonymous Inner Type seçeneğini seçiyoruz.

 Gördüğünüz gibi iç sınıfımız oluşturuldu.

Şimdi diğer parametreleri değiştiriyoruz ve metod çağrısını sonlandıran parantezin sonrasına ; işaretimizi koyuyoruz.


Burada yazdığımız ikinci parametre zamanlayıcının ne kadarlık bir gecikmeyle işe başlayacağını, üçüncü parametre ise ne kadar zamanda bir zamanlayıcının tekrar çalışacağını belirtiyor. Ben 0 ms gecikme ile ve daha önce belirlediğim 10 sn zaman aralığıyla çalışması gerektiğini belirttim.

Şimdi bu belirttiğimiz özelliklerle yapılacak işi tanımlayalım. Yazının başında belirttiğim gibi bu uygulama düzenli aralıklarla sistem tarihini ve saatini ekrana yazdıracak.

Şimdi bu iş için bir metod oluşturalım.


Gördüğünüz gibi belirttiğimiz aralıklarla bu metod çağrılacak ve ekranda bilgi gösterilecek.

Şimdi bilgiyi belirli bir biçimde göstereceğiz.

Burada Java'nın sunduğu imkanlardan faydalanacağız. İlk önce sistem zamanını alalım. (Bunu bildirim kullanımını anlattığım yazıda kullanmıştık.)


Şimdi bu zamanı kullanarak istediğimiz biçimde bilgi oluşturacağız. Bunun için SimpleDateFormat sınıfından faydalanacağız. Boş bir SimpleDateFormat nesnesi oluşturduktan sonra istediğimiz biçimi belirliyoruz. (SimpleDateFormat için kullanılabilecek biçimlerle ilgili daha fazla bilgiyi internette bulabilirsiniz, ben detaylara girmeyeceğim.)


Şimdi belirlenen biçimi kullanarak bir bilgi oluşturalım. Bunun için SimpleDateFormat nesnemiz üzerinden format() metodunu çağırıyoruz ve gerekli parametre için sistem zamanını kullanarak oluşturduğumuz bir Date nesnesi veriyoruz.


Artık sonuc isimli String bizim istediğimiz şekilde biçimlenmiş tarih ve saat bilgisini içeriyor. Şimdi bunu ekranda göstereceğiz. Bunun için önceden oluşturduğumuz Handler nesnemiz üzerinden post() metodunu çağıracağız ve parametre olarak Runnable türünde bir iç sınıf oluşturacağız.


Artık Toast kullanarak bilgiyi ekranda gösterebiliriz.


Burada bir hata aldık, Eclipse bize sonuc isimli Stringin final olarak belirlenmesi gerektiğini söyledi. Bunun nedenini tam bilmiyorum, o yüzden detaylı anlatamayacağım. Hatayı bu şekilde çözebiliriz.


İşimiz bitti gibi görünüyor ama aslında bitmedi. :) Şu an uygulamayı çalıştırmaya kalkarsak servis durdurulduğunda hata alacağız çünkü zamanlayıcıyı durdurmadık. Haydi şimdi servis durdurulduğunda olacakları belirleyelim.

Servis sınıfımız içinde onDestroy() isimli metodu Override ederek yeniden yazacağız. Bunun için on yazıp Ctrl + Boşluk yapmanız yeterli. Eclipse size yardımcı olacaktır.


Metodu oluşturduktan sonra içine zamanlayıcıyı durduracak kodu ekliyoruz.


Artık işimiz bitti gibi. Son bir adım olarak yazdığımz bu servisi uygulamanın manifest dosyasına ekliyoruz.

Manifest dosyasını açtıktan sonra Application sekmesine geliyoruz. Application Nodes kısmındaki Add düğmesine tıklayıp Service seçeneğini seçiyoruz.

 Daha sonra yan taraftan Name alanının yanındaki Browse'a tıklıyoruz ve servisimizi seçiyoruz.

Manifest dosyasısnı kaydediyoruz.

Haydi şimdi uygulamamızı deneyelim! :)

Gördüğünüz gibi uygulamamız açıldı ve servis çalışmıyor durumda olduğu için düğmenin üzerinde Servisi Başlat yazıyor.


Düğmeye basıp servisi başlattığımızda istediğimiz biçimde oluşturulmuş tarihi ve saati göreceğiz.

Servis arka planda çalıştığı için uygulamadan çıksak bile belirlediğimiz 10 sn ardından tekrar ekranda tarihi ve saati göreceğiz.
Uygulama listesinden uygulamamızı tekrar çalıştırdığımızda ise servis çalışır durumda olduğu için düğmenin üzerinde Servisi Durdur yazıyor.
Bir yazının daha sonuna geldik.

Bu yazıda sizlere servis kullanımını elimden geldiğince anlatmaya çalıştım. Aslında birkaç özellik daha olacaktı yazdığımız uygulamada ama tuhaf sorunlarla karşılaştım. O yüzden yazıyı daha fazla uzatıp sizleri de sıkmamak adına bu kadar yazıp bitirdim.

Uygulamanın kodlarını buradan indirebilirsiniz.

İnşallah faydalı olmuştur.

Hepinize kolay gelsin, iyi çalışmalar. :)

Windows Mobile ve Windows Phone 8

Mobil Yazılar’ın Twitter hesabına “Eski yazılarıma bakınca ‘Zamanında Windows Mobile'dan ne çekmişiz’ diyorum kendi kendime.” şeklinde bir twit attığımda “O günleri hatırlamak dahi istemiyorum…” şeklinde bir cevap gelmişti. Evet, o günlerden beri çok yol kat ettik ve hakikatten de o günleri hatırlamak bile istemiyoruz. Malum telefon çıktığından beri mobil arenada çok şey değişti. Eski krallar tahtlarından düştü. Kimi yok olup gitti, kimi yok olmak üzere.

Microsoft önceleri Palm ile savaş halindeydi. Windows Mobile işletim sistemli ilk Treo’nun lansmanına Bill Gates şahsen katılmıştı. Pek çoklarımız bu Palm markalı, ancak kalbinde Windows Mobile gömülü olan telefonu Microsoft’un zaferi olarak gördük: Sonunda mobil arenadaki tek rakibini alt etmişti. Ancak bu zafer Windows Mobile’ın büyük bir atılım yapmasından çok Palm OS’in yerinde saymasından kaynaklanıyordu! Palm’ın sınırlarından kaçan kullanıcılar soluğu karanlık tarafta aldıklarında onları başka sorunlar bekliyordu. “Zen of Palm”a alışmış kullanıcılar için Windows Mobile’ın kimi noktaları son derece kafa karıştırıcıydı zira.

Neydi bu kafa karıştırıcı noktalar, sorunlar, gariplikler? Windows Mobile’ın stabilite sorunları vardı, arada bir kilitlenirdi, ancak o dönemde bu alışılmadık bir şey değildi. Bence bundan daha önemli bir problemi vardı: Arabirim kullanıcı dostu değildi, kullanıcı deneyimi ciddi manada sıkıntılıydı.

The problem with Windows Mobile

2009 yılında Microsoft’un acilen yapması gereken şeyler başlıklı bir yazı yazmıştım. Yukarıdaki ekran görüntülerinden de görebileceğiniz gibi Windows Mobile özensiz, düzensiz, karmaşık, çirkin ve terkedilmiş bir arabirime sahipti. HTC gibi firmalar inovasyon yapıyordu ama, işletim sisteminin kendisinin kullanıcı deneyimi mantığında da değişime ihtiyaç vardı. Aslında sadece o yazıda verdiğim örnekler çerçevesinde değişiklikler yapılsa bile Windows Mobile daha iyi bir deneyim sunabilirdi.

Microsoft’un çözümü ne oldu? Windows Mobile’ı ve uyumlu programları komple çöpe atıp sıfırdan başlamak. Ama bu eski Microsoft çalışanı Joel Spolsky’nin bir yazısında anlattığı gibi ölümcül oldu: Bolca vakit kaybedildi, Steve Ballmer’ın çok kıymet verdiği “developers developers developers” ortada kaldı, sonuçta güzel arabirimli ama diğer her yönden kısıtlı bir işletim sistemi çıktı. Yavaş yavaş geliştirildi ve “developers” da geri gelmeye başladı ama o sırada Windows Phone 7’nin yeni nesil rakipleri aldı başını gitti. Dolayısıyla da bugün Microsoft’un mobil işletim sisteminin geleceği belli değil.

Vakit varken Windows Mobile üzerinde daha fazla çalışılsaydı ve “Bu cihazı insan kullanacak, insan” deseydi birileri keşke. Biz diyorduk elbette, ama içeriden birileri demeliydi bunu!

Çıkarılacak dersler:
1. Rakibin yokken tembellik etme. İnsanların sana her zaman mecbur olacağını sanma.
2. İnovasyondan asla vazgeçme. En iyisini yaptığını sanma. Daha iyisini nasıl yapacağını düşün.
3. Çözüm odaklı hareket et. Kullanıcı deneyimini mükemmelleştirmeye çalış.
4. Tasarıma her zaman önem ver. Bakması bile keyif verecek ürünler ortaya çıkar.
5. Microsoft bile olsan sıfırdan başlama fikri söz konusu olduğunda durup iyi bir düşün.
6. Kaliteni bir alanda yükseltirken diğer alanlarda düşürme.
7. Rakibini kopyalama. Kopyalayacaksan da iyi yönlerini kopyala Allah aşkına, gidip sınırlı/sorunlu şeylerin aynısını yapmak nedir?
8. Acele et. Rakiplerin uyumuyor, hızlı gelişen ve değişen mobil dünyada sona kalan cidden donakalıyor. Hani nerede ElectroWorld’lerde, Vatan’larda, Hepsiburada’larda Windows Phone’lar? Neden hâlâ gelemedi şu Windows Phone?



Şimdi “Bunun Windows Phone 8 ile ne alakası var?” diyebilirsiniz. Üstteki paragrafları Windows Phone 8 duyurusundan önce yazmıştım. Windows Phone 8 duyurusu güzeldi. Ancak izlerken şunu düşündüm: Palm WebOS duyurusu da çok güzeldi. Böyle duyurular sırasında insanları etkileyebilirsiniz. Ancak sonrasında olanlar ve küçük detaylar gerçek başarıya götürüyor.

Windows Phone 8’de başlat ekranı yenilenmiş. Artık küçük, renkli karelerimizin boyutunu değiştirebilecekmişiz. Bu tür özellikler göz boyama özellikleri ve bir mobil işletim sisteminin kesinlikle ihtiyaç duyduğu özellikler. Evet, insanları etkilemek gerekiyor. Windows Phone 8’in Windows 8 ile aynı kod tabanını paylaşacak olması da güzel bir gelişme. MicroSD kart desteği gibi zaten olması gereken şeylerden bahsetmeye gerek duymuyorum.

Yeni sürümdeki temel sorun şu: Windows Phone 7 cihazlar Windows Phone 8’e yükseltilemiyor. WP8 uygulamaları da WP7’de çalışmıyor. Microsoft ilerlemek için gerekli adımları atıyor, ama WP7 kullanıcıları “WP 7.8” ile yetinmek zorunda kalıyor. Bunun özellikle de Nokia’nın Lumia serisi için iç açıcı bir haber olmadığını düşünüyorum. Dün bir WP7 telefon almış olsaydım bugün çok sinirli olurdum herhalde. Bu saatten sonra da bilinçli bir tüketicinin indirim söz konusu olmadan bir WP7 telefon alacağını sanmıyorum.

İyi bir kullanıcı arabirimi, güçlü cihazlar, kırpılmamış özellikler. Bir de üç ay içinde cihazları aldığınıza pişman etmezlerse... Bu sefer tutabilir mi? Belki. Şimdilik burada bitireyim ve bu sorununun cevabının bence neden “belki” olduğunun açıklamasını da başka bir yazıya bırakayım.

İlgili yazılar:
Nokia'nın Windows Phone 8 telefonları

18 Haziran 2012 Pazartesi

Android Programlama XVIII - Bildirim Kullanımı

Herkese merhaba!

Bu yazımda sizlere cihazınızda nasıl bildirim göstereceğinizi anlatmaya çalışacağım. Çoğu zaman uygulamalar kullanıcıyı bilgilendirmek için push bildirimler kullanırlar. Bu yazımızda bunu (eski ve yeni diye bahsettiğim) 2 farklı yoldan yapacağız.

İşe BildirimOgreniyorum isimli bir proje oluşturarak başlayalım. Daha önceki yazılarımda Android 2.1 ve/veya Android 2.2 sürümlerini kullanmıştım. Bu yazımda seviye 11 veya üzeri bir sürüm seçmemiz gerekiyor. Ben Android 4.0.3'ü kullanacağım.

Yazacağımız uygulamada birisi ana etkinlik birisi de bildirime tıklandığında açılacak etkinlik olmak üzere iki tane etkinliğimiz olacak. O yüzden gerekli dosyaları oluşturalım. Projemiz aşağıdaki gibi bir hal almalı.
Şimdi etkinliklerimizin tasarımlarını yapalım. Ana etkinliğimiz için 2 tane Button kullanacağız. Eklemeleri ve düzenlemeleri yaptıktan sonra ana etkinliğimizin layout dosyası aşağıdaki gibi görünmeli.
Şimdi de ikinci etkinliğimizin tasarımını yapalım. İçerisinde sadece bir yazı olması şu an için yeterli. İşimiz bittiğinde layout dosyamız aşağıdaki gibi olmalı.
Şimdi ana etkinliğimize gidip gerekli kodları yazalım.

İşe eklediğimiz düğmeler için belirlediğimiz tıklama metodlarını yazarak başlayalım.
Dilerseniz eski yöntem ile başlayalım.

Gerekli kodları ekledikten sonra kodumuz aşağıdaki gibi görünmeli.
Bu yöntemde bize bir bildirimi oluşturabilmek için NotificationManager nesnesi, bildirimi tanımlayacağımız bir Notification nesnesi ve bildirime tıklandığında bir şeyler yapabilmek için bir PendingIntent nesnesi gerekiyor.

NotificationManager nesnesine sistemin bildirim hizmetini atıyoruz. Notification nesnesine sırasıyla bildirimin simgesi, durum çubuğunda gösterilecek metin ve bildirimin zamanı şeklinde 3 bilgi veriyoruz. PendingIntent nesnemizi oluşturduğumuz ikinci etkinliği başlatacak şekilde ayarladıktan sonra bildirimin detaylarını belirliyoruz. Son işlem olarak bildirime bir etiket ve id değeri vererek bildirimi gösteriyoruz.

Şimdi yeni yöntemi yazalım. Bu yöntem daha kolay bir yöntem. Yalnız bu yöntemi kullanabilmek için projenizin Android API seviye 11 veya üzeri olması gerekiyor. Eğer bu koşul sağlanmıyorsa bildirimleriniz eski yöntemle oluşturabilirsiniz.

Yeni yöntemin kodları şöyle.
Yine bir NotificationManager nesnesi oluşturuyoruz. Farklı olarak bildirimin tüm özelliklerini Notification.Builder sınıfı üzerinden belirliyoruz.

Gördüğünüz gibi bildirimimizin özelliklerini sırasıyla belirliyoruz. En sonunda da getNotification() metodu ile özelliklerini belirlediğimiz Notification nesnesini alıyoruz.

Son olarak eski yöntemle aynı şekilde bildirimi gösteriyoruz.

Burada farklı olarak setAutoCancel() diye bir metod var. Normalde oluşturulan bildirim üzerine tıklansa bile bildirim menüsünden kaldırılmaz. Ek olarak bildirimi silmemiz gerekir. Bu metodu kullanarak bildirimin üzerine tıklandığında kendiliğinden silinmesini sağlayabiliyoruz.

Şimdi eski yöntemle oluşturulmuş bildirimi üzerine tıklandığında silmek için gerekli işlemi yapalım. Bildirime tıklandığında ikinci etkinliğimiz başlayacağı için, bu etkinlik açıldığında ilgili bildirmi kaldırmamız gerekiyor.

İkinci bildirimin kodlarını açalım ve aşağıdaki kodları ekleyelim.
Eski yöntemle oluşturduğumuz bildirime verdiğimiz etiketi ve id değerini kullanarak NotificationManager nesnesi üzerinden cancel() metodunu çağırarak bildirimi iptal edebiliyoruz.

Şimdi uygulamamızı deneyelim. İkinci etkinliği manifest dosyanıza eklemeyi unutmayın.
Uygulamanın kodlarını buradan indirebilirsiniz.

İnşallah faydalı olmuştur.

Kolay gelsin, iyi çalışmalar. :)