top-image

Hikaye: Telefonunuz yeni açıldığında, programınızın otomatik olarak açılmasını sağlayabilir, ya da arka planda bazı önyüklemeleri gerçekleştirebilirsiniz. İşte bende bugün yeni yapmaya başladığım bir programın benzer bir özelliği olmasını istediğim için bu konuyu araştırmaya koyuldum. Zaman içerisinde değişen Android API’leri yüzünden internetten araştırıp bulduğum hiç bir bilginin tam ve geçerli olmaması sonucunda, yarım saatte yapmayı planladığım şeyi ancak yarım günde yapabildim. Zaten bu dökümanı yazma sebebim de tam olarak bu oluyor.

Background: Öncelikle Broadcast Receiver (ya da eski ismiyle Intent Receiver) ile, cep telefonumuzun açıldığını anlayacağız. Peki ama Broadcast Receiver’da ne oluyor? derseniz; Broadcast kelime manası olarak, “yayın yapmak” demektir. Bunu televizyon yayınına benzetebiliriz. Ortada bir antenden, her tarafa yayın yapılır ve o sinyali almak isteyen herkes alır. Tam olarak Android işletim sistemi içerisindeki broadcast yayını da böyle yapılır. İşletim sistemi içerisinde gerçekleşen bir olay karşısında, “ben bunu yaptım” diye bir yayın yapar. Bu bilgiyi almak isteyen her program bunu alarak kullanır, tepki verir. Mesela cep telefonuna bir SMS mesajı geldiğinde, Android bir broadcast yayını ile(intent göndererek) tüm programlara SMS alındığına dair bilgilendirir. Aynı şekilde, cep telefonumuz açıldığında, Android bize telefonun açılışını haber verebilir. Biz yeter ki bu yöne kulağımızı kabartalım :)

İcraat: İşte BroadReceiver sayesinde, tüm broadcastlara ulaşabiliriz. Fakat önemli olan tüm broadcast yayınları içerisinden işimize yarayacak olana ulaşabilmek. Bunun için gelen broadcastları AndroidManifest.xml içerisinde filtreleyeceğiz. Tabi bir de tüm bu işlemler için gerekli permission’ları yine AndroidManifest.xml içerisinde tanımlamış olmamız gerekiyor. İsterseniz artık icraata geçelim..

<receiver android:name=".StartupBroadcastReceiver">
        <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</receiver>

Yukarıdaki gibi bir receiver’ımız için bir filtre yazıyoruz. Yani, tüm broadcast yayınları içerisinden telefonun açılışının ardından yapılan yayını yakalayacağız. Bunu

android.intent.action.BOOT_COMPLETED

sayesinde anlayacağız. Fakat bu broadcast yayını dinleyebilmemiz için de, belli izinleri almış olmamız gerekiyor. Bunun için yine AndrodManifest.xml’in içerisine şu permission kodunu ekliyoruz.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

Yanılgı: Her ne kadar Android’in kendi sitesindeki dökümanlarda ve diğer bir çok sitede yukarıdaki permission’un yeterli olduğu yazsa da, telefon açılışının dinlenmesinde kullanılacak izin için aslında bu tek başına yeterli değildir. Benim yarım gün boyunca boşuna uğraşmamın sebeblerinden bir tanesi olan bu permissionun yanına aşağıdakilerin de tamamını eklemediğiniz sürece, (Android 1.5 ve 2.0′da test edilmiştir) almak istediğimiz broadcast yayınını asla alamayacağız. Ekleyeceğimiz extra permission’lar.

<uses-permission android:name="android.permission.ACCESS_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_GPS" />
        <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
        <uses-permission android:name="android.permission.ACCESS_CELL_ID" />

Ne alaka? diyebilirsiniz.. fakat uzuuun araştırmalarım sonucunda ben internette çözüm yolu olarak sadece bunun işe yaradığını gördüm. (Extra not: gerçek bir telefona bu programı kurmaya çalıştığımda, bu extra izinlerin install ekranındaki bilgilendirmede karşıma çıkmadığını gördüm. Bunun manası, “ben aslında bu özellikleri kullanmıyorum” demek olsa da, bize neden bu izinleri aldırttığını henüz çözebilmiş değilim.)

Sıra geldi, filtreleyerek aldığımız broadcastımızın çalışacağı class’ı oluşturmaya.

