Android, kullanıcıların en sevdikleri uygulamaları kullanarak hızlı ve kolay bir şekilde bilgi paylaşmalarını sağlamak için amaçları ve bunlarla ilişkili ekstraları kullanır.
Android, kullanıcıların uygulamalar arasında veri paylaşmalarına olanak tanıyan iki yöntem sunar:
- Android Sharesheet, uygulamanızın dışına ve/veya doğrudan başka bir kullanıcıya içerik göndermek için tasarlanmıştır. Örneğin, arkadaşınızla URL paylaşma.
- Android intent çözümleyici, iyi tanımlanmış bir görevin sonraki aşamasına veri aktarmak için en uygun yöntemdir. Örneğin, uygulamanızdan bir PDF dosyası açıp kullanıcıların tercih ettikleri görüntüleyiciyi seçmesine izin verebilirsiniz.
Bir intent oluştururken intent'in gerçekleştirmesini istediğiniz işlemi belirtirsiniz.
Android, işlem sınırları arasında bile bir etkinlikten diğerine veri göndermek için ACTION_SEND
işlemini kullanır. Verileri ve türünü belirtmeniz gerekir. Sistem, verileri alabilen uyumlu etkinlikleri otomatik olarak tanımlar ve kullanıcıya gösterir. Niyet çözümleyicide, amacı yalnızca bir etkinlik işleyebiliyorsa bu etkinlik hemen başlar.
Android Sharesheet'i neden kullanmalısınız?
Android Sharesheet'i kullanarak tüm uygulamalarda kullanıcılarınız için tutarlılık sağlamanızı kesinlikle öneririz. Uygulamanızın kendi paylaşım hedefleri listesini göstermeyin veya kendi paylaşım sayfası varyasyonlarınızı oluşturmayın.
Android Sharesheet, alakalı uygulama önerileriyle kullanıcıların bilgileri doğru kişiyle tek bir dokunuşla paylaşmalarını sağlar. Sharesheet, özel çözümler için kullanılamayan hedefler önerebilir ve tutarlı bir sıralama kullanır. Bunun nedeni, paylaşım sayfasının yalnızca sistemin erişebildiği uygulama ve kullanıcı etkinliğiyle ilgili bilgileri hesaba katabilmesidir.
Android Sharesheet'te geliştiriciler için birçok kullanışlı özellik de bulunmaktadır. Örneğin, aşağıdakileri yapabilirsiniz:
- Kullanıcılarınızın ne zaman ve nereye paylaşım yaptığını öğrenme
- Özel
ChooserTarget
ve uygulama hedefleri ekleyin - Android 10 (API düzeyi 29) ve sonraki sürümlerde zengin metin içerik önizlemeleri sağlama
- Belirli bileşen adlarıyla eşleşen hedefleri hariç tutma
Android Paylaş Sayfası'nı kullanma
Tüm paylaşım türleri için bir intent oluşturun ve intent'in işlemini Intent.ACTION_SEND
olarak ayarlayın.
Android paylaşım sayfasını görüntülemek için Intent.createChooser()
işlevini çağırın ve Intent
nesnenizi iletin.
Intent'inizin her zaman Android Paylaş Sayfası'nı gösteren bir sürümünü döndürür.
Metin içeriği gönderme
Android Paylaşım Sayfası'nın en basit ve yaygın kullanımı, metin içeriğini bir etkinlikten diğerine göndermektir. Örneğin, çoğu tarayıcı, o anda görüntülenen sayfanın URL'sini başka bir uygulamayla metin olarak paylaşabilir. Bu özellik, bir makaleyi veya web sitesini e-posta ya da sosyal ağ üzerinden arkadaşlarınızla paylaşmak için kullanışlıdır. Bunun nasıl yapılacağına dair bir örnek aşağıda verilmiştir:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent);
İsteğe bağlı olarak, e-posta alıcıları (EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
), e-posta konusu (EXTRA_SUBJECT
) gibi daha fazla bilgi eklemek için ek öğeler ekleyebilirsiniz.
Not: Gmail gibi bazı e-posta uygulamaları, EXTRA_EMAIL
ve EXTRA_CC
gibi ekstralar için String[]
değerini bekler. Bu öğeleri intent'inize eklemek için putExtra(String, String[])
simgesini kullanın.
İkili program içeriği gönder
ACTION_SEND
işlemini kullanarak ikili verileri paylaşın.
Uygun MIME türünü ayarlayın ve aşağıdaki örnekte gösterildiği gibi ek EXTRA_STREAM
alanına verilerin URI'sini yerleştirin.
Bu yöntem genellikle resim paylaşmak için kullanılır ancak herhangi bir tür ikili içerik paylaşmak için de kullanılabilir.
Kotlin
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
Java
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
Alıcı uygulamanın, Uri
işaret ettiği verilere erişmesi için izne ihtiyacı vardır. Bunu yapmak için önerilen iki yöntem vardır:
- Verileri kendi
ContentProvider
cihazınızda depolayarak diğer uygulamaların sağlayıcınıza erişmek için doğru izne sahip olduğundan emin olun. Erişim sağlamak için tercih edilen mekanizma, geçici olan ve yalnızca alıcı uygulamaya erişim izni veren URI başına izinler kullanmaktır. Bu tür birContentProvider
oluşturmanın kolay bir yolu,FileProvider
yardımcı sınıfını kullanmaktır. - Sistem
MediaStore
'ü kullanın.MediaStore
, temel olarak video, ses ve resim MIME türleri içindir. Ancak Android 3.0 (API düzeyi 11) sürümünden itibaren medya dışı türleri de depolayabilir. Daha fazla bilgi içinMediaStore.Files
başlıklı makaleyi inceleyin. Dosyalar,scanFile()
kullanılarakMediaStore
içine yerleştirilebilir. Ardından, paylaşmaya uygun bircontent://
stilindeUri
, sağlananonScanCompleted()
geri çağırma işlevine iletilir. SistemeMediaStore
eklendikten sonra içeriğe cihazdaki tüm uygulamaların erişebileceğini unutmayın.
Doğru MIME türünü kullanma
Göndermekte olduğunuz veriler için mümkün olan en spesifik MIME türünü sağlayın. Örneğin, düz metin paylaşırken text/plain
kullanın. Android'de basit veriler gönderirken kullanılan bazı yaygın MIME türleri şunlardır:
Alıcılar | Gönderenler gönderir |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Desteklenen dosya uzantıları | application/pdf |
MIME türleri hakkında daha fazla bilgi için IANA'nın MIME medya türlerinin resmi siciline bakın.
Android paylaşım sayfası, sağlanan MIME türüne bağlı olarak bir içerik önizlemesi gösterebilir. Bazı önizleme özellikleri yalnızca belirli türlerde kullanılabilir.
Birden fazla içerik paylaşma
Birden çok içerik paylaşmak için ACTION_SEND_MULTIPLE
işlemini, içeriğe işaret eden URI'lerin listesiyle birlikte kullanın. MIME türü, paylaştığınız içeriklerin karışımına göre değişir. Örneğin, üç JPEG resim paylaşırsanız "image/jpg"
türünü kullanırsınız. Resim türlerinin bir karışımı için, her tür resmi işleyen bir etkinlikle eşleştirmek üzere "image/*"
kullanın. Çeşitli türler paylaşmak da mümkün olsa da, alıcı tarafından ne gönderilmek üzere
anlaşılamayacağı için bunu kesinlikle önermiyoruz. Birden fazla tür göndermeniz gerekiyorsa "*/*"
kullanın. Verilerinizin ayrıştırılması ve işlenmesi, alıcı uygulamaya bağlıdır. Aşağıda bununla ilgili bir örnek verilmiştir:
Kotlin
val imageUris: ArrayList<Uri> = arrayListOf( // Add your image URIs here imageUri1, imageUri2 ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } startActivity(Intent.createChooser(shareIntent, null))
Java
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, null));
Sağlanan Uri
nesnelerinin, alıcı uygulamanın erişebileceği verilere işaret ettiğinden emin olun.
Metin önizlemelerine zengin içerik ekleme
Android 10 (API düzeyi 29) sürümünden itibaren Android paylaşım sayfasında, paylaşılan metnin önizlemesi gösterilir. Bazı durumlarda, paylaşılan metnin anlaşılması zor olabilir. https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
gibi karmaşık bir URL paylaşabilirsiniz. Daha zengin bir önizleme, kullanıcılarınıza nelerin paylaşıldığını rahatlatabilir.
Metin önizliyorsanız başlık, küçük resim veya her ikisi için de ayar yapabilirsiniz. Intent.createChooser()
'u aramadan önce Intent.EXTRA_TITLE
için bir açıklama ve ClipData
kullanarak alakalı bir küçük resim ekleyin.
Not: Resim içeriği URI'si, genellikle yapılandırılmış bir <cache-path>
öğesinden, bir FileProvider
kaynağından sağlanır.
Daha fazla bilgi için Dosya paylaşma başlıklı makaleyi inceleyin. Paylaşım sayfasına, küçük resim olarak kullanmak istediğiniz tüm resimleri okuması için gerekli izinleri verdiğinizden emin olun. Daha fazla bilgi için Intent.FLAG_GRANT_READ_URI_PERMISSION
başlıklı makaleyi inceleyin.
Aşağıda bununla ilgili bir örnek verilmiştir:
Kotlin
val share = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
Önizleme aşağıdaki gibi görünür:
Paylaşım sayfasına özel işlemler ekle
Android 14 (API düzeyi 34) ve sonraki sürümlerde uygulamalar, Android Paylaşılabilir Sayfası'na özel işlemler ekleyebilir.
Özel işlemler, Android paylaşım sayfasının üst kısmında küçük işlem simgeleri olarak gösterilir. Uygulamalar, simge tıklandığında çağrılacak işlem olarak herhangi bir Intent
belirtebilir.
Android Sharesheet'e özel işlemler eklemek için önce ChooserAction.Builder
ile bir ChooserAction
oluşturun.
Simge tıklandığında çağrılacak işlem olarak bir PendingIntent
belirtebilirsiniz. Tüm özel işlemlerinizi içeren bir dizi oluşturun ve bunu Intent
paylaşımının EXTRA_CHOOSER_CUSTOM_ACTIONS
olarak belirtin.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Özel hedefler ekleme
Android paylaşım sayfası, ChooserTargetServices
kaynağından yüklenen paylaşım kısayolları ve seçici hedefleri gösterilmeden önce gösterilecek en fazla iki ChooserTarget
nesnesi belirtmenize olanak tanır. Ayrıca, uygulama önerilerinden önce listelenen etkinliklere işaret eden en fazla iki intent de belirtebilirsiniz:
Intent.createChooser()
'i çağırdıktan sonra paylaşım intent'inize Intent.EXTRA_CHOOSER_TARGETS
ve Intent.EXTRA_INITIAL_INTENTS
ekleyin:
Kotlin
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Java
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
Bu özelliği dikkatli kullanın. Eklediğiniz her özel Intent
ve ChooserTarget
sistemin önerdiği sayıyı azaltır. Genel olarak özel hedef eklemenizi önermeyiz. Intent.EXTRA_INITIAL_INTENTS
eklemenin yaygın ve uygun bir örneği, kullanıcıların ortak içerik üzerinde yapabileceği ek işlemler sunmaktır. Örneğin, bir kullanıcı resim paylaşıyorsa bunun yerine bağlantı göndermesine izin vermek için Intent.EXTRA_INITIAL_INTENTS
kullanılır. Intent.EXTRA_CHOOSER_TARGETS
ekleyerek uygulamanızın sağladığı alakalı kişileri veya cihazları göstermek yaygın bir örnektir.
Bileşene göre belirli hedefleri hariç tutma
Intent.EXTRA_EXCLUDE_COMPONENTS
sağlayarak belirli hedefleri hariç tutabilirsiniz.
Bunu yalnızca üzerinde kontrol sahibi olduğunuz hedefleri kaldırmak için yapın. Kullanıcıların uygulamanızın dışında paylaşım yapma niyetinde olması muhtemel olduğundan, kullanıcılarınız uygulamanızdan paylaşım yaptığında uygulamanızın paylaşım hedeflerini gizlemek yaygın bir kullanım alanıdır.
Intent.createChooser()
'u aradıktan sonra intent'inize Intent.EXTRA_EXCLUDE_COMPONENTS
ekleyin:
Kotlin
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
Java
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
Paylaşım hakkında bilgi edinme
Kullanıcılarınızın ne zaman paylaşım yaptığını ve hangi hedefi seçtiğini bilmek yararlı olabilir. Android Sharesheet, kullanıcılarınızın seçtiği hedeflerin ComponentName
bilgisini IntentSender
ile sağlayarak bu bilgilere ulaşmanızı sağlar.
Öncelikle bir BroadcastReceiver
için PendingIntent
oluşturun ve Intent.createChooser()
'da IntentSender
değerini sağlayın:
Kotlin
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender)
Java
Intent share = new Intent(ACTION_SEND); ... PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode, new Intent(myContext, MyBroadcastReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
MyBroadcastReceiver
üzerinden sizi geri arayın ve Intent.EXTRA_CHOSEN_COMPONENT
içinde arama yapın:
Kotlin
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Java
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Paylaşım sayfasına özel işlem ekleme
Android 14 (API düzeyi 34) ve sonraki sürümlerde uygulamalar, Android Paylaşılabilir Sayfası'na özel işlemler ekleyebilir.
ChooserAction
ile ChooserAction.Builder
oluşturun.
Simge tıklandığında çağrılacak işlem olarak bir PendingIntent
belirtebilirsiniz. Tüm özel işlemlerinizi içeren bir dizi oluşturun ve bunu Intent
paylaşımının EXTRA_CHOOSER_CUSTOM_ACTIONS
olarak belirtin.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Android intent çözümleyiciyi kullanma
Android intent çözümleyici, iyi tanımlanmış bir görev akışı kapsamında başka bir uygulamaya veri gönderirken en iyi şekilde kullanılır.
Android intent çözümleyiciyi kullanmak için bir amaç oluşturun ve Android Sharesheet'te olduğu gibi ekstra özellikler ekleyin. Ancak Intent.createChooser()
numarayı aramayın.
ACTION_SEND
ve MIME türüyle eşleşen filtrelere sahip birden fazla yüklü uygulama varsa sistem, kullanıcının paylaşım için bir hedef seçmesine olanak tanıyan amaç çözümleyici adlı bir açıklama iletişim kutusu görüntüler. Tek bir uygulama eşleşirse uygulama çalışır.
Aşağıda, kısa mesaj göndermek için Android intent çözümleyicinin nasıl kullanılacağına dair bir örnek verilmiştir:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
Daha fazla bilgi
Veri gönderme hakkında daha fazla bilgi için Intent'ler ve Intent Filtreleri başlıklı makaleyi inceleyin.