Telefon Api'leri

Adroid işletim sisteminde telefon desteği olan cihazlar için kullanılan sınıflar bulunmaktadır.

Bu sınıflar genel olarak izne tabii olan işlemleri yapabilmektedir. Bazı sınıflar başka sınıflar ile sarmalanarak daha kolay işlem yapılabilmektedir. Burada birtakım sınıflar incelenecek ve birtakım konular reçete şeklinde açıklanacaktır.

Giden Çağrıların Bloklanması

Bazı uygulamalarda belirli telefonların aranması istenmeyebilir. Bu işlem için PROCESS_OUTGOING_CALLS izini alınmalıdır. Bu işlemin yapılabilmesi için bir BroadcastReceiver'a ihityaç vardır.

Bu işlemin en iyi yapılış biçimi bir broadcast yardımıyla olabilir. Bunun için BroadcastReceiver'ın override edilebilen onReceive metodunda gelen numaraya ilişkin bir takım bilgiler elde edilebilmektedir.

Telefonun Güncel Durumunun Alınmsı

Andorid işletim sistemi içerisinde telefonun 3 tane durumu olabilir;

  • Idle durumu : Bu durumuda telefonda herhangi bir çağrı yoktur.

  • Ringing durumu : Bir çağrı geldiği zaman telefon bu duruma geçer.

  • Offhook durumu :Kullanıcı telefona cevap verdiğindeki duruma denir.

Telefonun durumunun elde edilmesi READ_PHONE_STATE isimli bir izne tabiidir. Bu izin tehlikeli bir izin olarak ele alındığından adnroid 6.0 ve üstü için runtime permission izinlerini verilmelidir.

andorid.telephony paketi içerisinde PhoneStateListener isimli ibir soyut(abstract) bir sınıf bulunmaktadır. Bu arayüz telefonun durumunu dinlemek için gereken oncCallStateChange isimli bir metoda sahipti. Bu metod 2 parametreye sahiptir. Birinci parametresi int türden durumun bilgisi değeri ikincisi ise string türden arayan telefon numarasının değeri olacaktır. Telefon servisinin devreye soklulması için sistem servisleri içerisinden context.telephony servisi ile telephonyManager türden değer elde edilir.

PhoneStateListener sınıfından türetilen bir sınıf listen metodu ile dinleme işlemini aşağıdaki şekilde başlatılabilir.

Örnek Proje : [DROPBOX]101-SamplePhoneStateListener

Listen metodunun birinci parametresi PhoneStateListener türünden bir referansdır, Ikincisi ise dinlemenin nasıl yapılacağına ilişkin bir değerdir.

Bu uygulamada BroadcastReceviver yada servis kullanılarak uygulama arka planda telefon dinliyor durmuna geçirilebilir.

Gelen Çağrının Otomatik Cevaplanması

Android işletim sistminde bir cağrıya otomatik olarak cevaplama sağlanabilir. Bunun için yine telephonyManager sınıfı kullanılmaktadır.ActionMediaButtonIntent elemanı ile bu işlemi sağlanabilir.

bu işlemi de verilen intent içerisinde extraState anahtarına sahip değer ek bazı bilgilere ilişkin String türündedir. ExtraState elemanı çalıyor durumunda ise telefon yanıtlacaktır bu durum aşağıdaki gibi olabilir.

if(!intent.getAction().equals("android.action.PHONE_STATE"))
  return;

String extraState = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

if(!extraState.equals(TelephonyManager.EXTRA_STATE_RINGING))
  return;

String phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

if (!phoneNumber.contains("05556725821"))
  return;

Bu durumda gelen telefona ilişkin numara TelephonyManager.EXTA_STATE kullanılarak number değişkiniyle alınabilir.

Bir telefonu otomatik olarak cavaplanması actionMediaButton intent sabiti ile yapılablir.

Bu işlemi içinde READ_PHONE_STATE izni gerekmektdir.

Bu uygulamda answer call metedona ilşikn metodun kullanılması için call answer privilege izinine sahip olmak gerkir. Bu durumda ancak sistem uylaması olmak gerekir sistem uygulamsı olmak için birtakım adaımlardan geçilmesi gerekir yada bu izin için cihazın root (super user) olarak çalışıyor olması gerekir.

Örnek Proje : [DROPBOX]102-AutomaticallyAnswerPhone

Cihazın Uçak Modu Özelliğinin Değiştirilmesi