public class StartupIntentReceiver extends  BroadcastReceiver  {
   @Override
    public void onReceive(Context context, Intent intent) {
    Intent startupIntent = new Intent(context, RunMfa.class);
    startupIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(startupIntent);
  }
}

Filtreleyerek aldığımız broadcastımız bu classın çalışmasına neden oldu. Ve bizde Intent ile RunMfa activity’sinin çalışmasını söylüyoruz. (Mesela bu programımızın ana ekranı olabilir..)

public class RunMfa extends Activity{
   TextView tv;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      tv = (TextView) findViewById(R.id.serialTV);  
      tv.setText(“Run start up ile calisti -by Mustafa Ferhan Akman”);
   }
}

AndroidManifest.xml’in son hali:

<?xml version=”1.0¨ encoding=”utf-8¨?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android“  
package=”com.androidprogramcisi” android:versionCode=”1¨  android:versionName=”1.0¨>

 <uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” />
 <uses-permission android:name=”android.permission.ACCESS_LOCATION” />
 <uses-permission android:name=”android.permission.ACCESS_GPS” />
 <uses-permission android:name=”android.permission.ACCESS_ASSISTED_GPS” />
 <uses-permission android:name=”android.permission.ACCESS_CELL_ID” />
 
 <application android:icon=”@drawable/icon”   android:label=”@string/app_name”
<activity android:name=”.RunMfa” android:label=”@string/app_name”></activity>

 <receiver android:name=”.StartupIntentReceiver”>
  <intent-filter>
   <action android:name=”android.intent.action.BOOT_COMPLETED” />
   <category android:name=”android.intent.category.LAUNCHER” />
  </intent-filter>
 </receiver>
</application>
 <uses-sdk android:minSdkVersion=”3¨ />
</manifest>

inşaallah benim gibi uzun uzun araştırmak zorunda kalmadan bu dökümana ulaşırsınız diyerek yazımı sonlandırıyorum..
Hoşcakalın.
15 Şubat 2010

1 kişi bu yazıyı beğendi.

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. Ben bi android programcısı olarak sensörlerle çalışmaktan zevk alıyorum, emin olun sizde bundan çok hoşlanacaksınız:) Şimdi, 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 SensorExample 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 yada values[] değerlerini alırken, 0-1-2 yerine 3-4-5 indexlerini kullanırsanız, telefonun orientation’ı değişse bile elinizdeki verilerin yerleri değişmeyecektir.
Orientation Sensöre ait çalışır bir demoyu apk formatında buradan indirip, telefonunuzda hemen deneyebilirsiniz.
Orientation Sensore ait kaynak kodları buradan indirebilirsiniz.

Referanslar:
* Resimler Novoda’nın “sensor event cheat sheet”‘inden alınmıştır.

1-) Öncelikle programımızda kullanacağımız haritanın ekranını belirleyecek olan UI’mizi yazalım. “layout” klasörünün içerisinde maps.xml dosyasını oluşturalım.

<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
  <com.google.android.maps.MapView
   android:id="@+id/map_view"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:apiKey="1. YAZIDA OGRENEREK ALDIGINIZ API KEYI BURAYA YAZIN"
 />
</LinearLayout>

Harita ekranın gözükecek ekranımızı belirledik. Yukarıdaki kodlara bakınca, uygulamamızda Google MAPs açıldıktan sonra tüm ekranı kaplaması gerektiğini söylemek dışında herhangi bir şey yapmadık. apiKey= “” kısmına kendi elde ettiğimiz api key’ini yazdık.

2-) ikinci adımda, bir tane class MapActivity class’ı oluşturacağız. Bunun için herhangi bir isimde class yazıp extends MapActivity yazacağız. Ben class ismimi MapsProcess olarak verdim.

public class MapsProcess extends MapActivity {
        MapView map;

        @Override
        protected void onCreate(Bundle icicle) {
                // TODO Auto-generated method stub
                super.onCreate(icicle);
                setContentView(R.layout.maps);

                map = (MapView) findViewById(R.id.map_view);
        }

        @Override
        protected boolean isRouteDisplayed() {
                // TODO Auto-generated method stub
                return false;
        }
}

Yukarıda gördüğünüz MapActivity class’ımızı oluşturduk. Biz bu classı oluşturup, MapActivity’i extend ettiğimizde eclipse bize isRouteDisplayed() method’unun override edilmesi gerektiğini söyledi. Bu method, rutin bilgileri otomatik olarak alabilmemizi sağlıyor. Bu rutin bilgileri mesela trafik yön veya adres bilgileri gibi düşünebiliriz. Bizim şimdilik bununla herhangi bir işimiz olmadığı için return false olarak yazdık.

