Diğer uygulamalardan veri alma

Bir uygulama diğer uygulamalara veri gönderebildiği gibi diğer uygulamalardan veri de alabilir. Kullanıcıların uygulamanızla nasıl etkileşim kurduğunu ve diğer uygulamalardan hangi veri türlerini almak istediğinizi düşünün. Örneğin, bir sosyal ağ uygulaması, başka bir uygulamadan ilginç bir web URL'si gibi metin içeriği almak isteyebilir.

Compose Navigation kullanan bir uygulamada, başka bir uygulama tarafından gönderilen verileri almak üç adımlı bir işlemdir:

  1. Manifest dosyasında bir <intent-filter> tanımlayın: AndroidManifest.xml dosyasındaki etkinliğinize bir intent filtresi eklemeniz gerekir. Bu, Android OS'e uygulamanızın belirli işlemleri (ör. ACTION_SEND) ve MIME türlerini (ör. text/plain) alabileceğini bildirir.

  2. Oluşturma Gezinme grafiğinizde bir navDeepLink tanımlayın: İşlem ve MIME türüyle eşleşen bir navDeepLink öğesini doğrudan içeriği göstermesi gereken composable hedefe ekleyin. NavController, gelen intent'i otomatik olarak yakalar ve kullanıcıyı doğrudan ilgili ekrana yönlendirir.

  3. Gelen veri yükünü ayıklayın: Paylaşılan içeriği almak ve kullanıcı arayüzü durumunuzu güncellemek için hedef ekranınızda intent eklerine (ör. EXTRA_TEXT veya EXTRA_STREAM) erişin.

Doğrudan Paylaşım hedefleri, uygulamanızdaki belirli bir etkinliğe yönlendiren derin bağlantılardır. Genellikle bir kişiyi veya grubu temsil ederler ve Android Sharesheet'te gösterilirler. Örneğin, bir mesajlaşma uygulaması, bir kişi için doğrudan o kişiyle yapılan sohbete derin bağlantı oluşturan bir Doğrudan Paylaşım hedefi sağlayabilir. Ayrıntılı talimatlar için Doğrudan Paylaşım hedefleri sağlama başlıklı makaleyi inceleyin.

Desteklenen MIME türleri

