Diğer uygulamalardan basit veriler alma

Bir uygulama diğer uygulamalara veri gönderebildiği gibi diğer uygulamalardan da veri 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 alma işlemi iki aşamalıdır:

  1. Manifest dosyasında <intent-filter> tanımlayın: AndroidManifest.xml dosyasındaki etkinliğinize yine 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. Compose Navigation grafiğinizde bir navDeepLink tanımlayın: Etkinliğinizin onCreate veya onNewIntent yöntemlerindeki Intent'i manuel olarak yakalayıp ayrıştırmak yerine Compose Navigation'ın derin bağlantı desteğini kullanın. İçeriği göstermesi gereken composable hedefine, işlem ve MIME türüyle eşleşen bir navDeepLink doğrudan ekleyin. NavController, Intent'i otomatik olarak yakalar ve kullanıcıyı doğrudan bu ekrana yönlendirir.

Doğrudan paylaşım hedefleri, uygulamanızdaki belirli bir etkinliğe giden derin bağlantılardır. Genellikle bir kişiyi veya grubu temsil ederler ve Android paylaşım sayfası bunları gösterir. Örneğin, bir mesajlaşma uygulaması, doğrudan bu kişiyle yapılan bir görüşmeye 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/* alma özelliğini destekler. Android'de basit veriler göndermek ve almak için kullanılan bazı yaygın MIME türleri aşağıda verilmiştir.

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 IANA resmi kayıt otoritesine bakın.

Harika paylaşım hedefleri oluşturma

Kullanıcılar, belirli bir etkinlikle ilişkili paylaşım hedefine dokunduklarında paylaşılan içeriği kullanmadan önce onaylayıp düzenleyebilmelidir. Bu durum, özellikle metin verileri için önemlidir.

Etkinlikle veri alma

Bir etkinlikle veri almak için manifestinizi güncellemeniz, gelen içeriği işlemeniz ve kullanıcının uygulamanızı tanımasını sağlamanız gerekir.

Manifest dosyanızı güncelleme

Intent filtreleri, sisteme bir uygulama bileşeninin hangi intent'leri kabul ettiğini bildirir. ACTION_SEND işlemiyle bir amaç oluşturduğunuz Diğer uygulamalara basit veriler gönderme dersindeki yönteme benzer şekilde, bu işlemle amaçları almak için amaç 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ürde bir veya daha fazla resim içeren bir manifest aşağıdaki snippet'e benzer:

<activity android:name=".ui.MyActivity" >
    <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()'a ileterek bu öğelerden herhangi birini paylaşmaya çalıştığında uygulamanız, Android Sharesheet'te veya intent çözümleyicide seçenek olarak listelenir. Kullanıcı uygulamanızı seçerse ilgili etkinlik başlatılır (önceki örnekte .ui.MyActivity). Ardından, kodunuzda ve kullanıcı arayüzünüzde içeriği uygun şekilde işlemek sizin sorumluluğunuzdadır.

Gelen içeriği işleme

Intent tarafından sunulan içeriği işlemek için Intent nesnesini almak üzere getIntent() işlevini çağırın. Nesneyi aldıktan sonra, bir sonraki adımda ne yapmanız gerektiğini belirlemek için içeriğini inceleyebilirsiniz. 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. Başka bir uygulamanın size ne göndereceğini bilemezsiniz. Örneğin, yanlış MIME türü ayarlanmış olabilir veya gönderilen resim çok büyük olabilir. Ayrıca, ikili verileri ana ("UI") iş parçacığı yerine ayrı bir iş parçacığında işlemeyi unutmayın.

@Composable
fun SharesheetHandler() {
    val context = LocalContext.current
    val intent = (context as? Activity)?.intent

    when (intent?.action) {
        ACTION_SEND -> {
            if ("text/plain" == intent.type) {
                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
        }
    }
}

fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update ViewModel state to change state of text being shared
    }
}

fun handleSendImage(intent: Intent) {
    IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image being shared
    }
}

fun handleSendMultipleImages(intent: Intent) {
    IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image(s) being shared
    }
}

Veriler alındıktan sonra kullanıcı arayüzünü güncellemek, TextField doldurmak kadar basit veya bir resme ilginç bir fotoğraf filtresi uygulamak kadar karmaşık olabilir. Bundan sonraki süreç uygulamanıza bağlıdır.

Ekran görüntüsü URL'sini paylaşma

Ekran görüntüsü alırken ekran görüntüsünü ve ilişkili URL'yi paylaşabilirsiniz. Bu, daha zengin bir kullanıcı deneyimi sunar. Bir URL alırken aşağıdaki örnekte gösterildiği gibi niyetten 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 ViewModel state to change state image being shared and the EXTRA_TEXT
    // if available
}

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

Uygulamanız, Android paylaşım sayfasında ve amaç çözümleyicide simgesi ve etiketiyle temsil edilir. Bu özelliklerin her ikisi de manifestte tanımlanır. Daha fazla bağlam sağlamak için etkinlik veya intent filtresi etiketleri ayarlayabilirsiniz.

Android 10'dan (API düzeyi 29) itibaren Android Sharesheet yalnızca application etiketinizdeki manifestte ayarlanan simgeleri kullanır. Android, intent-filter ve activity etiketlerinde ayarlanan simgeleri yok sayar.