Her android activity’sinin yaşam döngüsü, OnCreate() methodu ile başlar. Bizim MapActivity classımızın yaşamı burada başlıyor. Bu method içerisine baktığımızda, Maps.xml dosyamız içerisindeki MapsView componentimizi üzerinde işlem yapabilmek için java kodumuz içerisinde çağıracağız. Bunun için class’ın hemen altında bir tane MapView oluşturduk ve alt satırlarda da xml dosyası içerisinden ilgili componentin ismini çağırdık.
3-) Haritamız bir butona basıldığı zaman açılsın demiştik. Önce butonumuzun listener’ını yazalım.

applyBtn = (Button) findViewById(R.id.applyBtn);
        applyBtn.setOnClickListener(new OnClickListener(){

                        @Override
                        public void onClick(View v) {
                                Intent i = new Intent(getApplicationContext(), MapsProcess.class);
                                startActivity(i);
                        }
        });
    }
}

ekranda ilk karşımıza gelecek olan butona listener ekledik, tıklandığı zaman MapsProcess isimli activity’i başlatmasını söyledik. Bunun için Intent kullandık. Fakat bir activity’nin başlatılabilmesi için bu kadarı yeterli değil. Programımızın manifest dosyası içerisine intent ile başlacağımız classın bir acticity olduğunu belirtmemiz gerekiyor. Bunun için tagları içerisinde bunu programımıza belirttik.

<activity android:name=".MapsProcess" android:label="First Maps Activity"/>

4-) Son olarak, yine AndroidManifest.xml dosyası içerisinde yapmamız gereken 2 ufak iş kaldı. Birinicisi, programımıza Maps kütüphanelerini kullanacağımızı söyleyeceğiz, ikincisi de programımızın internete bağlanabilip, haritayı gösterebilmesi için gerekli permission’ı vereceğiz. Aşağıdaki gibi;

<uses-permission xmlns:android="http://schemas.android.com/apk/res/android" android:name="android.permission.INTERNET"/>

sonuç olarak AndroidManifest.xml dosyası şu halde olmuş oluyor;

<?xml version="1.0" encoding="utf-8"?>
<manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.ferhan.akman.GoogleMaps">
    <application android:icon="@drawable/icon">
    <uses-library android:name="com.google.android.maps"/>
        <activity android:name=".FirstGoogleMapsApp"
                 android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MapsProcess" android:label="First Maps Activity"/>
    </application>
    <uses-permission xmlns:android="http://schemas.android.com/apk/res/android" android:name="android.permission.INTERNET"></uses-permission>
</manifest>

Uzun ve karmaşık gibi gözükse de, Android’in genel konseptini anladıktan sonra oldukça basit olduğunu göreceksiniz.
Programın çalışır haldeki proje dosyasını buradan indirebilirsiniz.

1 kişi bu yazıyı beğendi.

Giriş  Android uygulamamıza Google haritası ekleyerek, daha görsel uygulamalar geliştirebiliriz. Mesela adres bilgileri, konum bilgileri, yol haritaları günlük hayatımızı kolaylaştıracak bir çok bilgiyi içerisinde saklıyor.  

Yukarıda saydıklarımın dışına çıkıp farklı olması açısında örnek bir program verecek olursak, Android’e kendi konum bilginizin nerede olduğunu öğrenebileceğiniz bir program geliştirebilir, sonra bunu yine aynı program üzerinden arkadaşınız ile paylaşabilir sonuç olarak bir arkadaş grubundaki kişilerin anlık olarak nerede olduklarını harita üzerinden takip edebilirsiniz (bu genellikle kargo firmaları, yemek dağıtım firmaları gibi filosu olan firmalar tarafından tercih edilen bir yöntemdir).   

 Maps API Key Almak  

Google Maps API’lerini programlarımız içerisinde kullanabilmemiz için, yapmamız gereken bazı işlemler vardır. Eğer Android’im emulatörü üzerinde program geliştiriyorsak;

C:\Documents and Settings\username\Local Settings\Application Data\Android

  burada SDK’nin sertifasını olduğunu görebiriz. debug.keystore ismindeki dosyayı mesela, C:\ ‘nin altında C:\Android‘e taşıyalım.   

