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 birActivity
- 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/* |
|
`image/*` |
|
video/* |
|
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.