Mobil Programlama

Android

DERS PROGRAMI
Android 301 Ders Programı

Kullanıcıyı Farklı Bir Uygulamaya Yönlendirmek

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

Android'in uygulamalara sağladığı önemli özelliklerinden biri de kullanıcıyı gerçekleştirmek istedikleri "eyleme göre" başka bir uygulamaya yönlendirme olanağı sunmasıdır. Örneklemek gerekirse, çeşitli resim işleme eylemleri yaptığınız bir uygulamada fotoğraf çekmek için bir activity yazmanıza gerek yoktur. Bunun yerine fotoğraf çekilmesi için bir Intent oluşturmanız ve çalıştırmanız yeterlidir. Sistem sizi kamera uygulamasına kendiliğinden yönlendirecektir.

Uygulamanızın Activity'leri arasında geçmek için Intent kullanmalısınız. Bunu genellikle adresi belli intent'ler (explicit intent) kullanarak, çalıştırmak istediğiniz bileşenin class ismini kullanarak yaparsınız, fakat başka uygulamada bir eylem gerçekleştirmek istediğinizde, örneğin "haritayı göster" gibi, üstü kapalı intent (implicit intent) kullanmak zorundasınız.

Bu eğitim içeriği özel bir eylem için nasıl üstü kapalı (implicit) intent oluşturacağınızı ve diğer uygulamanın ilgili eylemi gerçekleştirecek Activity'sini başlatmak için o Intent'i nasıl kullanacağınız üzerinde duracaktır:

  1. Üstü kapalı (Implicit) intent oluşturma
  2. Intent'i karşılayacak uygulama denetimi
  3. Intent ile bir activity başlatma
  4. Uygulama seçim diyalogu gösterme

 

Üstü kapalı (Implicit) intent oluşturma

Üstü kapalı intent, çalıştırmak istediğiniz bileşenin class'ını çağırmak yerine gerçekleştirmek istediğiniz eylemi belirttiğiniz intent türüdür. Belirttiğiniz eylem ne yapılacağını belirtir, örneğin bir şeyi göster (view), gönder (send), getir (get) gibi. Intentler eylemle ilgili çeşitli bilgiler de taşır. Örneğin göstermek istediğiniz adres, e-posta atılacak kişi, aranacak numara gibi. Oluşturmak istediğiniz Intent'e göre bu veri Uri veya diğer veri tiplerinin biçiminde olabilir veya Intent'in hiçbir veri taşımaya ihtiyacı da olmayabilir.

Uri nedir?

Uri (uniform resource identifier) yani nizami kaynak belirteci, bir kaynağı ya da veriyi isimlendirmek için kullanılan bir standarttır. Aynı zamanda kaynağı nitelendirir. Intent kullanırken bu türden bilgiler gereklidir.

Eğer veriniz Uri şeklindeyse, basit bir Intent() yapılandırıcı metoduyla (constructor) eylemi ve verileri tanımlayabilirisiniz.

Örneğimizde bir telefon araması yaparken Uri verisini nasıl kullandığımızı görebilirsiniz.

Uri number = Uri.parse("tel:5323334455");

Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

Uygulamanız startActivity() ile callIntent isimli Intent'i çağırdığında Telefon uygulaması ilgili numarayı arar. 

Aşağıda çeşitli Uri verileriyle bazı uygulamaların nasıl çağrıldığını görebilirsiniz.

 

Bir harita göstermek

// adrese göre harita noktası
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// ya da enlem ve boylam yerine göre konum bilgisi
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z parametresi yaklaşma seviyesini belirler
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

 

Bir web sayfası göstermek

Uri webpage = Uri.parse("http://www.gelecegiyazanlar.turkcell.com.tr");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

Diğer türlü üstü kapalı Intent'ler, farklı veri tipleri taşıyan "ekstra" veriler gerektirebilir, örneğin String gibi. Bir veya daha fazla ekstra veriyi veri tipine özel farklı putExtra() metotları kullanarak ekleyebilirsiniz.

Bilgi: Intent'e istediğiniz veriyi ekleyemiyorsunuz. Veri tipine özel parametreler kabul eden putExtra() metotları var ve Intent'e ancak belli türden şartları kabul eden verileri ekleyebilirsiniz.

Varsayılan olarak sistem, Intent tarafından gerek duyulan bir MIME tipini o Intent'e eklenen Uri'ye göre belirler. Eğer Intent'e bir Uri ilave etmediyseniz, Intent ile ilişkilendirdiğiniz verinin tipini tanımlamak için setType() metodunu kullanmalısınız. MIME tipini tanımlamak Intent'i alması gereken Activity'lere ilave tanımlar yapmak anlamına gelir.

Aşağıda istenilen eylemi daha iyi tanımlamak için ekstra veri eklenen Intent örneklerini inceleyebilirsiniz.

 

Ekiyle birlikte e-posta göndermek

Intent emailIntent = new Intent(Intent.ACTION_SEND);
//bu Intent'in bir URI'si yok. O halde MIME tipini "text/plain" tanımlayalım
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"destek@gelecegiyazanlar.org", "ali@site.com"}); // alıcılar
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "E-posta başlığı");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Merhaba, uygulama üzerinden e-posta gönderiyorum");
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://epostaya/ekleyeceginiz/dosyanin/adresi"));
// daha fazla eki, Uri'lerden oluşan ArrayList geçirerek de ekleyebilirsiniz.

 

Takvim etkinliği yaratmak

Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar baslamaZamani = Calendar.getInstance().set(2014, 3, 23, 9, 30);
Calendar bitisZamani = Calendar.getInstance().set(2014, 3, 23, 23, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, baslamaZamani.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, bitisZamani.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Bayram kutlaması");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Kasaba meydanı");