Şimdi, 

C:\Program Files\Java\\bin

dosyasının altındaki keytools.exe dosyasını kullanarak, bir tane MD5 fingerprint (md5 parmak izi) oluştracağız. Ve bu oluşturduğumuz parmak izini kullanarak Google Maps API’lerini kullanacağız. Aşağıdaki komutu dos ekranında yazalım.  

keytool.exe -list -alias androiddebugkey -keystore "C:\android\debug.keystore" -storepass android -keypass android

and-goog-2   

Resimde de görüldüğü üzere, MD5 Fingerprint’imizi aldık. Şimdi sıra geldi, bu kodu Google amcaya söylemeye.   

http://code.google.com/intl/tr-TR/android/maps-api-signup.html Adresine gidip, MD5′imizi yazıyoruz. Ve artık Google tarafından üretilen anahtarımızı alıp, programımıza girdikten sonra, haritamız kullanıma hazır hale gelmek üzere…

android:id="@+id/map_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="GOOGLE-MAPS-API-KEY"

/&gt;

Yukarıdaki kod kendi programımımda kullandığım örnek bir XML uygulaması. android:apiKey=”GOOGLE-MAPS-API-KEY” yazan yere kodumuzu ekleyelim. Ve artık programımızda Google Haritası Kullanabiliriz! 

23 Mayıs 2009
Yazan: Mustafa Ferhan Akman

1 kişi bu yazıyı beğendi.

 

Google Android programlama yeni başlayacaklar için çok ideal bir kitap. Herhangi bir bilgi derinliğinden ziyade, konsepti anlatmak için yazılmış olan kitabın bana oldukça faydası olduğunu düşünüyorum. Kitap ücretsizdir, yukarıda verdiğim adresten kitabın PDF dosyasını bilgisayarınıza indirebilirsiniz.

anddev sitesinden kitabı indirebilirsiniz (kitap ücretsizdir)

Merhaba, bu yazımda Google Android’in gerekli plug-inlerini Eclipse üzerine kuracağız ve böylelikle Eclipse ile Android entegrasyonunu sağlamış olacağız.
(NOT: Ben anlatımımı Linux üzerinden yaptım fakat tüm adımlar windows işletim sisteminde de aynıdır.)

1.Adım:

Bilgisayarınızda, Java Development Kit var mı? yoksa,http://java.sun.com/javase/downloads/index.jsp adresinden işletim sistemimize uygun olarak bu eksikliğimizi giderelim.

 

2.Adım

Android ortamındaki geliştirmelerimizi Eclipse ortamında yapacağımız için, elimizde Eclipse olması gerekiyor. Eğer yoksa, http://www.eclipse.org/downloads/ adresinden yine sistemimiz için uygun olanını indirelim.

3.Adım

intro_and_1

Şimdi, Android Software Development Kit’i indirelim. http://developer.android.com/sdk adresine gidelim ve yine işletim sistemimize uygun olanı seçip indirelim.

4.Adım 

Yukarıdaki 3 adımı doğru bir şekilde geçtiyseniz, şimdi sıra Eclipse üzerinde çalışmaya geldi.
Eclipse’i açalım. Help > Software Updates….
Available Software sekmesini seçelim

Add Site… dendikten sonra aşağıdaki resimdeki gibi https://dl-ssl.google.com/android/eclipse adresi ekleyelim..

intro_and_2

Siteyi ekledikten sonra, yanında çıkan kutucuğu işaretleyip, sayanın sağ üst köşesinde yer alan Install… butonuna tıklayarak, kuralım.
Software Update işlemi işlemi bittikten sonra büyük ihtimalle sizin onayınızla birlikte Eclipse kendisini yeniden başlatmak isteyecektir.

5.Adım
Şimdi sıra geldi, Eclipse ile Android SDK’sını birbiri ile tanıştırmaya. Bunun için 3.Adımda indirdiğimiz Android SDK’yı zip dosyasının içerisinden çıkaralım. Daha sonra Window > Preferences… diyerek, sol menüde Android‘i seçtikten sonra SDK’nın olduğu klasörü seçiyoruz.

intro_and_3

OK butonunu seçtikten sonra 1-2 dk konfigrasyon ayarları sürebilir.

ve artık hazır!

Artık bir Hello World uygulamasına geçebiliriz:)

http://www.eclipse.org/downloads/

4 kişi bu yazıyı beğendi.
bottom-img