Android: Sensor API’lerini Kullanmak
Yeni nesil mobil cihazlarda artık standart olarak bulunan sensörler sayesinde, elimizdeki küçük cihazlara mükemmel bir işlevsellik ve görsellik katıldığını söylesek, sanırım yanlış bir tabir kullanmış olmayız. Sensörler sayesinde; pusula, oyun kontrolleri, telefon konumuna göre değişen kullanıcı arayüzleri gibi uygulamalar geliştirilebilir.
Android; orientation (cihazın boşluktaki konumu), accelerometer (ivme), light (ışık), magnetic field (manyetik sensörü), proximity (yakınlık), temprature (sıcaklık) sensörlerini destekliyor. (Bu sensörler yazılımsal olarak android tarafından desteklenmektedir fakat bunları telefonunuzda kullanmak için, telefonunuzun da bu özelliklere destek verecek donanımsal niteliğe sahip olması gerekir.)
Bende bu yazımda, android sensörlerinden orientation ile ilgili bir örnek yapacağım. Yani, android telefonumuzun konumunu, açısını ve sayısal olarak pusula verisini görebileceğiz. Kod örneğine geçmeden önce aşağıdakileri resimleri iyi kavramak gerekiyor. Orientation sensöründe 3 farklı değer bulunuyor. Bunlar; X, Y, Z değerleri.
X => Azimuth, telefonun ekran kısmının güney ile yaptığı açı azimuth’dur. Ya da diğer bir ifade ile, telefonun arka kapak bölümü kuzeye bakında, X değeri SIFIR olur. Aşağıdaki resimden daha iyi anlayabilirsiniz.
Y => Pitch değeri, telefonun düzlem ile yaptığı açıdır. Mesela, telefon arka kapağı üzerine masaya bırakılırsa, Y = 0, ekranı üzerine masaya bırakılırsa, Y = -/+ 180 olarak değer alır.
Z => Roll, telefonun dönme açısı. Telefon dik konumdayken, hehrangi bir dönme hareketi yapmadığından Z = 0, sağa dönüşlerde negatif dönme açısı, sola dönüşlerde pozitif dönme açısı yapar.
Şimdi sıra geldi, bu sensörleri kullanabileceğimiz örnek bir program yazmaya. Sensörleri dinlemek için, SensorListener‘dan yararlanıyoruz.
public class MFASensor extends Activity implements SensorListener
SensorListener bize public void onAccuracyChanged(int sensorID, int accuracy) ve public void onSensorChanged(int pSensor, float[] values) fonksiyonlarını implemente etmemizi söylüyor. Sensörlere dair ilgili bilgiler bu iki fonksiyon aracılığı ile bize ulaşacak. onAccuracyChanced() sensörlerin çalışmasında aslında pek bir görevi yok diyebiliriz. Bu konudaki yabancı sitelerde bu konuyla ilgili örnekleri incelediğimde bu fonksiyonun genelde log tutmak için kullanıldığını gördüm.
onSensırChanged() fonksiyonu sayesinde ilgilendiğimiz sensöre dair bilgileri alacağız. Burada float arrayi şeklinde tanımlanmış olan values değişkeninin elemanlarının sahipleri şu şekildedir; values[0] = azimuth, values[1] = pitch, values[2] = roll. Bu değerleri array indexini okuyarak öğreniyoruz ve kullanmak istediğimiz yerlerde sensör değeri olarak kullanıyoruz.
Androis Sensor API’sı bi çok sensörü desteklediğini daha önce belirtmiştim. Biz sensor olarak, yukarıdaki açıklaması yapılanı yani orientation sensörü seçip, kullanacağız. Bunun için kendi unique integer ID’sini bu şekilde belirtiyoruz.
private int sensor = SensorManager.SENSOR_ORIENTATION;
Telefonun donanımından, sensörlere ulaşmak için önce bir sensor manager tanımlıyoruz ve altındaki satırı gerçek sensor managera ulaşmak için kullanıyoruz;
private SensorManager sensorManager; sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Önemli Not 1: Kodlar android emulator üzerinde direk çalışmayacaktır, telefona yükleyerek çalıştırabilirsiniz. Sensor similasyonu için openIntent is minde bir eklenti olduğunu duymuştum, araştırabilirsiniz.
Önemli Not 2: Telefonunuzun Settings > sound&display > orientation özelliği kapalı yada açık olması elde ettiğiniz pitch ve roll değerlerinin farklı olmasına neden olur. Mesela, bu özellik kapalı ise; pitch ve roll değeri yukarıda anlatılan resmin %100 aynısıdır. Fakat, eğer orientation özelliği açık ise, telefonunuzu (tıpkı mesaj yazar gibi) yana yatırdığınızda, otomatik orientation özelliğinden dolayı, pitch değeri roll değeri ile ve roll değeri pitch değer yer değiştirir.Bu durumun ilk etapta kafanızı karıştırmasını önlemek için orientation özelliğini kapatmanızı öneririm.
Orientation Sensöre ait çalışır bir demoyu apk formatında buradan indirip, telefonunuzda hemen deneyebilirsiniz.
Orientation Sensore ait kaynak kodları buradan indirebilirsiniz.
Hoşçakalın,
Mustafa Ferhan Akman
AndroidProgramlama.com
Referanslar:
- Resimler Novoda’nın “sensor event cheat sheet”‘inden alınmıştır.
Mobil İşletim Sistemleri ve Programlama
Piyasada bulunan farklı mobil işletim sistemleri mevcut. Bir çoğu hakkında derinlemesine değil yüzeysel bilgim var, fakat kafamdakileri biraz olsun toparlayarak bir yazıya dökmek istedim. Yazımın, bu tarz konulara eğilecek arkadaşlar için bir çıkış noktası olabileceğini ümit ediyorum.
Şuan piyasada olan 9 işletim işletim sistemine ve onların arkasındakilere bir göz atarak giriş yapalım;
| İşletim Sistemi | Şirket |
| Android | Google (Open Handset Alliance (OHA)) |
| Symbian OS | Symbian Ltd (Nokia satın aldı) |
| iPhone OS | Apple |
| BlackBerry OS | Research In Motion (RIM) |
| Windows Mobile | Microsoft |
| Linux (LiMo, Access Linux …) | |
| Palm OS (Garnet) | Palm |
| Palm webOS (Pre) | Palm |
| Binary Runtime Evironment for Wiress (BREW) | Qualcomm |
Şirket isimlerini özellikle verdim çünkü bir yazılımın yada platformun varlığını sürdürüp daha çok insana hitap eder olması, -malesef- yazılımın kalitesinden çok arkasındaki şirketin büyüklüğünden kaynaklanıyor. Lafın özü, bu işletim sistemlerinin yanlarında yazan şirket isimlerine bakarak, üç aşağı beş yukarı, gelecekleri konusunda fikir sahibi olabileceğimizi düşünüyorum.
Verdiğim 9 işletim sisteminden en çok paya tabii ki Symbian sahip. Nasıl ki, son zamanlarda Kurtlar Vadisi isimli diziyi “eskinin hatırına” izliyorsak, açıkcası Symbian‘da tam olarak böyle bir işletim sistemi:) Her ne kadar Nokia tarafından alınmış olsa ve ardından da pazar daralmasını önlemek için Open Source bir platform hale gelmiş olsa da, açıkcası bu daralma, iPhone, Android ve BlackBerry ‘nin zirve noktalarına ulaşıncaya kadar sürecek gibi görünüyor. Symbian da uygulama geliştirmek isteyen programcılar, Java (JME), NS Basic ve Python gibi dilleri kullanabiliyor. Bu dillerde yazılan kodlar Native olarak C/C++ ‘a çevriliyor. Symbianda kod yazacaksanız, python ve Java bilmiyorsanız, NS Basic‘i öncelikli olarak incelemenizi öneririm. Symbian da kod geliştirmek, Symbian’ın yapısı itibari ile iPhone ve Androidden daha karmaşık olduğunu söylemek sanırım yanlış olmaz. (python ile kod geliştirmenin daha kolay olduğunu söyleyenler var fakat özellik ve kolaylık olarak neleri karşıladığını tam bilmediğimden yorum yazmayacağım ) Symbian, bugün sahip mimarisi itibari, “geri kalmış bir işletim sistemidir” demek, sizce yanlışmıdır?
BlackBerry işletim sisteminde network mimarisinin belirli kısıtlamalara dayandırılması programcılar açısından en başta gelen zorluklardan birtanesidir. 2009 yılının başlarında yapılan bir araştırmada BlackBerry’nin pazar payı % 19.5 gibi büyük bir rakama sahip olduğu anlaşılmıştır. (o zaman ki şartlarda, pazar büyüklüğü olarak 2. sırada). BlackBerry uygulamalarının yapımı ve paylaşılması ise, iPhone, Android, Nokia’nın ardından 4. büyüklüktedir. Bu işletim sistemi üzerinde uygulama geliştirmek isteyen programcılar Java (JME) ile uygulamalarını geliştirebilirler. BlackBerry ile uygulama geliştirme konusunda henüz herhangi bir tecrübeye sahip olmadığım için zorluğu&kolaylığı konusunda malesef bilgi veremiyorum.
Microsoft ailesinin her şeyi yapmaya muktedir evladı .NET’i ve onların ürünlerinden olan Windows Mobile kolay kod
yazımı, zengin araçları ve gelişmiş yan destekçileri ile programcılar için büyük kolaylıklar sağlar. Fakat Windows Mobile’ın istenilen kalite düzeyinde bir mobil işletim sistemi olmamasından, lisans bedellerinin cep telefonu üreticilerinin canını acıtmasından ve verdiği donanımsal desteğin kısıtlı olup üreticlerin kendileri tarafından özelleştirilememesinden kaynaklanan sorunlardan ötürü, yaygınlaşamamıştır. Açıkcası benim görüşüm; Windows Mobile, ya evrim geçirip kendisini toparlayacak ya da bu gidişat ile Microsoft’a ağır bir yenilgi getireceğine yönünde artık kalıplaşmış bir görüşürüm olduğunu söylebilirim.
iPhone telefonları bugün en popüler ve pahalı cep telefonları serisini oluşturuyor. Elbette ki bunun altında, kullandığı iPhone işletim sisteminin (Mac OS X) katkısının büyük olduğu söylenebilir. Apple tarafından bazı mimarisel kısıtlamalar
altında, programcılar arasında pek bilinmeyen ve yaygın olmayan Objective C ile iPhone uygulamaları geliştirilebiliyor. Fakat buna rağmen, bugün en çok yayınlanan uygulama listesinde, iPhone açık ara 1. sıradadır. iPhone SDK’sının bile paralı olması bence programcılar açısından ciddi bir dezavantaj. iPhone pazarı hızla büyüyor ve yeni geliştirilen bir çok “ilginç” iphone uygulaması insanların ufuklarını açıyor desem sanırım yanlış olmaz. iPhone uygulamalarının bir dezavantajı, arkaplanda (background) çalışabilecek uygulama ve servis geliştirilemiyor olmasıdır. Neyse ki, iPhone’da Java ile kod geliştirilebilecek olması, güzel haber. iPhone SDK’sı ile 11 yazıdan oluşan bir diziyi buradan başlayarak okuyabilirsiniz, Javacı arkadaşlarda, J2ME ile nasıl iPhone uygulamaları geliştirebileceklerine dair bir makaleyi buradan bulabilirler.Ve son olarak yakında tam olarak bitecek olan MonoTouch C#isimli derleyici ile de C# ile iPhone uygulamaları geliştirilebiliyor hale gelecek.
Java ve C# Kodlarının Karşılaştırılması
Java veya C#’dan herhangi birisini iyi biliyorsanız, oldukça işinize yarayacak bir dökümanı sizlerle paylaşmak istiyorum. Dökümanı incelediğinizde, paylaştığıma değecek kadar güzel olduğuna kanaat getireceğinize inanıyorum.
Karşılaştırma tablosu için tıklayın.
Yazılım Akademisi 2010′a Katılın! Neden mi?
Yazılım Akademisi 2010 için start verilmiş. Geçen yıl katılıp, ciddi bir efor sarf ettiğimiz yarışmanın güzel şeyler kazandırdığını düşünüyorum. Zamanında IBM’de 9. Olduk yazısında da yazdığım gibi; “… yarışma kültürü gerçekten çok farklı oluyor. Hem heyecanı, hem telaşesi, hem beklentisi… Öğrenci arkadaşlara bu tarz yarışmalara girmelerini ve bu heyecanı tadmalarını şiddetle tavsiye ediyorum..“
Bu yarışmayı özellikle kimlere tavsiye ediyorum biliyormusunuz? Kıbrısta okuyanlara. Ya da kıbrıs gibi üniversitesi üzerinde önyargı olanlara. Çünkü sizde bir gün benim gibi okulunuzdan mezun olup, iş başvuruları yapacağınız zaman CV’lerinizin önüne ekleyeceğiniz “IBM Yazılım Akademisi 2010′da XX. derece sahibiyim” yazısına ihtiyacınız olacak. Bunu okuyan şirket yetkilisinin, ön yargısı kırılmayacak olsa da, en azından sizi bir görüşmeye davet edecektir. Ee, gerisi yapacağınız görüşmede size almış…
Bu yıl açıklanan projelere bakıldığında, gözüme çarpan Akıllı Aygıtların Çevrimiçi İzlenmesi projesi oldu. Projelerin ise -yine- tamamının web tabanlı olacak olması, proje belirlenmesi konusunda yine aynı yanlışlık üzerinde ısrar edildiği manasına geldiğini düşünüyorum.
Yarışma kültürü streslidir. Yarışmaya girmek için çalışmak, zaman ayırmak, emek sarf etmek gerekir ve bunlarda biraz yürek ister. Yazılım Akademisi 2010′a Katılın! Neden mi? Çünkü 1 satır yukarıda saydıklarım atlatıldığında, -sonucu bizimkisi gibi birinci olamamak bile olsa- geriye güzel bilgi birikimleri, çalışma disiplini, iş bitirebilme öz güveni, proje zamanlarına dair anılar ve CV’nizde yer kaplayacak bir kaç satır kalır. Bu saydıklarımı iş hayatına atılmadan önce elde etmenizin keyfini işe başladığınızda süreceğinize emin olun..
Bence değer…
C# Joystick Kullanımı
İnsansız araçlar üzerine ar-ge faaliyetleri olan işimin, yazılımsal olarak ilk yapılması gerekenlerden bir tanesi, bir joystick yardımı ile insansız su üstü deniz aracına ait dümenin manuel olarak yönlendirilebilmesi ve üzerindeki kameranın da aynı şekilde; X ve Y eksenlerinde dönebilmesi, kayıt yapabilmesi vs. gibi tüm fonksiyonlarının joystick üzerinden sağlanması gerekliydi.
Bu konuda internetten araştırma yaptığımda herhangi bir Türkçe makale ile karşılaşmadığım için bende bu yazıyı yazmaya karar verdim. C# Joystick gibi harici araçların kullanımının kolay olduğunu bu yazıyı souna kadar okuduğunuzda sizde göreceksiniz.
Classımıza öncelikle birkaç değşken tanımlayarak başlayalım. Bunlardan joystick değişkeni, bizim Device türünden, diğeri ise Joystick’in durum(state) bilgilerini saklayabileceğimizJoystickState değişkeni. Diğerleri ise joystick’ieksen olark durum bilgilerini saklayan değişkenler ve joystick üzerindeki tüm butonların durumlarını saklaya boolean tipinde buttons array’i. Son olarakta bilgisayara birden fazla bağlı olan joystick bilgisinin instance name’lerini tutabilecek bir String Array’i oluşturuyoruz.
private Device joystick; private JoystickState state; public int Xekseni; public int Yekseni public int Zekseni; public bool[] buttonsState; private string[] joystickStr;
Aşağıdaki kodu yazarak, şuan bilgisayarımıza bağlı bir oyun kontrol cihazlarını cihaz listemize eklemesini söyledik.
DeviceList gameControllerList = Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly);
Eklediğimiz listenin sayısı sıfırdan büyükse (dahası…)
3 Aylık Blog İstatistiğim (Temmuz – Ağustos – Eylül)
Bunu neden yapıyorum bilmiyorum ama yine blog istatistiklerimi yayınlıyacağım. (mesela bir inşaatın zaman içerisinde yükselmesini takip etmek gibi, bir şeyin zamanla yükseldiğini görmek hoşuma gidiyor galiba bu yüzden yapıyor olabilirim:))
Aşağıda, Temmuz, Ağustos ve Eylül aylarına ait veriler mevcuttur:
(dahası…)
Java, MySQL Türkçe Karakter Sorunu
Şuan yaptığım projede, JSP sayfası içerisinde, textboxlar yardımı ile girdi olarak aldığım inputlarımı Servletler aracılığı ile mysql database’ime atıyorum. Fakat Türkçe karakter sorunu yaşadım. Internetten araştırdığımda bir kaç farklı yol buldum fakat hiç birisi derdime derman olmadı. Bulduğum yollardan bazılarını harmanlayarak kullanınca en sonun Türkçe karakter sorunumu aşabildim:)
Birilerinin işine yarar ümidi ile uyguladığım adımları paylaşayım;
1- Öncelikle mysql’den karakter setini UTF8 seçiyoruz.
2- Java class’ı tarafında, Connection’ı tanımlarken normal adresten daha fazlasını kullanıyoruz;
normal adres: jdbc:mysql://localhost:[portnumarası]/[db ismi]
kullanılması gereken:
jdbc:mysql://localhost:[portnumarası]/[db ismi]?useUnicode=true&characterEncoding=UTF-8
3 - Verileri JSP sayfasından verileri çekmeden önce; request.setCharacterEncoding(“ISO-8859-9″); yazıyoruz..
artık database’imize girdiğimiz Türkçe karakterler olması gerektiği gibi görüntülenecek.
Sorularla Android İşletim Sistemi
Android İşletim Sistemi Nedir?
2007 yılı içerisinde Google tarafından mobil cihazlarda kullanılmak üzere çıkartılmış olan bir işletim sistemidir. Daha sonra OHA (Open Handset Alliance) ismindeki birliğe devredilmiş olup, geliştirilmesi ve desteklenmesi bu birlik tarafından yürütülen faaliyetlerle sağlanmıştır.
Rakipleri Kimler?
En büyük rakibi tabi ki IPhone. Şuanki durumu ile, IPhone’dan sonra ikinci durumdadır. Üçüncü Symbian ile Nokia ve en geride ise MS Windows Mobile.
Android’in Piyasadaki Şuanki Durumu ve Geleceği Nedir?
Gelecek “Android” diyecek başlıklı yazıdan, ayrıntılı bilgi alabilirisiniz.
Neden Andorid?
1- Open source (linux üzerine kurulu) 
2- Ücretsiz olduğundan işletim sistemi maliyetini sıfıra düşürüyor ve cep telefonu şirketleri tarafından rağbet görüyor.
3- Android programları java dili kullanılarak geliştirildiğinden, javanın popülerliğinden faydalanılıyor.
4- Belli bir cep telefonu markasında değil, destekleyen tüm cep telefonlarında kullanılacağı için, marka bağımlılığından arındırılıyor.
5- İsteyen üretici, Android işletim sistemini kendisine özgü hale getirip, içerisine kendisine özgü programlar geliştirip telefonu ile beraber piyasaya öyle sunuyor.
6- IPhone’a rakip olabilecek düzeyde; Symbiandan güçlü ve microsft gibi paralı olmayan bir sistem. Kısacası, symbian ve microsoft kıskacından kurtulmak isteyen üreticiler için.
Türkçe dil desteği var mı?
Temmuz ayı içerisinde ilk etapta sadece Amerikaile aynı Türkiyede piyasaya sürülen DSLT1 telefonu içerisinde Türkçe desteği bulunuyor. Eylül ayı içerisinde Samsung i7500 içerisinde de aynı Türkçe destek bulunmakta.
Android ile Uygulama Geliştirmek
Android kodlamasını öğrenmek şuan için biraz meşakkatli diyebilirim. Java diline hakimiyetin yanı sıra, Android’e özel yapıların kavranması emek istiyor. Android’in geliştirilmesinde her ne kadar Java dili kullanılıyor olsada, kullandığı Virtual Machine, Java VM değil, kendisine has olan Dalvik VM’dir. Dolayısıyla bu yapının özelliklerinin iyi kavranması ve oyunu kurallarına göre oynaması için ilk başlarda biraz çaba sarf etmek gerekiyor.
Android’de User Interface’ler iki yolla kodlanabiliyor.
1-) java kodu ile
2-) XML ile.
genel olarak XML yolu tercih ediliyor. Bu sayede kodlarımız MVC yapısında oluyor. Gerek User Interface kodlamada gerekse de telefona ait permissionların verilmesinde XML aktif olarak kullanıldığından, XML teknolojilerine de hakim olmak işleri kolaylaştırıyor.
Android’e ilk adımı atmak için bu linkten faydalanabilirsiniz.
Android’e ait örnek kodlara bakmak için, Google Maps ve Android hakkında yazdığım inceleme yazılarına buradan ulaşabilirsiniz.
Şuan Piyasada olan Android işletim sistemli telefonlar hangileri?
İlk olarak HTC G1 telefonunu çıkardı. Fakat bu telefon Türkiye’de piyasaya sürülmedi.
İkinci olarak, General Mobile, ilk önce
Amerika ve Türkiye DSTL 1 isimli telefonu piyasaya sürdü (Temmuz 2009)
üçünkü olarak Samsung, i7500 modelini piyasaya sürdü. (eylül 2009)
Bunu da okuyun: Mobil İşletim Sistemleri
Servlet + JSP + EJB = MVC
Bu yazımda, Java Teknolojileri ile web tabanlı uygulamalar geliştirebilmek için gerekli olan Servlet ve JSP’nin (JavaServer Pages) zaman içerisinde gelişiminden bahsedip, bu iki teknolojinin MVC ile beraber kullanılmasına değineceğim.
Web uygulamalarının temeline baktığımızda karşımıza Static İçerikli (yani değişmeyen) uygulamarı görürüz.
Yukarıdaki resimde de görebileceğimiz üzere, Web Browser’dan yapılan bir istek, network aracılığı ile Server’a ulaşır. Burada bizim içeriği görüntüleme talebimizi alan Web Server, dosya sistemine bağlanarak, static içerikli (değişmez içerikli) bilgiyi bize HTML sayfası olarak gösterir.
İlerleyen zamanlarda karşımıza, Java Applet’ler çıktı. Aşağıdaki resime bakıldığında, yukarıdakinden çok bir farkının olmadığını görebiliriz. Aradaki tek fark, Client tarafında, bizim applet’imizin görülebilmesi için lazım olan bir JVM. Appletli HTML sayfalarında da static bir içerik söz konusudur. Applet’ler bize static içeriğin görüntülenmesinde çeşitlilik sağladı.
CGI gibi, dinamik içerik sağlamaya yarayan teknolojilerin ardından, Java tarafında da Servlet yapıları oluşturuldu.
Servletler kısaca; web browserdan aldığı parametrelere yada kaynaklara göre, web server’a dinamik içerik üretip gönderirler. (dahası…)
AndroidProgramlama.com
Dün kendi içimde radikal bir karar aldım ve android konusunda bir web sitesi kurmaya karar verdim. Çocukluğumu html ile web sitesi yaparak geçirdiğim aklıma geldikçe, içimdeki isteksizlik miktarında artış olsa da, bu sefer gözlerimi kıstım ve böyle bir çalışma yapmak için elimi taşın altına koydum. Bu platformu oluşturmaktaki amacım, ilerleyen zamanlarda sayısında oldukça artış gözleyeceğimiz Android Programcılarının bir arada bulunabileceği ve birbirleri ile iletişim ve etkileşim sağlayabilecekleri bir zemin oluşturabilmek. Amacıma ulaşacak portalı yapabilirmiyim elbettte ki bunu zaman gösterecek ama şimdilik AndroidProgramlama.com sitesini, blogumun Android ile ilgili yazılarına yönlendirdim.
Ve son birşey daha, aynı zamanda FerhanAkman.com isminide aldım. Yakında kendi hostuma taşınacağım ve orada blogumu yayınlamaya devam edeceğim. Neden mi? bunu da zaman gösterecek:)







bir yorum yazın