Android cihazın uçak modu bilgilerinin değiştirebilmesi için right_settings izinine sahip olması gerekmektedir. Bunun için settings.system sınıfının putInt metoduna bir değer aktarılarak bu işlem yapılabilir.benzer şeliklde getInt metodu ile cihazın uçak modu özelliğinin açık olup olmadığı test edilebilir.ayrica bunla birlikte INTENT_ACTION_AIRPLANE_MODE_CHANGE sabiti ile state elemanı bir BroadCast receiver ile gönderilbilir.Bilindiği gibi WRITE_SETTINGS izini tehlikeli bir izin durumundadır.

Anahtar notlar : Andorid işletim sistemin belirli süremlerinden sonra bazı ayarlar global isimli bir sınıf içierisinde bulunmaktadır. Genel olarak global içierindeki ayarlar için WRITE_SECURE_SETTINGS izini gerekmektdir. Bu izin hernekadar WRITE olarak söylenmiş olsada sistem uygulaması (root) dışında yanlızca okunabilir bir işleve sahiptir.

Örnek proje : [DROPBOX]103-AirplaneModeChange

SimCard'a İlişkin Çeşitli Bilgilerin Elde Edilmesi

Telefon içerisindeki Simcard içerisinden bir takım bilgiler elde edilebilmektedir. Örneğin SimCard ID bilgisi, her Simcard için farklı olduğundan Simcard bilgisinin değişip değişmediği anlaşılabilmektedir. Bununla birlikte, örneğin IMEI bilgisi ve eğer Simcard'a yüklenmiş ise telefon numarası gibi bilgilerde ayrıca elde edilebilmektedir.

Bu işlem için TelephonyManager sınıfı kullanılabilir. TelephonyManager sınıfının bir takım metodları ile Simcard ve telefona ilişkin bilgiler gereklidir. Ancak bu bilgiler operatöre ilişkin olduğundan bazıları içerisinde bulunmayabilir dolayısıyla programcının bu bilgilere çok güvenmesi doğru olmaz. Ancak Simcard ID(Seri no) gibi bilgiler mutlaka Simcard içerisinde yazılıdır. Bu bilgilerin alınabilmesi için android.permission.READ_PHONE_STATE izni gerekmektedir. TelephonyManager sınıfı türünden nesne getSystemService() metodu ile elde edilebilir.

[DROPBOX]104-GettingTelephoneInformation

TelephonyManager sınıfının çeşitli metodları ile çeşitli bilgiler elde edilebilir.

SMS İşlemleri

Bir telefon SMS gönderme özelliğine sahip olduğunda programlama yöntemiyle de bu iş yapılabilmektedir. Programlama yöntemiyle SMS gönderimi 2 şekilde yapılabilir:

1-Messaging uygulaması kullanılarak gönderme işlemi:

Bu işlem için herhangi bir izne ihtiyaç yoktur, çünkü SMS işlemleri doğrudan Messaging uygulamasına geçmektedir. Bunun için ACTION_VIEW Intent'i kullanılmaktadır. ACTION_VIEW intent elemanının Adress anahtar isimli elemanına, gönderilecek telefon bilgileri geçilerek gönderim işlemi yapılabilir. Message için SMS_BODY isimli anahtar kullanılmaktadır. Mesajın türü setType metoduyla aşağıdaki gibi belirtilebilir.

intent.setType("vnd.android-dir/mms-sms");

[DROPBOX]105-SendSMSWithMessaging

2- Programlama yöntemiyle gönderme yani SmsManager ile;

Bu işlem için SEND_SMS izni alınması gerekmetedir. Bu izin de Android 6.0 ve üstü versiyonlar için tehlikeli izinler kategorisindedir. Bu işlem için SMSManager isimli sınıf kullanılmaktadır. SmsManager sınıfının getDefault() isimli metodu ile default SmsManager alınıp gönderim işlemi sendTextMessage() metodu ile yapılabilir.

[DROPBOX]106-SendSMSProgrammatically

Bir SMS Mesajının Gönderilip/Gönderilmediğini ve iletilip/iletilmediği SmsManager sınıfının sendTextMessage() metodu ile kontrol edilebilir. Bunun için pendingIntent sınıfı kullanılmaktadır. pendingIntent sınıfı herhangi bir Intent'e ilişkin askıda bekleyen yani aslında arka planda bir BroadcastReciever ile çalışan bir sınıftır. PendingIntent sınıfı ile herhangi bir Reciever'a ilişkin bir filtre belirlenir.

