Android wykorzystuje intencje i powiązane z nimi dodatki, aby umożliwiać użytkownikom szybkie i łatwe udostępnianie informacji w ulubionych aplikacjach.
Android umożliwia użytkownikom udostępnianie danych między aplikacjami na 2 sposoby:
- Arkusz udostępniania na Androida służy przede wszystkim do wysyłania treści poza aplikację lub bezpośrednio do innego użytkownika. Na przykład udostępnianie adresu URL znajomemu.
- Rozwiązanie Android Intent Resolver najlepiej nadaje się do przekazywania danych do następnego etapu dobrze zdefiniowanego zadania. Możesz na przykład otworzyć plik PDF w aplikacji i zezwolić użytkownikom na wybranie preferowanego programu do wyświetlania.
Podczas tworzenia intencji określasz działanie, które ma ona wykonać.
Android używa działania ACTION_SEND
do wysyłania danych z jednej czynności do drugiej, nawet poza granicami procesu. Musisz określić dane i ich typ. System automatycznie identyfikuje zgodne aktywności, które mogą otrzymywać dane, i wyświetla je użytkownikowi. W przypadku rozwiązywania intencji, jeśli tylko jedna aktywność może obsłużyć intencję, ta aktywność jest natychmiast uruchamiana.
Dlaczego warto korzystać z arkusza udostępniania w Androidzie
Zdecydowanie zalecamy korzystanie z panelu udostępniania w Androidzie, aby zapewnić użytkownikom spójność w różnych aplikacjach. Nie wyświetlaj listy docelowych odbiorców udostępniania ani nie twórz własnych opcji udostępniania.
Panel udostępniania w Androidzie umożliwia użytkownikom udostępnianie informacji właściwej osobie z odpowiednimi sugestiami aplikacji – wystarczy jedno kliknięcie. W panelu udostępniania mogą być sugerowane cele niedostępne dla rozwiązań niestandardowych, a także stosowana jest spójna kolejność. Dzieje się tak, ponieważ arkusz udostępniania może uwzględniać informacje o aktywności użytkowników i aplikacji, które są dostępne tylko dla systemu.
Panel udostępniania w Androidzie zawiera też wiele przydatnych funkcji dla deweloperów. Możesz na przykład:
- Dowiedz się, kiedy użytkownicy udostępniają treści i komu
- Dodawanie niestandardowego celu
ChooserTarget
i celów aplikacji - Przedstawianie podglądów treści z tekstem zaawansowanym, począwszy od Androida 10 (poziom interfejsu API 29)
- Wykluczanie elementów docelowych pasujących do określonych nazw komponentów
Korzystanie z arkusza udostępniania w Androidzie
W przypadku wszystkich typów udostępniania utwórz intencję i ustaw jej działanie na Intent.ACTION_SEND
.
Aby wyświetlić panel udostępniania Androida, wywołaj metodę Intent.createChooser()
, przekazując jej obiekt Intent
.
Zwraca wersję intencji, która zawsze wyświetla kartę udostępniania Androida.
Wysyłanie tekstu
Najprostszym i najpowszechniejszym zastosowaniem arkusza udostępniania Androida jest przesyłanie treści tekstowych z jednej aktywności do drugiej. Na przykład większość przeglądarek może udostępniać adres URL aktualnie wyświetlanej strony jako tekst innej aplikacji. Jest to przydatne, gdy chcesz udostępnić artykuł lub stronę internetową znajomym za pomocą poczty e-mail lub mediów społecznościowych. Oto przykład:
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);
Opcjonalnie możesz dodać dodatkowe informacje, takie jak odbiorcy e-maila (EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
), temat e-maila (EXTRA_SUBJECT
) itp.
Uwaga: niektóre aplikacje poczty e-mail, takie jak Gmail, wymagają String[]
dla funkcji dodatkowych, takich jak EXTRA_EMAIL
i EXTRA_CC
. Użyj putExtra(String, String[])
, aby dodać te elementy do intencji.
Wysyłanie danych binarnych
Udostępnianie danych binarnych za pomocą działania ACTION_SEND
.
Ustaw odpowiedni typ MIME i umieść identyfikator URI danych w elemencie dodatkowym EXTRA_STREAM
, jak pokazano w tym przykładzie.
Jest ona często używana do udostępniania obrazu, ale można jej używać do udostępniania dowolnego typu treści binarnych.
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));
Aplikacja odbiorcza musi mieć uprawnienia dostępu do danych wskazywanych przez Uri
. Możesz to zrobić na 2 sposoby:
- Przechowuj dane w swoim własnym
ContentProvider
, upewniając się, że inne aplikacje mają odpowiednie uprawnienia dostępu do Twojego dostawcy. Preferowanym mechanizmem przyznawania dostępu jest używanie uprawnień na podstawie identyfikatora URI, które są tymczasowe i dają dostęp tylko do aplikacji odbierającej. Łatwym sposobem na utworzenie takiej funkcjiContentProvider
jest użycie klasy pomocniczejFileProvider
. - Użyj systemu
MediaStore
.MediaStore
jest przeznaczony głównie do typów MIME filmów, dźwięku i obrazów. Jednak już od Androida 3.0 (poziom interfejsu API 11) można w nim zapisywać typy inne niż multimedia. Więcej informacji znajdziesz w artykuleMediaStore.Files
. Pliki można wstawiać doMediaStore
za pomocą funkcjiscanFile()
. Następnie do podanego wywołania zwrotnegoonScanCompleted()
przekazywany jest obiektUri
w stylucontent://
, który nadaje się do udostępniania. Pamiętaj, że po dodaniu do systemuMediaStore
treść jest dostępna dla każdej aplikacji na urządzeniu.
Używanie odpowiedniego typu MIME
Podaj najdokładniejszy typ MIME dostępny dla wysyłanych danych. Na przykład podczas udostępniania zwykłego tekstu użyj text/plain
. Oto kilka typów MIME, które są często używane do wysyłania prostych danych w Androidzie:
Odbiorcy rejestrują się w ramach | Nadawcy wysyłają |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Obsługiwane rozszerzenia plików | application/pdf |
Więcej informacji o typach MIME znajdziesz w IANA oficjalnym rejestrze typów multimediów MIME.
W zależności od wybranego typu MIME w arkuszu udostępniania Androida może pojawić się podgląd treści. Niektóre funkcje podglądu są dostępne tylko w przypadku określonych typów.
Udostępnianie wielu treści
Aby udostępnić wiele fragmentów treści, użyj działania ACTION_SEND_MULTIPLE
wraz z listą identyfikatorów URI wskazujących te treści. Typ MIME zależy od kombinacji
udostępnianych treści. Jeśli na przykład udostępniasz 3 obrazy JPEG, użyj typu "image/jpg"
. W przypadku mieszaniny typów obrazów użyj "image/*"
, aby dopasować aktywność do dowolnego typu obrazu. Udostępnianie różnych typów plików jest możliwe, ale zdecydowanie odradzamy to robić, ponieważ odbiorca nie wie, co ma być wysyłane. Jeśli musisz wysyłać wiele typów, użyj "*/*"
. Odczytywanie i przetwarzanie danych zależy od aplikacji odbierającej. Oto przykład:
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));
Upewnij się, że podane obiekty Uri
wskazują dane, do których aplikacja odbierająca ma dostęp.
Dodawanie bogatych treści do podglądów tekstu
Począwszy od Androida 10 (poziom interfejsu API 29) panel udostępniania Androida wyświetla podgląd udostępnianego tekstu. W niektórych przypadkach udostępniany tekst może być trudny do zrozumienia. Zastanów się nad udostępnieniem skomplikowanego adresu URL, takiego jak https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. Bogatszy podgląd pozwoli użytkownikom zorientować się, co są udostępniane.
Jeśli wyświetlasz podgląd tekstu, możesz ustawić tytuł lub miniaturę lub oba te elementy. Dodaj opis do Intent.EXTRA_TITLE
przed wywołaniem Intent.createChooser()
i dodaj odpowiednią miniaturę za pomocą ClipData
.
Uwaga: identyfikator URI treści obrazu jest dostarczany z poziomu FileProvider
, zwykle z konfigurowanego <cache-path>
.
Więcej informacji znajdziesz w artykule Udostępnianie plików. Pamiętaj, aby przyznać Sharesheet odpowiednie uprawnienia do odczytu obrazu, który chcesz użyć jako miniatury. Więcej informacji znajdziesz w artykule Intent.FLAG_GRANT_READ_URI_PERMISSION
.
Oto przykład:
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));
Podgląd wygląda mniej więcej tak:
Dodawanie działań niestandardowych do panelu udostępniania
W Androidzie 14 (poziom interfejsu API 34) i nowszych aplikacje mogą dodawać niestandardowe działania do panelu udostępniania.
Działania niestandardowe są wyświetlane jako małe ikony działań u góry karty udostępniania w Androidzie, a aplikacje mogą określać dowolne Intent
jako działanie wywoływane po kliknięciu ikony.
Aby dodać działania niestandardowe w arkuszu udostępniania Androida, najpierw utwórz ChooserAction
z użyciem ChooserAction.Builder
.
Możesz określić PendingIntent
jako działanie wywoływane po kliknięciu ikony. Utwórz tablicę zawierającą wszystkie Twoje działania niestandardowe i określ ją jako EXTRA_CHOOSER_CUSTOM_ACTIONS
udziału Intent
.
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);
Dodawanie celów niestandardowych
Na karcie udostępniania w Androidzie możesz określić maksymalnie 2 obiekty ChooserTarget
, które będą wyświetlane przed skrótami udostępniania i celami selektora wczytanymi z ChooserTargetServices
. Możesz też określić maksymalnie 2 zamiary wskazujące na działania, które są wyświetlane przed sugestiami aplikacji:
Dodaj Intent.EXTRA_CHOOSER_TARGETS
i Intent.EXTRA_INITIAL_INTENTS
do swojej intencji udostępniania po wywołaniu funkcji Intent.createChooser()
:
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);
Korzystaj z tej funkcji z rozwagą. Każda niestandardowa wartość Intent
i ChooserTarget
, którą dodasz, zmniejsza liczbę sugerowaną przez system. Ogólnie odradzamy dodawanie niestandardowych celów. Typowym przykładem odpowiedniego dodania Intent.EXTRA_INITIAL_INTENTS
jest umożliwienie użytkownikom dodatkowych działań dotyczących udostępnionego treści. Użytkownik udostępnia obrazy i używa Intent.EXTRA_INITIAL_INTENTS
, aby wysłać link. Typowym odpowiednim przykładem dodania Intent.EXTRA_CHOOSER_TARGETS
jest wyświetlanie odpowiednich osób lub urządzeń, które obsługuje Twoja aplikacja.
Wyklucz konkretne cele według komponentu
Możesz wykluczyć określone cele, podając Intent.EXTRA_EXCLUDE_COMPONENTS
.
Wykonuj tę czynność tylko wtedy, gdy chcesz usunąć cele, nad którymi masz kontrolę. Typowym przypadkiem użycia jest ukrywanie docelowych treści do udostępniania w aplikacji, gdy użytkownicy udostępniają treści z poziomu aplikacji, ponieważ prawdopodobnie chcą udostępnić je poza aplikacją.
Dodaj Intent.EXTRA_EXCLUDE_COMPONENTS
do intencji po wywołaniu Intent.createChooser()
:
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);
Informacje o udostępnianiu
Warto wiedzieć, kiedy użytkownicy udostępniają treści i jakie wybierają grupy docelowe. W panelu udostępniania Androida możesz uzyskać te informacje, podając ComponentName
celów, które użytkownicy wybierają za pomocą IntentSender
.
Najpierw utwórz PendingIntent
dla BroadcastReceiver
i podaj jego IntentSender
w Intent.createChooser()
:
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());
Odbierz wywołanie zwrotne w MyBroadcastReceiver
i sprawdź Intent.EXTRA_CHOSEN_COMPONENT
:
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); }
Dodawanie działań niestandardowych do panelu udostępniania
W Androidzie 14 (poziom interfejsu API 34) i nowszych aplikacje mogą dodawać niestandardowe działania do panelu udostępniania.
Utwórz ChooserAction
z: ChooserAction.Builder
.
Jako działanie wywoływane po kliknięciu ikony możesz określić PendingIntent
. Utwórz tablicę zawierającą wszystkie działania niestandardowe i wskaż ją jako EXTRA_CHOOSER_CUSTOM_ACTIONS
of the share Intent
.
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);
Używanie rozwiązywania intencji na Androidzie
Rozwiązanie Android Intent Resolver najlepiej sprawdza się podczas wysyłania danych do innej aplikacji w ramach dobrze zdefiniowanego przepływu zadań.
Aby użyć rozwiązywania intencji na Androidzie, utwórz intencję i dodaj dodatkowe elementy tak, jak w przypadku wywołania panelu udostępniania na Androidzie. Nie dzwonij jednak pod
Intent.createChooser()
.
Jeśli masz kilka zainstalowanych aplikacji z filtrami, które pasują do filtra ACTION_SEND
i typu MIME, system wyświetla okno ujednoznacznienia nazywane mechanizmem rozpoznawania intencji, który umożliwia użytkownikowi wybranie elementu docelowego, któremu ma zostać udostępniona treść. Jeśli pasuje do niej tylko jedna aplikacja, zostanie uruchomiona.
Oto przykład użycia rozwiązywania intencji w Androidzie do wysyłania tekstu:
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);
Więcej informacji
Więcej informacji o wysyłaniu danych znajdziesz w artykule Intencje i filtry intencji.