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.

Diğer uygulamaların kullanıcıları Android Sharesheet veya amaç çözümleyici aracılığıyla uygulamanıza sıklıkla veri gönderir. Uygulamanıza veri gönderen uygulamalar, bu 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şılıyor.

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österilir. Örneğin, bir mesajlaşma uygulaması, bir kişi için doğrudan o kişiyle derin bağlantılar kuran bir 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.

Destek MIME türleri

İdeal olarak, bir uygulama mümkün olan en geniş MIME türü aralığını alabiliyor olmalıdır. Ö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 basit veriler göndermek ve almak için kullanılan yaygın MIME türlerinden birkaçını burada bulabilirsiniz.

Alıcılar Gönderenler gönderdiği
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 kayıt otoritesine (IANA) bakın.

Mükemmel paylaşım hedefleri oluşturun

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

Etkinlikle birlikte veri alma

Bir etkinlikle veri alma işlemi, manifest dosyanızı güncellemeyi, gelen içeriği yönetmeyi ve kullanıcının uygulamanızı tanımasını sağlamayı kapsar.

Manifest dosyanızı güncelleme

Intent filtreleri, sisteme bir uygulama bileşeninin hangi amaçları kabul ettiğini bildirir. Diğer uygulamalara basit veriler gönderme dersinde ACTION_SEND işlemiyle bir intent oluşturmanıza 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şliyorsa her türden 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, amaç oluşturup startActivity()'a geçirerek bunlardan herhangi birini paylaşmaya çalıştığında, uygulamanız Android Sharesheet 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, içeriği kodunuzda ve kullanıcı arayüzünde uygun şekilde kullanmak size kalmıştır.

Gelen içeriği işleme

Bir Intent tarafından yayınlanan içeriği işlemek için Intent nesnesini almak üzere getIntent() çağrısı yapın. Nesneyi bulduktan sonra ne yapacağınızı 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 dikkate alın.

Başka bir uygulamanın size neler gönderebileceğini asla bilemezsiniz. Gelen verileri kontrol etmek için çok dikkatli olun. Örneğin, yanlış MIME türü ayarlanmış olabilir 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ün güncellenmesi, bir EditText alanının doldurulması kadar basit veya bir resme ilginç bir fotoğraf filtresi uygulamak gibi daha karmaşık bir işlem olabilir. Uygulamanızdan sonra ne olacağına siz karar verirsiniz.

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

Uygulamanız, Android Sharesheet ve intent çözümleyicide simgesiyle ve etiketiyle temsil edilir. Bunların her ikisi de manifest dosyasında tanımlanmıştır. Daha fazla bağlam sağlamak için etkinlik veya intent filtresi etiketlerini ayarlayabilirsiniz.

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