Android, kullanıcıların uygulamalar arasında veri paylaşması için iki yöntem sunar:
- Android Sharesheet, öncelikli olarak içeriği uygulamanızın dışına veya doğrudan başka bir kullanıcıya göndermek için tasarlanmıştır. Örneğin, bir 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 seçenektir. Örneğin, uygulamanızdan bir PDF açıp kullanıcıların tercih ettikleri görüntüleyiciyi seçmelerine izin verebilirsiniz.
Android Sharesheet'i neden kullanmalısınız?
Kullanıcılarınızın uygulamalar arasında tutarlı bir deneyim yaşamasını sağlamak için Android Sharesheet'i kullanın. Uygulamanızın kendi paylaşım hedefleri listesini göstermeyin veya kendi Sharesheet varyasyonlarınızı oluşturmayın.
Android Sharesheet, kullanıcıların tek bir dokunuşla alakalı uygulama önerileriyle doğru kişiyle bilgi paylaşmasına olanak tanır. Sharesheet, özel çözümler için kullanılamayan hedefler önerebilir ve tutarlı bir sıralama kullanır. Bunun nedeni, Sharesheet'in yalnızca sistem tarafından kullanılabilen uygulama ve kullanıcı etkinliği bilgilerini 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 hedefler ve uygulama hedefleri ekleme
- Android 10'dan (API düzeyi 29) itibaren zengin metin içerik önizlemeleri sağlama
- Belirli bileşen adlarıyla eşleşen hedefleri hariç tutma
Android Sharesheet'i kullanma
Tüm paylaşım türleri için bir intent 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 bu işleve iletin.
Bu yöntem, amacınızın 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ı o 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ğ üzerinden arkadaşlarla paylaşmak için kullanışlıdır. Jetpack Compose'da LocalContext.current kullanarak mevcut bağlamı alın ve context.startActivity() yöntemini çağırın.
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) veya e-posta konusu (EXTRA_SUBJECT) gibi daha fazla bilgi eklemek için ekstralar ekleyebilirsiniz.
Not: Gmail gibi bazı e-posta uygulamaları, EXTRA_EMAIL ve EXTRA_CC gibi ekstralar için String[] bekler. Bunları niyetinize eklemek için
putExtra(String, String[])
kullanın.
İkili içerik gönderme
ACTION_SEND işlemini kullanarak ikili verileri paylaşın.
Aşağıdaki örnekte gösterildiği gibi, uygun MIME türünü ayarlayın ve verilerin URI'sini EXTRA_STREAM ekine yerleştirin.
Bu, genellikle bir resim paylaşmak için kullanılır ancak her tür ikili içeriği 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 tarafından işaret edilen verilere erişmek için izne ihtiyacı var. Bunu yapmanın önerilen iki yolu vardır:
- Verileri kendi
ContentProvideruygulamanı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. Bunun gibi birContentProvideroluşturmak içinFileProvideryardımcı sınıfını kullanın. - Sistem
MediaStorekullanın.MediaStore, öncelikli 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.Filessayfasına bakın. Dosyalar,scanFile()kullanılarakMediaStoreiçine eklenebilir. Ardından, paylaşıma uyguncontent://tarzı birUri, sağlananonScanCompleted()geri çağırma işlevine iletilir. SistemeMediaStoreeklendikten sonra içeriğe cihazdaki tüm uygulamalar tarafından erişilebileceğini unutmayın.
Doğru MIME türünü kullanma
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 kullanın. Android'de veri gönderirken kullanılan yaygın MIME türlerinden bazıları şunlardır:
| Alıcılar, | Gönderenler |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| Desteklenen dosya uzantıları | application/pdf |
MIME türünü sabit kodlamak yerine çalışma zamanında dinamik olarak belirlemek için aşağıdaki yöntemleri kullanın:
content://URI'leri (ör.FileProviderveyaMediaStoretarafından sağlananlar) içinContentResolver.getType()yöntemini çağırın.- Dosya uzantıları için
MimeTypeMap.getSingleton().getMimeTypeFromExtension()yöntemini çağırın. - Depolama Alanı Erişim Altyapısı'nı kullanıyorsanız
DocumentFile.getType()için de sorgu yapabilirsiniz.
Belirli bir MIME türü belirleyemiyorsanız genel ikili veriler için application/octet-stream veya son çare olarak */* kullanın.
MIME türleri hakkında daha fazla bilgi için MIME medya türlerinin resmi kayıt defteri olan IANA'ya bakın.
Android Sharesheet, sağlanan MIME türüne bağlı olarak bir içerik önizlemesi gösterebilir. Bazı özellik önizlemeleri yalnızca belirli türler için kullanılabilir.
Birden fazla içerik paylaşma
Birden fazla içerik paylaşmak için ACTION_SEND_MULTIPLE işlemini, içeriği işaret eden URI'ların 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. Farklı resim türleri için her tür resmi işleyen bir etkinlikle eşleştirmek üzere "image/*" kullanın. Farklı türleri bir arada paylaşmak mümkün olsa da alıcıya ne gönderilmek istendiği net olmayacağından bunu yapmaktan kaçının. Birden fazla tür göndermeniz gerekiyorsa "*/*" kullanın. Verilerinizi ayrıştırmak ve işlemek, 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 verileri 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 metnin anlaşılması zor olabilir. https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4 gibi karmaşık bir URL'yi paylaşmanız gerektiğini düşünün. Daha zengin bir önizleme, kullanıcılarınıza neyin paylaşıldığı konusunda güvence verebilir.
Metin önizlemesi yapıyorsanız başlık, küçük resim veya her ikisini birden ayarlayabilirsiniz. Intent.createChooser() yöntemini çağırmadan önce Intent.EXTRA_TITLE nesnesine bir açıklama ekleyin ve ClipData yöntemini kullanarak alakalı bir küçük resim ekleyin.
Not: Resim içeriği URI'si bir FileProvider tarafından, genellikle yapılandırılmış bir <cache-path> tarafından sağlanır.
Daha fazla bilgi için Dosya paylaşma başlıklı makaleyi inceleyin. Sharesheet'e, küçük resim olarak kullanmak istediğiniz tüm resimleri okuması için doğru izinleri 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 şuna benzer:
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.
Ö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 belirtebilir.
Android Sharesheet'e özel işlemler eklemek için önce ChooserAction.Builder ile bir ChooserAction oluşturun.
Simge tıklandığında çağrılan işlem olarak bir PendingIntent belirtebilirsiniz. Tüm özel işlemlerinizi içeren bir dizi oluşturun ve bunu paylaşım Intent öğesinin EXTRA_CHOOSER_CUSTOM_ACTIONS değeri 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 Sharesheet, Intent.EXTRA_INITIAL_INTENTS kullanarak uygulama önerilerinden önce listelenen en fazla iki özel etkinlik intent'i belirtmenize olanak tanır.
Doğrudan paylaşım hedefleri (ör. görüşmeler veya kişiler) için bunun yerine ShortcutManagerCompat kullanarak dinamik kısayollar yayınlayın (Doğrudan paylaşım hedefleri sağlama bölümüne bakın):
Intent.createChooser() yöntemini çağırdıktan sonra paylaşım Intent'inize Intent.EXTRA_INITIAL_INTENTS ekleyin:
val sendIntent = Intent(ACTION_SEND).apply { type = "text/plain" putExtra(Intent.EXTRA_TEXT, previewText) } val customIntent = Intent().apply { component = ComponentName(context.packageName, "${context.packageName}.CustomActivity") } val shareIntent = Intent.createChooser(sendIntent, null).apply { putExtra( Intent.EXTRA_INITIAL_INTENTS, arrayOf(customIntent) ) } context.startActivity(shareIntent)
Bu özelliği dikkatli kullanın. Eklediğiniz her özel Intent, sistemin önerdiği sayıyı azaltır. Genel olarak özel hedefler eklemekten kaçının. Intent.EXTRA_INITIAL_INTENTS eklemenin yaygın ve uygun bir örneği, kullanıcıların paylaşılan içerik üzerinde gerçekleştirebileceği ek işlemler sunmaktır. Örneğin, bir kullanıcı resim paylaşıyor ve bunun yerine bağlantı göndermesine izin vermek için Intent.EXTRA_INITIAL_INTENTS kullanılıyor.
Bileşene göre belirli hedefleri hariç tutma
Intent.EXTRA_EXCLUDE_COMPONENTS sağlayarak belirli hedefleri hariç tutabilirsiniz.
Bu işlemi yalnızca kontrolünüz altındaki hedefleri kaldırmak için yapın. Yaygın kullanım alanlarından biri, kullanıcılarınız uygulamanızın içinden paylaşım yaptığında uygulamanızın paylaşım hedeflerini gizlemektir. Çünkü kullanıcıların amacı muhtemelen uygulamanızın dışında paylaşım yapmaktır.
Intent.createChooser() yöntemini ç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 Sharesheet, kullanıcılarınızın bir IntentSender kullanarak seçtiği hedeflerin ComponentName değerini sağlayarak bu bilgileri almanıza olanak tanır.
Öncelikle BroadcastReceiver için bir PendingIntent oluşturun ve Intent.createChooser() içinde IntentSender değerini 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") }
Daha fazla bilgi için platform paylaşımı örneğine bakın.
Android intent çözümleyiciyi kullanma
ACTION_SEND intent resolver.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 intent oluşturun ve Android Sharesheet'i çağırırken yaptığınız gibi ekstralar ekleyin. Ancak Intent.createChooser() yöntemini çağırmayı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 yapılacak hedefi seçmesine olanak tanıyan intent resolver adlı bir anlam belirsizliğini giderme iletişim kutusu gösterir. Tek bir uygulama eşleşirse
bu uygulama çalıştırılır.
Metin göndermek için Android intent çözümleyicinin nasıl kullanılacağına dair bir örneği 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 Intent'ler ve Intent Filtreleri başlıklı makaleyi inceleyin.