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şimde bulunduğ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ık sık veri gönderiyor. Uygulamanıza veri gönderen uygulamalar, bu veriler için bir MIME türü ayarlamalıdır. Uygulamanız, başka bir uygulamanın gönderdiği verileri aşağıdaki şekillerde alabilir:
- Manifest dosyasında eşleşen bir
intent-filter
etiketi olanActivity
- Uygulamanız tarafından yayınlanan paylaşım kısayolları.
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/*
almayı 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önderiyor |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
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 bir paylaşım hedefine dokunduklarında paylaşılan içeriği kullanmadan önce onaylayıp düzenleyebilmelidir. Bu durum özellikle metin verileri için önemlidir.
Bir 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 amaç oluşturup startActivity()
'a ileterek bu öğelerden herhangi birini paylaşmaya çalıştığında uygulamanız, Android paylaşım sayfasında veya amaç çö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
Bir 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.
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 } }
Veriler alındıktan sonra kullanıcı arayüzünü güncellemek, EditText
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.
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 manifest dosyasında tanımlanır. Daha fazla bağlam sağlamak için etkinlik veya amaç filtresi etiketleri ayarlayabilirsiniz.
Android 10'dan (API düzeyi 29) itibaren Android paylaşım sayfası yalnızca application
etiketinizdeki manifestte ayarlanan simgeleri kullanır. Android, intent-filter
ve activity
etiketlerinde ayarlanan simgeleri yok sayar.