Android używa intencji i powiązanych z nimi dodatków, aby umożliwić użytkownikom szybkie i łatwe udostępnianie informacji za pomocą ulubionych aplikacji.
Android umożliwia użytkownikom udostępnianie danych między aplikacjami na 2 sposoby:
- Panel udostępniania w Androidzie jest przeznaczony przede wszystkim do wysyłania treści poza aplikację lub bezpośrednio do innego użytkownika. na przykład przez udostępnienie adresu URL znajomemu.
- Rozpoznawanie intencji Androida najlepiej nadaje się do przekazywania danych do kolejny etap 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ć
i ich rodzaj. 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ść uruchamia się natychmiast.
Dlaczego warto korzystać z arkusza udostępniania w Androidzie

Zdecydowanie zalecamy korzystanie z arkusza udostępniania Androida, aby zapewnić użytkownikom spójność aplikacji. Nie wyświetlaj własnej listy docelowych odbiorców aplikacji ani nie twórz własnej Odmiany arkusza 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. Arkusz udostępniania może sugerować cele niedostępne dla rozwiązań niestandardowych i stosuje spójny ranking. Dzieje się tak, ponieważ panel udostępniania może uwzględniać informacje o aktywności użytkownika 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: wykonaj te czynności:
- Dowiedz się, kiedy i gdzie użytkownicy udostępnią coś
- Dodawanie niestandardowych
ChooserTarget
i celów aplikacji - Wyświetlanie podglądu sformatowanego tekstu już w Androidzie 10 (poziom 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ć arkusz udostępniania Androida, wywołaj
Intent.createChooser()
,
i przekazuje jej obiekt Intent
.
Zwraca wersję intencji, w której zawsze wyświetla się arkusz udostępniania Androida.
Wyślij treść tekstową
Najprostszym i najczęstszym sposobem korzystania z panelu udostępniania na Androidzie jest wysyłanie treści tekstowych z jednego działania do drugiego. 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:
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)
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ć dodatki zawierające więcej informacji, na przykład odbiorców e-maili.
(EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
),
temat e-maila
(EXTRA_SUBJECT
) itp.
Uwaga: niektóre aplikacje do obsługi poczty e-mail, takie jak Gmail, wymagają
String[]
za dodatki takie jak
EXTRA_EMAIL
i EXTRA_CC
. Użyj
putExtra(String, String[])
aby dodać je do intencji.
Wysyłanie danych binarnych
Udostępnianie danych binarnych za pomocą działania ACTION_SEND
.
Ustaw odpowiedni typ MIME i wpisz identyfikator URI danych w dodatkowym
EXTRA_STREAM
, jako
w poniższym 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.
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))
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. Preferowany mechanizm udostępniania dostępu jest użycie uprawnień według identyfikatora URI, które są tymczasowy i przyznawaj dostęp tylko do aplikacji odbierającej. Prosty sposób na utworzenieContentProvider
podobny do tego to użycieFileProvider
klasa pomocnicza. - Użyj systemu
MediaStore
.MediaStore
jest przeznaczony głównie do obsługi typów MIME plików wideo, audio i graficznych. Jednak od Androida 3.0 (interfejs API) poziomu 11), mogą też przechowywać treści inne niż medialne. Więcej informacji znajdziesz w artykuleMediaStore.Files
. Pliki można wstawiać doMediaStore
za pomocą funkcjiscanFile()
. Następnie do podanego odwołania funkcjionScanCompleted()
przekazywany jest obiektUri
w formaciecontent://
, który nadaje się do udostępniania. Pamiętaj, że po dodaniu do systemuMediaStore
treści są dostępne dla każdej aplikacji na urządzeniu.
Używanie odpowiedniego typu MIME
Podaj najbardziej szczegółowy typ MIME dostępny dla danych, które wysyłasz. Na przykład, podczas udostępniania zwykłego tekstu użyj text/plain
. Oto kilka
typowe typy MIME podczas wysyłania prostych danych w Androidzie:
Odbiorcy rejestrują się w celu | Nadawcy wysyłają |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Obsługiwane rozszerzenia pliku | application/pdf |
Więcej informacji o typach MIME znajdziesz w oficjalnym rejestrze typów multimediów MIME IANA.
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 elementów treści
Aby udostępnić wiele treści, użyj działania ACTION_SEND_MULTIPLE
wraz z listą identyfikatorów URI wskazujących na te treści. Typ MIME różni się w zależności od
zestaw 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ć wysłane. Jeśli chcesz przesłać kilka rodzajów danych, użyj
"*/*"
Zależy to od aplikacji odbierającej
i przetwarzania danych. Oto przykład:
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))
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ą
do danych, 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. Rozważ udostępnienie
skomplikowany adres URL, np. https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. Bardziej szczegółowy podgląd może pomóc użytkownikom zrozumieć, co jest 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 nawiązaniem połączenia z numerem Intent.createChooser()
i dodaj
odpowiednia miniatura za pomocą funkcji ClipData
.
Uwaga: identyfikator URI zawartości obrazu jest pobierany z
FileProvider
, zwykle ze skonfigurowanego celu <cache-path>
.
Więcej informacji znajdziesz w artykule Udostępnianie plików. Pamiętaj, aby
Arkusz udostępniania musi mieć odpowiednie uprawnienia do odczytu dowolnego obrazu, którego chcesz użyć jako miniatury. Aby dowiedzieć się więcej,
zobacz Intent.FLAG_GRANT_READ_URI_PERMISSION
.
Oto przykład:
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)
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 arkusza udostępniania

