Diğer uygulamalardan basit veriler alma

Bir uygulama, başka 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 ilgi çekici bir web URL'si gibi metin içeriği almak isteyebilir.

Diğer uygulamaların kullanıcıları, uygulamanıza sıklıkla Android Sharesheet veya intent çözümleyici aracılığıyla veri gönderir. Uygulamanıza veri gönderen uygulamalar, söz konusu veriler için bir MIME türü ayarlamalıdır. Uygulamanız, başka bir uygulama tarafından gönderilen verileri aşağıdaki şekillerde alabilir:

  • Manifest'te eşleşen intent-filter etiketine sahip bir Activity
  • Uygulamanız tarafından yayınlanan Kısayolları paylaşma

Doğrudan Paylaşım hedefleri, uygulamanızdaki belirli bir Etkinliğin derin bağlantılarıdır. Genellikle bir kişiyi veya grubu temsil ederler ve Android Sharesheet'te bunları gösterirler. Örneğin, bir mesajlaşma uygulaması, bir kişiyle doğrudan görüşmenize derin bağlantı sağlayan 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 bölümüne bakın.

MIME türlerini destekleme

İdeal olarak, bir uygulamanın mümkün olan en geniş MIME türünü alabilmesi gerekir. Örneğin metin, resim ve video göndermek için tasarlanmış bir mesajlaşma uygulamasının text/*, image/* ve video/* almayı desteklemesi idealdir. Android'de basit veri gönderip almak için kullanılan birkaç yaygın MIME türünü aşağıda bulabilirsiniz.

Alıcılar Gönderenler, ileti
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 otoritesine bakın.

Etkili paylaşım hedefleri oluşturma

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

Etkinlikle veri alma

Bir etkinlikle ilgili verileri almak için manifest dosyanızı güncellemek, gelen içeriği yönetmek ve kullanıcının uygulamanızı tanıdığından emin olmak gerekir.

Manifest dosyanızı güncelleme

Amaç filtreleri, uygulama bileşeninin hangi amaçları kabul ettiğini sisteme bildirir. Diğer uygulamalara basit veriler gönderme dersinde ACTION_SEND işlemiyle amaç oluşturmaya benzer şekilde, bu işlemle niyet almak için intent filtreleri oluşturursunuz. Manifest'inizde <intent-filter> öğesini kullanarak bir intent filtresi tanımlarsınız. Örneğin, uygulamanız metin içeriği alma işlemini gerçekleştiriyorsa herhangi bir türden bir veya daha fazla resim içeren bir manifest şu 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 amaç oluşturup bunu startActivity()'e ileterek bunlardan 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 başlatılır (önceki örnekte .ui.MyActivity). İçeriği kodunuz ve kullanıcı arayüzünüzde uygun şekilde yönetmek size kalmıştır.

Gelen içeriği işleme

Intent tarafından yayınlanan içeriği işlemek için getIntent() yöntemini çağırarak Intent nesnesini alın. Nesneyi aldığınızda, bir sonraki adımda ne yapacağınızı belirlemek için içeriğini inceleyebilirsiniz. Bu etkinlik, sistemin diğer bölümlerinden (başlatıcı gibi) başlatılabiliyorsa, amacı incelerken bunu dikkate alın.

Gelen verileri kontrol etmeye özen gösterin. Başka bir uygulamanın size ne gönderebileceğini asla bilemezsiniz. Örneğin, yanlış MIME türü ayarlanmış veya gönderilen görüntü ç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.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    when {
        intent?.action == Intent.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 == Intent.ACTION_SEND_MULTIPLE
                && 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 to reflect text being shared
    }
}

private fun handleSendImage(intent: Intent) {
    (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
        // Update UI to reflect image being shared
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let {
        // Update UI to reflect multiple images being shared
    }
}

Java

void onCreate (Bundle savedInstanceState) {
    ...
    // Get intent, action and MIME type
    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/plain".equals(type)) {
            handleSendText(intent); // Handle text being sent
        } else if (type.startsWith("image/")) {
            handleSendImage(intent); // Handle single image being sent
        }
    } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
        if (type.startsWith("image/")) {
            handleSendMultipleImages(intent); // Handle multiple images being sent
        }
    } else {
        // Handle other intents, such as being started from the home screen
    }
    ...
}

void handleSendText(Intent intent) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    if (sharedText != null) {
        // Update UI to reflect text being shared
    }
}

void handleSendImage(Intent intent) {
    Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
    if (imageUri != null) {
        // Update UI to reflect image being shared
    }
}

void handleSendMultipleImages(Intent intent) {
    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    if (imageUris != null) {
        // Update UI to reflect multiple images being shared
    }
}

Verileri aldıktan sonra kullanıcı arayüzünü güncellemek için EditText alanını doldurmak yeterlidir. Daha karmaşık bir işlem ise bir görüntüye ilgi çekici bir fotoğraf filtresi uygulamaktır. Daha sonra ne olacağı uygulamanıza bağlıdır.

Kullanıcıların uygulamanızı tanıdığından emin olun

Uygulamanız, Android Sharesheet'te ve intent çözümleyicide simgesi ve etiketi ile temsil edilir. Her ikisi de manifest'te tanımlanır. Daha fazla bağlam sağlamak için etkinlik veya amaç filtresi etiketleri ayarlayabilirsiniz.

Android 10 (API düzeyi 29) sürümünden itibaren Android Sharesheet yalnızca application etiketinizdeki manifest'te ayarlanan simgeleri kullanmaktadır. Android, intent-filter ve activity etiketlerinde ayarlanan simgeleri yoksayar.