İdeal olarak, bir uygulama mümkün olan en geniş MIME türü aralığını alabilmelidir. Örneğin, metin, resim ve video göndermek için tasarlanmış bir mesajlaşma uygulaması ideal olarak text/*, image/* ve video/* almayı destekler. Android'de veri göndermek ve almak için kullanılan yaygın MIME türlerinden bazıları şunlardır:

Alıcılar, Gönderenler gönderir
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Desteklenen dosya uzantıları application/pdf

MIME medya türlerinin resmi IANA kayıt defterine bakın.

Harika paylaşım hedefleri oluşturma

Kullanıcılar belirli bir etkinlikle ilişkili bir paylaşım hedefine dokunduğunda, uygulamanız kullanmadan önce paylaşılan içeriği onaylamalarına ve düzenlemelerine izin verin. Bu, özellikle metin verileri için önemlidir.

Uygulamanızda veri alma

Compose kullanan bir uygulamada paylaşılan verileri almak için manifest dosyanızda intent filtrelerini tanımlamanız, gelen intent'leri derin bağlantılarla doğru ekrana yönlendirmeniz ve kullanıcı arayüzünüzü güncellemek için intent'ten yükü çıkarmanız gerekir.

Manifest'inizi güncelleme

Intent filtreleri, bir uygulama bileşeninin hangi intent'leri kabul ettiğini sisteme bildirir. Diğer uygulamalara veri gönderme dersinde ACTION_SEND işlemiyle intent oluşturduğunuz gibi, bu işlemi içeren intent'leri almak için intent filtreleri oluşturursunuz. Manifest dosyanızda <intent-filter> öğesini kullanarak bir intent filtresi tanımlarsınız. Örneğin, uygulamanız metin içeriği alıyorsa herhangi bir türde bir veya daha fazla resim içeren bir manifest aşağıdaki snippet'e benzer:

<activity android:name=".ui.MyActivity" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

Başka bir uygulama, bir intent oluşturup startActivity() sınıfına ileterek bu öğelerden herhangi birini paylaşmaya çalıştığında uygulamanız, Android Sharesheet veya intent çözümleyicide bir seçenek olarak listelenir. Kullanıcı uygulamanızı seçerse ilgili etkinlik (önceki örnekte .ui.MyActivity) başlatılır. Ardından, içeriği kodunuzda ve kullanıcı arayüzünüzde uygun şekilde işlemek size kalır.

Compose Navigation'da, içeriği göstermesi gereken composable hedefe doğrudan bir navDeepLink ekleyin. Başka bir uygulama, intent filtrenizle eşleşen veriler paylaştığında Compose Navigation, kullanıcıyı doğrudan bu hedefe yönlendirir:

navDeepLink, doğru hedef ekrana gitmek için gelen intent'in işlemi ve MIME türüyle eşleşir. Bu hedefe ulaştıktan sonra işleyiciniz, hangi yükün alındığını (ör. tek bir resim veya birden fazla resim) belirlemek için intent'i inceler ve ilgili ekstraları çıkarır.

Gelen içeriği işleme

Intent tarafından yayınlanan içeriği almak için composable'ınızdaki LocalActivity.current öğesinden mevcut etkinliği okuyun, ardından intent'i inceleyerek sonraki adımları belirleyin. Bu etkinlik, sistemin diğer bölümlerinden (ör. başlatıcı) başlatılabiliyorsa intent'i incelerken bunu göz önünde bulundurun.

Gelen verileri kontrol ederken daha dikkatli olun: Yanlış MIME türü ayarlanmış olabilir veya gönderilen resim çok büyük olabilir. İkili verileri veya ağır G/Ç işlemlerini (ör. büyük resimlerin kodunu çözme veya dosya yazma) ana kullanıcı arayüzü iş parçacığı yerine eş yordamları (ör. Dispatchers.IO) kullanarak eşzamansız olarak işleyin.

@Composable
fun SharesheetHandler() {
    val activity = LocalActivity.current
    val intent = activity?.intent

    when (intent?.action) {
        Intent.ACTION_SEND -> {
            if (intent.type == "text/plain") {
                handleSendText(intent) // Handle text being sent
            } else if (intent.type?.startsWith("image/") == true) {
                handleSendImage(intent) // Handle single image being sent
            }
        }

        Intent.ACTION_SEND_MULTIPLE -> {
            if (intent.type?.startsWith("image/") == true) {
                handleSendMultipleImages(intent) // Handle multiple images being sent
            }
        }

        else -> {
            // Handle other intents, such as being started from the home screen
        }
    }
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI state with the shared text
    }
}

private fun handleSendImage(intent: Intent) {
    val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUri?.let {
        // Update UI state with the shared image
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    val imageUris =
        IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUris?.let {
        // Update UI state with the shared images
    }
}

Intent eklerinden (ör. EXTRA_STREAM) ikili veri veya URI'leri ayıklarken yukarıdaki handleSendImage ve handleSendMultipleImages işlevlerinde gösterildiği gibi AndroidX Core kitaplığından IntentCompat.getParcelableExtra() veya IntentCompat.getParcelableArrayListExtra() kullanın. Android 13 (API düzeyi 33), beklenen sınıf türünü alan, tür açısından güvenli yöntemler lehine parametresiz Intent.getParcelableExtra(String) yönteminin desteğini sonlandırır.

Verileri aldıktan sonra kullanıcı arayüzünü güncellemek, bir TextField öğesini doldurmak için durumu güncellemek kadar basit veya bir resme filtre uygulamak kadar karmaşık olabilir. Bundan sonra ne olacağı uygulamanıza bağlıdır.

Ekran görüntüsü URL'si paylaşımı

Ekran görüntüsü aldığınızda ekran görüntüsünü ve ilişkili URL'leri paylaşabilirsiniz. Bu sayede daha zengin bir kullanıcı deneyimi sunulur. URL alırken intent'ten EXTRA_TEXT alanını aldığınızdan emin olun. Aşağıdaki örnekte bu gösterilmektedir:

IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
    // Handle the EXTRA_TEXT as well
    val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
    // Update UI state with the shared image and the EXTRA_TEXT if available
}

Kullanıcıların uygulamanızı tanımasını sağlama

Uygulamanız, Android Sharesheet ve intent çözümleyicide simge ve etiket ile temsil edilir. Bunların her ikisi de manifest dosyasında tanımlanır. Daha fazla bağlam sağlamak için etkinlik veya intent filtresi etiketleri ayarlayabilirsiniz.

Android 10 (API düzeyi 29) itibarıyla Android Sharesheet, yalnızca manifest dosyasında application etiketinizde ayarlanan simgeleri kullanır. Android, intent-filter ve activity etiketlerinde ayarlanan simgeleri yoksayar.

Zengin içerik alma

ACTION_SEND intent'leri, Android Sharesheet ve intent çözümleyiciden etkinlik veya gezinme düzeyinde veri alınmasını sağlarken uygulamalar, doğrudan kullanıcı arayüzü etkileşimleri aracılığıyla zengin içerikler (ör. resimler, videolar, ses dosyaları ve stilli metinler) de alabilir. Bu mekanizmalar şunlardır:

  • Panodan yapıştırma (dokunup basılı tutma menüsü)
  • Çıkartma veya GIF gibi medyaları doğrudan yazılım klavyesinden (IME) ekleme
  • Çok pencereli veya bölünmüş ekran modunda başka bir uygulamadan içerik sürükleyip bırakma

Görünüm tabanlı kullanıcı arayüzlerinde Android 12 (API düzeyi 31) ve AndroidX Core 1.7, birleştirilmiş OnReceiveContentListener API'yi kullanıma sunar. Bu dinleyici; panodan, klavyeden ve sürükle-bırak işleminden içerik işlemeyi tek bir geri çağırmada birleştirir. Bunu görünümlerde uygulama hakkında ayrıntılı talimatlar için Zengin içerik alma başlıklı makaleyi inceleyin.

Jetpack Compose'da, Modifier.contentReceiver değiştiricisini veya sürükle ve bırak değiştiricilerini kullanarak kullanıcı arayüzü bileşenlerine (ör. metin alanları) eklenen zengin içerikleri alabilirsiniz.