Zrzut ekranu pokazujący działania niestandardowe w arkuszu udostępniania Androida.
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 u góry arkusza udostępniania Androida.
może określać dowolne Intent
jako działanie wywoływane po kliknięciu ikony.
Aby dodać niestandardowe działania w arkuszu udostępniania Androida, najpierw utwórz
ChooserAction
z
ChooserAction.Builder
Możesz określić PendingIntent
jako działanie wywoływane po kliknięciu ikony. Utwórz tablicę zawierającą wszystkie działania niestandardowe i wskaż ją jako EXTRA_CHOOSER_CUSTOM_ACTIONS
of the share Intent
.
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)
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
Arkusz udostępniania Androida pozwala określić maksymalnie 2 obiekty ChooserTarget
, które
są wyświetlane przed wczytaniem skrótów udostępniania i celów wyboru z ChooserTargetServices
. Możesz też
określ maksymalnie 2 intencje wskazujące działania, które znajdują się na liście
przed sugestiami aplikacji:

Dodaj Intent.EXTRA_CHOOSER_TARGETS
i Intent.EXTRA_INITIAL_INTENTS
do swojej intencji udostępniania po wywołaniu Intent.createChooser()
:
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
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ą. Co niestandardowe: Intent
i ChooserTarget
, które dodasz, zmniejszy liczbę sugerowaną przez system. Zasadniczo
Odradzamy dodawanie niestandardowych celów. Typowym przykładem dodawania funkcji
Intent.EXTRA_INITIAL_INTENTS
pozwala użytkownikom na wykonywanie dodatkowych działań na udostępnionych
treści. Na przykład użytkownik udostępnia obrazy, a usługa Intent.EXTRA_INITIAL_INTENTS
jest używana do:
wystarczy wysłać link. Typowy przykład dodawania elementu Intent.EXTRA_CHOOSER_TARGETS
jest prezentacja odpowiednich osób lub urządzeń
oferowanych przez Twoją aplikację.
Wykluczanie określonych elementów docelowych na podstawie komponentu
Możesz wykluczyć określone miejsca docelowe, 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 elementów do udostępniania w aplikacji, gdy użytkownicy udostępniają treści z poziomu aplikacji, ponieważ prawdopodobnie chcą udostępnić je poza aplikacją.
Dodaj element Intent.EXTRA_EXCLUDE_COMPONENTS
do intencji po wywołaniu usługi Intent.createChooser()
:
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) }
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 cele wybierają.
Android Sharesheet umożliwia uzyskanie tych informacji przez podanie ComponentName
są kierowane na wybranych użytkowników za pomocą tagu IntentSender
.
Najpierw utwórz PendingIntent
dla obiektu BroadcastReceiver
i podaj jego
IntentSender
w Intent.createChooser()
:
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)
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
:
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Dodawanie działań niestandardowych do arkusza udostępniania
W Androidzie 14 (poziom interfejsu API 34) i nowszych aplikacje mogą dodawać niestandardowe działania do panelu udostępniania.
Utwórz ChooserAction
za pomocą 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 określoną jako
EXTRA_CHOOSER_CUSTOM_ACTIONS
udziału Intent
.
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)
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

Zrzut ekranu pokazujący resolver intencji ACTION_SEND
.
Rozpoznawanie intencji w Androidzie 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 dzwoń do numeru Intent.createChooser()
.
Jeśli masz wiele zainstalowanych aplikacji z pasującymi filtrami
ACTION_SEND
a typ MIME, system wyświetli okno ujednoznacznienia o nazwie intent resolver.
który pozwala użytkownikowi wybrać
docelowy obszar udostępniania. Jeśli pasuje do niej tylko jedna aplikacja, zostanie uruchomiona.
Oto przykład użycia rozwiązywania intencji w Androidzie do wysyłania tekstu:
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
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.