Android, kullanıcıların en sevdikleri uygulamaları kullanarak bilgileri hızlı ve kolay bir şekilde paylaşmasına olanak tanımak için amaçları ve bunlarla ilişkili ekstraları kullanır.
Android, kullanıcıların uygulamalar arasında veri paylaşması için iki yöntem sunar:
- Android paylaşım sayfası, öncelikle 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, bir URL'yi arkadaşınızla paylaşma.
- Android intent çözümleyici, verileri iyi tanımlanmış bir görevin sonraki aşamasına aktarmak için en uygun yöntemdir. Örneğin, uygulamanızdan bir PDF açabilir ve kullanıcıların tercih ettikleri görüntüleyiciyi seçmelerine izin verebilirsiniz.
Bir amaç oluşturduğunuzda, amacın 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ürlerini belirtmeniz gerekir. Sistem, verileri alabilecek uyumlu etkinlikleri otomatik olarak tanımlar ve kullanıcıya gösterir. Amaç çözümleyici söz konusu olduğunda, amacı yalnızca bir etkinlik işleyebiliyorsa bu etkinlik hemen başlatılır.
Android Sharesheet'i neden kullanmalısınız?
Kullanıcılarınızın uygulamalar arasında tutarlılık sağlaması için Android Sharesheet'i kullanmanı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, kullanıcıların tek bir dokunuşla doğru kişiyle bilgi paylaşmasına ve önerilen uygulamalar almasına olanak tanır. Paylaşım sayfası, özel çözümlerde kullanılamayan hedefler önerebilir ve tutarlı bir sıralama kullanır. Bunun nedeni, paylaşım sayfasının yalnızca sistem tarafından kullanılabilen uygulama ve kullanıcı etkinliği hakkındaki bilgileri dikkate alabilmesidir.
Android Sharesheet'te geliştiriciler için birçok kullanışlı özellik de bulunur. Örneğin, şunları yapabilirsiniz:
- Kullanıcılarınızın ne zaman ve nereye paylaşım yaptığını öğrenme
- Özel
ChooserTargetve uygulama hedefleri ekleme - Android 10'dan (API düzeyi 29) itibaren zengin metin içeriği önizlemeleri sunma
- Belirli bileşen adlarıyla eşleşen hedefleri hariç tutma
Android Sharesheet'i kullanma
Tüm paylaşım türleri için bir amaç oluşturun ve işlemini Intent.ACTION_SEND olarak ayarlayın.
Android Sharesheet'i görüntülemek için Intent.createChooser() işlevini çağırın ve Intent nesnenizi iletin.
Bu işlev, intentinizin her zaman Android Sharesheet'i gösteren bir sürümünü döndürür.
Metin içeriği gönderme
Android Sharesheet'in en basit ve yaygın kullanımı, bir etkinlikten diğerine metin içeriği göndermektir. Örneğin, çoğu tarayıcı, şu anda görüntülenen sayfanın URL'sini başka bir uygulamayla metin olarak paylaşabilir. Bu, bir makaleyi veya web sitesini e-posta ya da sosyal ağlar üzerinden arkadaşlarınızla paylaşmak için kullanışlıdır. Bunu nasıl yapacağınıza dair bir örnek:
fun shareText(context: Context) { val sendIntent: Intent = Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) context.startActivity(shareIntent) }
İsteğe bağlı olarak, e-posta alıcıları (EXTRA_EMAIL,
EXTRA_CC,
EXTRA_BCC), e-posta konusu (EXTRA_SUBJECT) vb. gibi daha fazla bilgi eklemek için ekstralar da ekleyebilirsiniz.
Not: Gmail gibi bazı e-posta uygulamaları, EXTRA_EMAIL ve EXTRA_CC gibi ek özellikler için String[] karakterini kullanır. Bunları amacınıza eklemek için putExtra(String, String[]) simgesini kullanın.
İkili içerik gönderme
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 bölümüne verilerin URI'sini yerleştirin.
Bu özellik genellikle resim paylaşmak için kullanılır ancak herhangi bir ikili içerik türünü paylaşmak için de kullanılabilir.
fun shareBinaryContent(context: Context) { val shareIntent: Intent = Intent().apply { action = ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... val imageUri: Uri = Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1") putExtra(Intent.EXTRA_STREAM, imageUri) type = "image/jpeg" } context.startActivity(Intent.createChooser(shareIntent, null)) }
Alıcı uygulamanın, Uri işaretçisinin gösterdiği verilere erişmek için izne ihtiyacı vardır. Bunu yapmanın iki önerilen yolu vardır:
- Verileri kendi
ContentProvideralanınızda depolayın ve 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 izinleri kullanmaktır. Bu tür birContentProvideroluşturmanın kolay bir yolu,FileProvideryardımcı sınıfını kullanmaktır. - Sistemi
MediaStore.MediaStoreözellikle video, ses ve resim MIME türleri için kullanılır. Ancak Android 3.0 (API düzeyi 11) sürümünden itibaren medya dışı türleri de depolayabilir. Daha fazla bilgi içinMediaStore.Filessayfasına bakın. Dosyalar,MediaStoreiçinescanFile()kullanılarak eklenebilir. Ardından, paylaşmaya uygun bircontent://tarzıUri, sağlananonScanCompleted()geri çağırma işlevine iletilir. SistemeMediaStoreeklendikten sonra, içeriğe cihazdaki tüm uygulamalar erişebilir.
Doğru MIME türünü kullanın
Gönderdiğiniz veriler için mevcut olan en spesifik MIME türünü sağlayın. Örneğin, düz metin paylaşırken text/plain simgesini kullanın. Android'de basit veriler gönderirken kullanılan bazı yaygın MIME türleri şunlardır:
| Alıcılar | Gönderenler gönderiyor |
|---|---|
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 kaydına bakın.
Android Sharesheet, sağlanan MIME türüne bağlı olarak içerik önizlemesi gösterebilir. Bazı önizleme özellikleri yalnızca belirli türlerde kullanılabilir.
Birden fazla içerik paylaşma
Birden fazla içerik paylaşmak için ACTION_SEND_MULTIPLE işlemini, içeriğe yönlendiren 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 resmi paylaşıyorsanız "image/jpg" türünü kullanırsınız. Resim türlerinin karışımı için "image/*" kullanarak herhangi bir resim türünü işleyen bir etkinliği eşleyin. Farklı türlerdeki dosyaları paylaşmak mümkün olsa da alıcının ne gönderilmek istendiğini anlaması zor olacağından bu durum kesinlikle önerilmez. Birden fazla tür göndermeniz gerekiyorsa "*/*" kullanın. Verilerinizin ayrıştırılması ve işlenmesi, alıcı uygulamanın sorumluluğundadır. Örneğin:
fun shareMultiple(context: Context) { val imageUris: ArrayList<Uri> = arrayListOf( Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1"), Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/2") ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } context.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'dan (API düzeyi 29) itibaren Android Sharesheet, paylaşılan metnin önizlemesini gösterir. Bazı durumlarda, paylaşılan metinlerin anlaşılması zor olabilir. https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4 gibi karmaşık bir URL'yi paylaşmayı deneyin. Daha zengin bir önizleme, kullanıcılarınıza neyin paylaşıldığı konusunda güvence verebilir.
Metni önizliyorsanız başlık, küçük resim veya her ikisini de ayarlayabilirsiniz. Intent.createChooser() işlevini çağırmadan önce Intent.EXTRA_TITLE öğesine açıklama ekleyin ve ClipData kullanarak alakalı bir küçük resim ekleyin.
Not: Resim içeriği URI'si bir FileProvider kaynağından (genellikle yapılandırılmış bir <cache-path>) sağlanır.
Daha fazla bilgi için Dosya paylaşımı başlıklı makaleyi inceleyin. Sharesheet'e, küçük resim olarak kullanmak istediğiniz tüm resimleri okuma izni verdiğinizden emin olun. Daha fazla bilgi için Intent.FLAG_GRANT_READ_URI_PERMISSION sayfasına bakın.
Örneğin:
fun richContentToTextPreviewShares(context: Context) { val share = Intent.createChooser( Intent().apply { action = 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 = Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/A123456789") flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null ) context.startActivity(share) }
Önizleme aşağıdaki gibi görünür:
Paylaşım sayfasına özel işlemler ekleme
Android Sharesheet'teki özel işlemlerin ekran görüntüsü.
Android 14 (API düzeyi 34) ve sonraki sürümlerde uygulamalar, Android Sharesheet'e özel işlemler ekleyebilir.
Özel işlemler, Android Sharesheet'in üst kısmında küçük işlem simgeleri olarak gösterilir ve uygulamalar, simge tıklandığında çağrılan işlem olarak herhangi bir Intent değerini belirtebilir.
Android Sharesheet'e özel işlemler eklemek için önce ChooserAction ile ChooserAction.Builder oluşturun.
Simge tıklandığında çağrılan işlem olarak PendingIntent belirtebilirsiniz. Tüm özel işlemlerinizi içeren bir dizi oluşturun ve bunu paylaşımın EXTRA_CHOOSER_CUSTOM_ACTIONS
Intent olarak belirtin.
fun sharesheetCustomActions(context: Context, previewText: String) { val sendIntent = Intent(ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, previewText) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_logo), "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) }
Özel hedefler ekleme
Android paylaşım sayfası, ChooserTargetServices kaynağından yüklenen paylaşım kısayolları ve seçici hedeflerinden önce gösterilen en fazla iki ChooserTarget nesne belirtmenize olanak tanır. Ayrıca, önerilen uygulamalardan önce listelenen etkinliklere işaret eden en fazla iki amaç da belirtebilirsiniz:
Intent.EXTRA_CHOOSER_TARGETS ve Intent.EXTRA_INITIAL_INTENTS öğelerini, Intent.createChooser() çağrısı yapıldıktan sonra paylaşım amaçlı intent'inize ekleyin:
val share = Intent.createChooser(shareIntent, null).apply { putExtra( Intent.EXTRA_CHOOSER_TARGETS, arrayOf(chooserTargetJessica, chooserTargetSpyros) ) putExtra( Intent.EXTRA_INITIAL_INTENTS, arrayOf(intentTargetNearbyShare, intentTargetMaps) ) }
Bu özelliği dikkatli kullanın. Eklediğiniz her özel Intent
ve ChooserTarget, sistemin önerdiği sayıyı azaltır. Genel olarak özel hedefler eklemenizi önermiyoruz. Intent.EXTRA_INITIAL_INTENTS eklemenin uygun bir örneği, kullanıcıların paylaşılan içeriklerde gerçekleştirebileceği ek işlemleri sağlamaktır. Örneğin, bir kullanıcı resim paylaşıyor ve Intent.EXTRA_INITIAL_INTENTS simgesi, kullanıcının bunun yerine bağlantı göndermesine olanak tanımak için kullanılıyor. Intent.EXTRA_CHOOSER_TARGETS eklemeyle ilgili uygun bir örnek, uygulamanızın sunduğu alakalı kişileri veya cihazları göstermektir.
Belirli hedefleri bileşene göre hariç tutma
Intent.EXTRA_EXCLUDE_COMPONENTS sağlayarak belirli hedefleri hariç tutabilirsiniz.
Bu işlemi yalnızca kontrolünüzdeki hedefleri kaldırmak için yapın. 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. Bunun nedeni, kullanıcıların uygulamanızın dışında paylaşım yapma olasılığının yüksek olmasıdır.
Intent.createChooser() işlevini çağırdıktan sonra niyetinize Intent.EXTRA_EXCLUDE_COMPONENTS ekleyin:
fun excludeSpecificTargets(context: Context) { val share = Intent.createChooser(Intent(ACTION_SEND), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) } context.startActivity(share) }
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 faydalı olabilir. Android paylaşım sayfası, kullanıcılarınızın IntentSender kullanarak seçtiği hedeflerin ComponentName bilgisini almanıza olanak tanır.
Öncelikle bir PendingIntent için BroadcastReceiver oluşturun ve IntentSender değerini Intent.createChooser() içinde sağlayın:
fun infoAboutSharing(context: Context, requestCode: Int) { var share = Intent(ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( context, requestCode, Intent(context, ShareBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender) context.startActivity(share) }
Geri aramayı MyBroadcastReceiver içinde alın ve Intent.EXTRA_CHOOSER_RESULT bölümüne bakın:
override fun onReceive(context: Context?, intent: Intent) { val TAG = ShareBroadcastReceiver::class.simpleName val chooserResult: ChooserResult? = IntentCompat.getParcelableExtra( intent, Intent.EXTRA_CHOOSER_RESULT, ChooserResult::class.java, ) chooserResult?.let { Log.i(TAG, "Share callback: isShortcut: ${it.isShortcut}, type: ${typeToString(it.type)}, componentName: ${it.selectedComponent}", ) } ?: Log.i(TAG, "chooserResult is null") }
Paylaşım sayfasına özel işlemler ekleme
Android 14 (API düzeyi 34) ve sonraki sürümlerde uygulamalar, Android Sharesheet'e özel işlemler ekleyebilir.
ChooserAction
ile
ChooserAction.Builder oluşturun.
Simge tıklandığında çağrılan işlem olarak PendingIntent belirtebilirsiniz. Tüm özel işlemlerinizi içeren bir dizi oluşturun ve bunu paylaşımın EXTRA_CHOOSER_CUSTOM_ACTIONS
Intent olarak belirtin.
fun customActions(context: Context, text: String) { val sendIntent = 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_logo), "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) }
Android intent çözümleyiciyi kullanma
ACTION_SEND intent çözümleyicisinin ekran görüntüsü.
Android amaç çözümleyici, iyi tanımlanmış bir görev akışının parçası olarak başka bir uygulamaya veri gönderirken en iyi şekilde kullanılır.
Android intent çözümleyiciyi kullanmak için bir intent oluşturun ve Android Sharesheet'i çağırmak için yaptığınız gibi ekstralar ekleyin. Ancak Intent.createChooser() numaralı telefonu aramayın.
ACTION_SEND
ve MIME türüyle eşleşen filtreler içeren birden fazla uygulama yüklüyse sistem, kullanıcının paylaşım hedefi seçmesine olanak tanıyan amaç çözümleyici adlı bir belirsizlik giderme iletişim kutusu gösterir. Tek bir uygulama eşleşirse uygulama çalıştırılır.
Android intent çözümleyiciyi kullanarak metin gönderme örneğini aşağıda bulabilirsiniz:
fun intentResolver(context: Context) { val sendIntent: Intent = Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } context.startActivity(sendIntent) }
Daha fazla bilgi
Veri gönderme hakkında daha fazla bilgi için Intents and Intent Filters (Amaçlar ve Amaç Filtreleri) başlıklı makaleyi inceleyin.