Cihaz İçerisindeki SMSlerin Elde Edilmesi

And. cihaz içerisinde SMS bilgileri gönderilen(sent), gelen(inbox) ve yazılıp yarım bırakılmış yani taslak (draft) halinde 3 şekilde tutulur. "content://sms" ContentProvider'ı ile bu bilgiler elde edilebilir. Bu işlem için READ_SMS izni gerekmektedir. Bu izin tehlikeli durumundadır. Bir SMS'e ilişkin çeşitli bilgiler bulunmaktadır, bunlar;

  • _id : SMS'in tabloda tutulduğu id bilgisi.

  • Address : Mesajın nereden geldiği bilgisi.

  • Body : Mesajın text bilgisi.

  • Read : "0" ise okunmamış, "1" ise okunmuş bilgisi.

  • Date : Milisaniye cinsinden tarih zaman bilgisi.

  • Type : Mesajın türü bilgisi.

[DROPBOX]107-SMSInformation

Gönderilen Mesajların Gözlemlenmesi

Android işletim sisteminde READ_SMS izni ile, gönderilen mesajlar da izlenebilmektedir. Bunun için ContentObserver sınıfından faydalabilir. ContentObserver sınıfı ContentResolver referansı ile register edilerek, dinleme sağlanabilir. ContentObserver sınıfının onChange() metodu yapılan register işlemine göre ilgili olaydan haberder olmak için kullanılmaktadır. Yani programcı örneğin SMS gönderildiğinde bir iş yapmak istiyorsa bu metodu override etmelidir.

ContentObserver sınıfı arka planda asenkron bir akış oluşturduğundan Handler parametresi istemektedir. Dolayısıyla ContentObserver nesnesi activity içerisinde yaratılıp o activity'nin bulunduğu Thread'e ilişkin Handler verilmelidir yada daha önceden yaratılmış o Activity'nin içerisinde Handler verilmelidir.

Anahtar Notlar: Gönderilen bir mesaj gözlemlenirken mesaj gönderildikten sonra Observer nesnesi için birden fazla kez bir önce gönderilen mesaj ile onChange() metodu çağrılmaktadır. Programcı onChange() metodunun son çağrısına bakmalıdır.

Gelen Mesajların Yakalanması

Android işletim sisteminde SMSleri yakalayabilmek için, RECIEVE_SMS izni gerekmektedir. Bu izinde şüphesiz tehlikeli izinler kapsamında ele alınmaktadır. Gelen SMSleri dinleyebilmek için, bir BroadcastReciever sınıfı gerekmektedir. Buna göre bir SMS istenirse Messaging uygulamasına gelmeden bizim uygulamamıza gelebilir. Bunun için ilgili BroadcastReciever'ın önceliğini arttırmamız gerekmektedir. Eğer BroadcastReciever içerisinde abortBroadcast() metodu çağrılırsa bu Broadcast yeniden yayınlanmaz yani gelen SMS bir daha yayınlanmaz, yalnızca bizim uygulamamıza gelmiş olur. SMS işlemleri için SmsMessage isimli bir sınıf kullanılmaktadır.

  • SmsMessage sınıfının getOriginatingAddress() metodu ile SMS in nereden geldiği bilgisi elde edilebilir. getDisplayOriginatingAddress() metodu ile de gelen SMSin hangi isimle görüntüleneceği bilgisidir.
  • SmsMessage sınıfının getMessageBody() metodu ile mesajın bilgisi elde edilebilir.

[DROPBOX]108-SMSIntercepting

Anahtar Not: SMS bilgisi 160 karakterden daha az karakter içeriyorsa bu durumda PDU dizisi tek elemanlı olacaktır. Eğer 160 karakterden fazla ise bu durumda birden fazla elemanlı gelecektir, ancak bu durumda mesajın kimden geldiği bilgisi ilk elemanda yazılacaktır fakat diğerlerinde de yazılmayacağının bir garantisi yoktur.

  • Android 4.4'ten itibaren SMS e ilişkin gelen SMS'lerin uygulamaya geldikten sonra gönderilmeme işlemi iptal edilmiştir. Ancak uygulama default mesaj uygulaması ise SMS'in tekrar yayınlanmasını kaldırabilir.