27 Mart 2010 Cumartesi

Android'de SMS okuma işlemleri

Bu yazımızda android cep telefonu hafızasında yer alan kısa mesajları okumayı göstereceğiz. Bunun için öncelikle uygulamamıza SMS okuma iznini vermemiz gerekiyor. AndroidManifest.xml dosyasına satırını eklediğimizde uygulamaya bu izni vermiş oluyoruz. Daha sonra kısa mesajları tutacağımız bir data modeli oluşturuyoruz. Bu nesneye aşağıdaki değişkenleri ekliyoruz.

String address; // gönderen adresi
String contactId_string; // gönderen Id
String body; // mesaj içeriği
long timestamp; // gönderilme tarihi
long threadId; // eğer aynı kişiden birden fazla mesaj alınmışsa android bu mesajlar bir dizi halinde tutar ve id olarak bu değeri verir
int count; // kaçıncı mesaj
long messageId; // mesaj Id - android her mesaja özel bir Id atar

Getter ve Setter metodlarını ekledikten sonra nesnenin adına da SMSMessage gibi bir değer verirsek işimiz tamam oluyor.

Şimdi yapmamız gereken bir Cursor objesi tanımlayıp işletim sisteminin kısa mesajları sakladığı veritabanına sorgu göndermek. Kısa mesajların gelen kutusu "content://sms/inbox" şeklinde tanımlanmıştır. Bu veri tabanında bulabileceğiniz sütunlar ise "_id", "thread_id", "address", "person", "date", "body" şeklindedir. "read" sütunu ise kısa mesajın henüz okunup okunmadığını belirtir.

Aşağıdaki fonksiyon gelen kutusundaki bütün içeriği bir ArrayList içine kayıt edecektir. unreadOnly seçeneği boolean bir değer olup sadece okunmamış mesajları görmenizi sağlar.

public List getAllSmsInbox(boolean unreadOnly) {

// mesajları tutacağımız ArrayList
List results = new ArrayList();

String SMS_READ_COLUMN = "read"; // okundu bilgisiyle ilgili sütun
String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0" : null;
String SORT_ORDER = "date DESC"; // tarihi göre azalan
int count = 0; // mesaj sayısı

// burada sorguyu oluşturup hangi sütunları seçeceğimizi söylüyoruz
Cursor cursor = context.getContentResolver().query(
Uri.parse("content://sms/inbox"),
new String[] { "_id", "thread_id", "address", "person", "date",
"body" }, WHERE_CONDITION, null, SORT_ORDER);

if (cursor != null) {
try {
while (cursor.moveToNext()) {

long messageId = cursor.getLong(0); // id sütunu saklanır
long threadId = cursor.getLong(1); // thread id saklanır
String address = cursor.getString(2); // gönderen adresi saklanır
long contactId = cursor.getLong(3); // kişi id'si saklanır (adres defteriyle ilişkili)
String contactId_string = String.valueOf(contactId);
long timestamp = cursor.getLong(4); // gönderilen zaman saklanır

String body = cursor.getString(5); // mesaj içeriği saklanır

if (!unreadOnly) {
count = 0;
}

SMSMessage smsMessage = new SMSMessage(context, address,
contactId_string, body, timestamp, threadId, count,
messageId); // nesneyi oluşturuyoruz

}
} finally {
cursor.close(); // işimiz bitince cursor kapanmalı yoksa memory leak hatası alırız
}
}
return results; // cevabı döndürüyoruz
}

Aynı yöntemle sistemde saklanan diğer mesaj tiplerine de ulaşabiliriz. Aşağıda bunların bir listesini veriyorum.

SMS Gelen Kutusu = "content://sms/inbox"
Gönderilemeyen SMS = "content://sms/failed"
Bekleyen SMS = "content://sms/queued"
Gönderilmiş SMS = "content://sms/sent"
Taslak SMS = "content://sms/draft"
SMS Giden Kutusu = "content://sms/outbox"
Gönderilememiş SMS = "content://sms/undelivered"
Bütün SMS'ler = "content://sms/all"
Karşılıklı Konuşmalar = "content://sms/conversations"

Hiç yorum yok:

Yorum Gönder