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 <intent-filter> beyan edin: AndroidManifest.xml dosyasında 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) alabildiğini bildirir.

  2. Compose Navigation 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: Hedef ekranınızda, paylaşılan içeriği almak ve kullanıcı arayüzü durumunuzu güncellemek için amaç ekstralarına (ö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ı, doğrudan bu kişiyle yapılan bir sohbete derin bağlantı veren bir kişi için 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 bazı yaygın MIME türleri şunlardır:

Alıcılar Gönderenler
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 IANA resmi kayıt defterine bakın.

Harika paylaşım hedefleri oluşturma

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

Uygulamanızda veri alma

Compose kullanan bir uygulamada paylaşılan verileri almak için manifestinizde intent filtreleri bildirmeniz, gelen intent'leri derin bağlantılarla uygun ekrana yönlendirmeniz ve kullanıcı arayüzünüzü güncellemek için intent'ten yükü çıkarmanız gerekir.

Manifest dosyanızı güncelleme

Intent filtreleri, sisteme bir uygulama bileşeninin hangi intent'leri kabul ettiğini bildirir. Diğer uygulamalara veri gönderme dersinde ACTION_SEND işlemiyle intent oluşturduğunuz gibi, bu işlemle 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 almayı işliyorsa herhangi bir türden 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'te 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 hedefine 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 amaçın işlem 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 amacı incelerken bunu göz önünde bulundurun.

Gelen verileri kontrol etmeye özen gösterin: Yanlış MIME türü ayarlanmış olabilir veya gönderilen resim çok büyük olabilir. İkili verileri veya yoğun G/Ç işlemlerini (ör. büyük resimlerin kodunu çözme veya dosya yazma) ana kullanıcı arayüzü iş parçacığında değil, 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
    }
}

Niyet ekstralarından (ör. EXTRA_STREAM) ikili verileri veya URI'leri çıkarırken AndroidX Core kitaplığındaki IntentCompat.getParcelableExtra() veya IntentCompat.getParcelableArrayListExtra() işlevlerini kullanın. Bu işlevler, önceki handleSendImage ve handleSendMultipleImages işlevlerinde gösterilmiştir. 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 doldurmak için durumu güncellemek kadar basit veya bir resme filtre uygulamak kadar karmaşık olabilir. Bundan sonraki süreç 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 aşağıdaki örnekte gösterildiği gibi intent'ten EXTRA_TEXT alanını aldığınızdan emin olun:

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 simgesi ve etiketiyle 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'ten 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
  • Çoklu pencere veya bölünmüş ekran modunda başka bir uygulamadan içerik sürükleyip bırakma

Görünüme dayalı kullanıcı arayüzlerinde Android 12 (API düzeyi 31) ve AndroidX Core 1.7, birleştirilmiş OnReceiveContentListener API'sini 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.