Mobil Programlama

Android

DERS PROGRAMI
Android 301 Ders Programı

Bir Uygulamadan Sonuç Almak

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

Başka bir Activity'yi çalıştırma işlemi her zaman tek taraflı-karşılıksız olmak zorunda değildir. Başlattıktan sonra ondan sonuç döndürebilirsiniz. Sonuç döndürmek için (startActivity() metodunu çağırmak yerine) startActivityForResult() metodunu çağırmanız yeterli olacaktır.

Örneğin Kamera uygulamasını başlatabilir ve kullanıcının çektiği fotoğrafı "sonuç" olarak alabilirsiniz. Aynı şekilde, Kişiler uygulamasını başlatıp kulllanıcının seçtiği kişinin ayrıntılarını "sonuç" olarak alabilirsiniz.

Elbette Activity'nin bir "sonuç" döndürecek şekilde tasarlanmış olması gerekir. Activity bunu yaptığında, "sonucu" bir Intent nesnesi şekilde döndürür ve siz de Activity'nizdeki onActivityResult() callback metoduyla bu sonucu alırsınız.

NOT: startActivityForResult() metodunu çağıracağınız zaman açık (explicit) veya örtülü (implicit) Intent kullanabilirsiniz (Bu metodun parametre olarak Intent aldığını hatırlatalım). Kendi Activity'lerinizden birini sonuç almak için başlattığınızda, beklediğiniz sonucu aldığınızdan emin olmak için açık Intent kullanmalısınız.

 

Activity'yi başlatmak

Bir Activity'yi sonuç alma işlemi için başlatırken Intent nesnesi kullanıyoruz. Activity'yi başlatırken kullandığınız bu Intent nesnesiyle ilgili özel bir şey yapmanıza gerek olmasa da, startActivityForResult() metoduna parametre olarak geçmek için ayrıca integer bir argüman gerekiyor.

Buradaki integer argüman, isteğinizi kimliklendirmeye ve diğer isteklerden ayırmaya yarayan "istek kodu"nu tanımlar. Kimlik numarası gibi. Her isteğin bir kodu olmalıdır. Sonuç Intent'ini aldığınızda ilgili callback metodu (aşağıda açıklanacak) aynı "istek kodu"nu tanımlar. Böylece siz de sonucu doğru tanımlar ve ona göre işlemeye başlarsınız.

Örneğin, kullanıcının kişi listesinden birini seçmesini sağlayan Activity'yi nasıl başlatacağımıza bakalım:

static final int PICK_CONTACT_REQUEST = 1;  // istek kodu
...
private void pickContact() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE); // sadece telefon numarası olan kullanıcıları göstersin
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

 

Sonucu almak

Kullanıcıya işlemini yaptırtmak için açılan sonraki Activity'de kullanıcının işi bitip geri döndüğünde, sistem bu açma işlemini yaptırdığınız asıl Activity'nizin onActivityResult() metodunu çağırır. Bu metodun üç argümanı vardır:

  • startActivityForResult() metoduna geçirdiğiniz "istek kodu".
  • Sonraki Activity tarafından tanımlanan "sonuç kodu". Eğer işlem başarılıysa RESULT_OK, kullanıcı geri tuşuna basmış ya da farklı bir hatayla karşılaşılmışsa RESULT_CANCELED değerini alacaktır.
  • Sonuç verisini taşıyan bir Intent.

Aşağıda, "bir kişi seçme" yani "pick a contact" Intent'inin sonucunu nasıl işleyebileceğinizi dair bir örnek var:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // metoda gelen isteğin, yanıt vereceğimiz istek olup olmadığını kontrol edelim
    if (requestCode == PICK_CONTACT_REQUEST) {
        // istek başarılı mı diye bakalım
        if (resultCode == RESULT_OK) {
            // Kullanıcımız bir kontakı başarıyla seçmiş.
            // 'Intent data' parametresiyle seçili kontak hakkında daha fazla bilgi alabilirsiniz
            // Kontak ile ilgili bir şeyler yapabilirsiniz (aşağıda daha geniş bir örnek bulabilirsiniz)
        }
    }
}