Not: Bu Intent kullanımı API seviyesi olarak 14 ve üstlerinde geçerlidir.

Not: Intent'i mümkün olduğunca kullanıma uygun tanımlamanız önemlidir. Örneğin ACTION_VIEW Intent'ini kullanarak bir resim göstermek istiyorsanız, MIME tipini image/* olarak tanımlamalısınız. Bunu yaptığınızda Intent tarafından tetiklenmiş olan, diğer veri tiplerini gösterebilen (view) uygulamaların (harita uygulaması gibi) önüne geçersiniz.

Bunu biraz daha açıklayalım: Bir resim görüntülemek istediğini varsayalım. Bu resmi görüntüleyecek bir uygulama açmaya çalışırken Intent'inizi ACTION_VIEW eylemiyle yapılandırırsınız ancak ACTION_VIEW eylemi çok genel bir ifade. VIEW edebilen yani bir şeyler gösterebilen birçok uygulama olabilir. Eğer oluşturduğunuz Intent'in MIME tipini image/* olarak belirtmezseniz, sadece görselleri gösterebilen uygulamaları hedeflemiş olursunuz.

 

Intent'i karşılayacak uygulama denetimi

Android platformu belli Intent'lerin yerleşik uygulamalarca (Telefon, e-posta veya takvim uygulaması gibi) karşılık bulacağını garanti ediyor olsa da siz bir Intent'i çağırmadan önce mutlaka bir doğrulama adımı eklemelisiniz.

Uyarı: Eğer Intent'i çağırdığınızda cihazda belirttiğiniz işlemi yapacak bir uygulama yoksa, uygulamanız çökecektir.

Intent'e yanıt verecek bir Activity'nin olup olmadığını doğrulamak için, queryIntentActivites() metodunu çağırarak Intent'inizi karşılama yeteneği olan Activity'lerin listesini alabilirsiniz. Dönen List boş değilse Intent'inizi güvenle kullanabilirsiniz. Örneğin:

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;

Eğer isIntentSafe değeri true ise en az bir uygulama Intent'e cevap verecektir. Eğer dönen cevap false ise almak istediğiniz eyleminizi gerçekleştirebilecek bir uygulama bulunmamaktadır. 

NOT: Activity'niz ilk başladığında bu kontrolü yapmanız, belki de Intent kullanmaya çalışırken hata vermeden önce kapatmanız gereken özellikler olabileceği için makul bir işlem olabilir. Böyle bir durumda, yapmak istediğini eylemi yapan uygulamalara bağlantı verebilirsiniz. (Google Play'de uygulamanıza bağlantı vermek belgesine bakabilirsiniz.)

 

Intent ile bir activity başlatma

Bir kere Intent'inizi oluşturup ekstra verileri ayarladığınızda startActivity() metodunu çağırarak bunu sisteme gönderebilirsiniz. Sistem işlemi gerçekleştirebilecek birden fazla Activity bulursa, kullanacağı uygulamayı kullanıcıya açtığı diyalog penceresinde gösterir. (Bkz Resim 1)

Resim 1: Intent'i karşılayabilecek birden fazla uygulama olduğunda çıkan seçim diyalogu

Eğer uygun sadece bir Activity varsa, sistem hemen şu metodu çalıştırır:

startActivity(intent);

Aşağıda bir uygulamada harita gösteriminin nasıl olacağını, ilgili uygulamanın doğrulamasını nasıl yapacağınızı gösteren kodu görebilirsiniz.



//Intent'i oluşturalım
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// Karşılanacağının doğrulamasını yapalım
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// güvenli ise bir activity başlatalım
if (isIntentSafe) {
    startActivity(mapIntent);
}

 

Uygulama seçim diyalogu gösterme

Bir Activity'yi oluşturduğunuz Intent'i startActivity() metoduna geçirerek başlattığınızda ve Intent'inize yanıt verebilecek birden fazla uygulama olduğunda kullanıcı varsayılan olarak kullanılacak uygulamayı seçebilir. (Diyalog pencereciğinin altındaki seçenek kutusunu seçerek; Bkz: Resim 1) Bu durumlarda oluşan pencereden kullanıcı her zaman kullanacağı uygulamayı seçebilir. Web sitesi açılışlarında kullandığı web tarayıcıyı veya fotoğraf çekmek için kullandığı kamera uygulamasını insanlar genelde değiştirmek istemezler. Bu gibi durumlar için hoş bir özelliktir.

Resim 2: Seçim diyalogu

Bunun yanında bazı uygulamalarda bu tercih sık sık değişebilir, örneğin paylaşma aksiyonunu bazen Bluetooth, bazen e-posta bazen mesaj tercih edilebilir. Bunun gibi değişkenlik gösteren isteklere karşı bir seçim ekranı kullanmanız ve her zaman kullanmanız gereklidir.

Seçim pencereciğini göstermek için createChooser() metodunu kullanarak bir Intent oluşturup, startActivity()'ye geçirebilirsiniz. Örneğin,

Intent intent = new Intent(Intent.ACTION_SEND);

...

// arayüz metinleri için her zaman string kaynakları kullanın
// örneğin burada title değişkenine "Fotoğrafı şununla paylaş"
// metnini atamış oluyoruz
String title = getResources().getString(R.string.secici_basligi);
// seçici ekranı göstermek için Intent oluşturuyoruz
Intent chooser = Intent.createChooser(intent, title);

// Intent'in en az bir Activity çözümleneceğini doğruluyoruz
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

Bu kodla createChooser() metoduna geçirilmiş Intent'e karşılık gelebilecek uygulamaların listesini gösteren bir diyalog pencereciğinde gösterilir ve R.string.secici_basligi değişkeninden sağlanan metin diyalog başlığı olarak kullanılır.

 

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: Sending the User to Another App