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..
<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
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.
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_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.
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..)
AndroidManifest.xml’in son hali:
<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







Hocam,
cok faydali bir yazi, tesekkur ederim. Ben de bu aralar broadcast receiver ve service kullanan bi program yaziyorum Android 1.5 icin. Bu service calisirken belli zamanlarda preview olusturmadan fotograf cekip sd card a kaydetmesi gerekiyor. Bunu basardim fakat, kaydedilen fotograf hep siyah cikti. Isim ve boyutu dogruydu. Biraz arastirinca gordum ki, android 1.5 focus ve exposure u ayarlamak icin, mutlaka bi surface view de preview yapmaliymis. Simdi bununla ugrasiyorum ama tikandim kaldim.
Service in icinde baska bir class in intentini olusturdum. Bu class hem camera yi hem surfaceview i hem de surfaceview listener i ihtiva ediyor. onSurfaceCreated eventi calistiginda da resmi cekmesi gerekiyor. Ama bu event hic calismiyor sanirim surface gorsel olarak olusturulmadigindan. requestFocus gibi seyler denedim yine bi sonuc alamadim.
Daha sonra biyerde baska bi yontem gordum. Android’in camera servisini statik olarak cagirip, iki satir kod ile, preview olmadan herhangi bi listener olusturmadan buyuk bir resimi kopyalamak mumkunmus. Bunu da denedim ama bu sefer ne hata verdi ne bir resim kopyaladi.
Bu servisi kullanabilmek icin bindService mi gereklidir ve oyleyse bir ornek verebilir misiniz?
Başlangıç programı tam olarak ne işe yarıyor acaba?
hocam merhaba
benim ödevim var ünv okuyorum daha kapsamlı andiroid ile bilgi lazım maddi durumum müsaait deil olsa kitap alacaktım int araştırmadıgım yer kalmadı lütfen bi link yada bana mail atma şansınız varmı
teşekürler
yazilarinizi begenerek okuyorum tsk
yazilarinizi begenerek okuyorum tsk