Bu örnekte, Android'in Kişiler (Contacts) uygulamasının döndürdüğü sonuç Intent'i, kullanıcının seçtiği kişiyi/kişi bilgisini tanımlayan bir Uri içeriğidir.

Sonuçları başarılı bir şekilde yönetmek için sonuç Intent'inin formatının ne olacağını mutlaka anlamış olmalısınız. Sonuç döndüren Activity, kendi Activity'lerinizden biri olduğunda bu kolaydır. Karmaşık sonuç verileri döndüren, güvenebileceğiniz ve Android platformunun kendi API'sini sağladığı uygulamalar da buna dâhildir. Örneklemek gerekirse, Kişiler/Rehber uygulaması her zaman seçilen kişinin bilgilerini Uri ile döndürür ve Kamera uygulaması ise ekstra "data" olarak Bitmap değer döndürür.

 

Bonus: Kişi (Contact) verisini okumak

Kişiler uygulamasından nasıl sonuç alacağınızı gösteren yukarıdaki kod örneği, İçerik Sağlayıcılar (Content Providers) hakkında ileri seviye tartışmaları gerektirdiği için aslında sonuç verisini nasıl okuyacağınızın ayrıntılarını göstermiyor. Meraklı biriyseniz, aşağıdaki örnekte seçilen kişinin telefon numarasını gösteren şu kod ilginizi çekecektir:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // metoda gelen isteğin, yanıt vereceğimiz istek olup olmadığını kontrol edelim
    if (requestCode == PICK_CONTACT_REQUEST) {
        // isteğin başarılı sonuçlandırıldığını doğrulayalım
        if (resultCode == RESULT_OK) {
            // seçilen kişiye işaret eden URI'yi alalım
            Uri contactUri = data.getData();
            // sadece NUMBER sütununa ihtiyacımız var
            String[] projection = {Phone.NUMBER};

            // NUMBER sütununu alarak kişi üzerinde sorgulama yapalım
            // Bir seçim ya da sıralama işine gerek yok (gelen URI'de sadece bir tane sonuç var)
            // DİKKAT: query() metodunu uygulama arayüzünüzü (UI) bloklamamak için
            // farklı bir thread üzerinde çağırmalısınız. Örneğin basitliğini korumak için o
            // işlemi burada yapmıyoruz
            // sorguyu gerçekleştirenin CursorLoader olduğu gözünüzden kaçmasın
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // telefon numarasını NUMBER sütunundan alalım
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

            // telefon numarasıyla ilgili işlemle...
        }
    }
}

NOT: Android 2.3'ten (API 9) önce Kişi Veri Sağlayıcısı (Contacts Provider) üzerinde sorgu yaparken (bir örneğini yukarıda görüyorsunuz), uygulamanız için READ_CONTACTS iznini almanız gerekiyor. Android 2.3 ile başlamak üzere Kişiler/Rehber uygulaması, Contacts Provider'dan size döndüreceği sonucu okuyabilesiniz diye uygulamanıza geçici bir izin verir. Bu geçici izin sadece belli bir kişi isteği yaptığınızda geçerlidir. Bu yüzden READ_CONTACTS iznini uygulamanız için almadıktan sonra, Intent'in Uri değerinde tanımladığınızdan başka bir kişi için sorgulama yapamazsınız.

 

Bu sayfadaki parçalar Android Open Source Project kapsamında oluşturulmuş ve paylaşılmış içeriğin küçük değişiklikler yapılmış hâlidir ve Creative Commons 2.5 Attribution License'ta belirlenen koşullara göre kullanılmıştır.

Bu eğitim içeriğinin orijinal hâline buradan ulaşabilirsiniz: Getting a Result from an Activity