Android wykorzystuje intencje i powiązane z nimi dodatki, aby umożliwić użytkownikom szybkie udostępnianie informacji z pomocą ulubionych aplikacji.
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 przez udostępnienie adresu URL znajomemu.
- Rozpoznawanie intencji Androida najlepiej nadaje się do przekazywania danych do kolejny etap dobrze zdefiniowanego zadania. Na przykład otwieranie pliku PDF w aplikacji i zezwolenie użytkownikom na wybrać preferowanego gogli.
Podczas tworzenia intencji określasz działanie, które ma ona wykonać.
Android używa działania ACTION_SEND
wysyłanie danych z jednej aktywności do drugiej,
a nawet wykraczać poza granice procesów. Musisz określić
i ich rodzaj. System automatycznie rozpoznaje zgodne aktywności
które mogą otrzymywać dane i wyświetlać je użytkownikowi. W przypadku resolvera
jeśli tylko jedno działanie może obsłużyć intencję, rozpocznie się ono natychmiast.
Dlaczego warto korzystać z arkusza udostępniania Androida
![](https://developer.android.com/static/images/training/sharing/sharesheet.png?authuser=0000&hl=pl)
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.
Android Sharesheet pozwala użytkownikom udostępniać informacje z odpowiednimi sugestiami aplikacji – wszystko to za pomocą jednego kliknięcia. Arkusz udostępniania może sugerować cele niedostępne dla rozwiązań niestandardowych i stosuje spójny ranking. Dzieje się tak, ponieważ arkusz udostępniania może uwzględniać informacje o aktywności użytkowników i aplikacji w aplikacji. które są dostępne tylko dla systemu.
Arkusz udostępniania Androida ma też wiele przydatnych funkcji dla programistów. Możesz na przykład: wykonaj te czynności:
- Dowiedz się, kiedy i gdzie użytkownicy udostępnią coś
- Dodawanie niestandardowego celu
ChooserTarget
i celów aplikacji - Wyświetlanie podglądu sformatowanego tekstu już w Androidzie 10 (poziom API 29)
- Wyklucz cele pasujące 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 przekazywanie jej obiektu Intent
.
Zwraca wersję intencji, w której zawsze wyświetla się arkusz udostępniania Androida.
Wyślij treść tekstową
Najprostszym i najpowszechniejszym zastosowaniem arkusza udostępniania Androida jest wysyłanie treści z jednej aktywności do drugiej. Na przykład większość przeglądarek może współdzielić URL aktualnie wyświetlanej strony jako tekst w innej aplikacji. Jest to przydatne, gdy chcesz udostępnić artykuł lub stronę znajomym przez: e-maila lub sieci społecznościowej. 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ć 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żywaj
putExtra(String, String[])
aby dodać je do intencji.
Wysyłaj treści binarne
Udostępnij dane binarne 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.
Zwykle jest stosowany do udostępniania obrazu, ale można go też stosować do udostępniania dowolnych 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 odbierająca potrzebuje uprawnień dostępu do danych interfejsu Uri
wskazuje. Możesz to zrobić na 2 sposoby:
- Przechowuj dane w swojej skrzynce
ContentProvider
, pamiętając, by pozostałe aplikacje mają odpowiednie uprawnienia dostępu do 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:MediaStore.Files
Pliki można wstawiać do usługiMediaStore
za pomocąscanFile()
, po czymUri
w stylucontent://
odpowiednie do udostępniania są przekazywane doonScanCompleted()
oddzwanianie. Pamiętaj, że po dodaniu do systemuMediaStore
treść jest dostępna dla: z dowolnej aplikacji na urządzeniu.
Używanie odpowiedniego typu MIME
Podaj najdokładniejszy typ MIME dostępny dla danych,
wysyłania. Na przykład podczas udostępniania zwykłego tekstu użyj elementu text/plain
. Oto kilka
typowe typy MIME podczas wysyłania prostych danych w Androidzie:
Odbiorcy rejestrują się w | Wysyłane przez nadawców |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Obsługiwane rozszerzenia pliku | application/pdf |
Więcej informacji o typach MIME znajdziesz w IANA oficjalny rejestr 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 elementów treści
Aby udostępnić wiele materiałów, użyj ACTION_SEND_MULTIPLE
wraz z listą identyfikatorów URI wskazujących treść. Typ MIME różni się w zależności od
zestaw udostępnianych treści. Jeśli na przykład udostępnisz trzy obrazy JPEG, użyj typu tagu
"image/jpg"
W przypadku kombinacji różnych typów obrazu użyj operatora "image/*"
, aby dopasować
które obsługuje dowolny typ obrazu. Chociaż można udostępniać różne typy treści,
odradzamy takie działania,
nie będzie jasne, co ma zostać 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:
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ą
do danych, do których aplikacja odbierająca ma dostęp.
Dodawanie szczegółowych treści do podglądu tekstu
Począwszy od Androida 10 (poziom interfejsu API 29) arkusz udostępniania Androida pokazuje podgląd tekstu
Udostępnione. 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
. Więcej
może dać użytkownikom pewność, co jest udostępniane.
Jeśli wyświetlasz podgląd tekstu, możesz ustawić tytuł, obraz miniatury 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
Arkusze udostępniania muszą 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:
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:
![](https://developer.android.com/static/images/training/sharing/sharing_content_preview.png?authuser=0000&hl=pl)
Dodawanie działań niestandardowych do arkusza udostępniania
![](https://developer.android.com/static/images/training/sharing/sharesheet_custom_actions.png?authuser=0000&hl=pl)
Zrzut ekranu pokazujący działania niestandardowe w arkuszu udostępniania Androida.
Na Androidzie 14 (poziom interfejsu API 34) i nowszym aplikacje mogą dodawać działania niestandardowe do arkusza udostępniania Androida.
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 określoną 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);
Dodaj cele niestandardowe
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:
![](https://developer.android.com/static/images/training/sharing/customshare.png?authuser=0000&hl=pl)
Dodaj Intent.EXTRA_CHOOSER_TARGETS
i Intent.EXTRA_INITIAL_INTENTS
do
Twoja intencja udostępniania po wywołaniu
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);
Używaj tej funkcji ostrożnie. 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ę.
Wyklucz konkretne cele według komponentu
Możesz wykluczyć określone cele, podając Intent.EXTRA_EXCLUDE_COMPONENTS
.
Pozwala to usuwać cele, nad którymi masz kontrolę. Częstym zastosowaniem jest ukrywanie
docelowe wartości udziału aplikacji, gdy użytkownicy udostępniają treści z poziomu aplikacji, ponieważ ich zamiary są większe
poza aplikacją.
Dodaj element Intent.EXTRA_EXCLUDE_COMPONENTS
do intencji po wywołaniu usługi 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 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()
:
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());
Oddzwonimy w ciągu MyBroadcastReceiver
i sprawdzisz
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 arkusza udostępniania
Na Androidzie 14 (poziom interfejsu API 34) i nowszym aplikacje mogą dodawać działania niestandardowe do arkusza udostępniania Androida.
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 określoną 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);
Użyj resolvera intencji Androida
![](https://developer.android.com/static/images/training/sharing/send_intent.png?authuser=0000&hl=pl)
Zrzut ekranu przedstawiają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 korzystać z mechanizmu rozpoznawania intencji w Androidzie, utwórz intencję i dodaj elementy dodatkowe, tak jak w przypadku wywołania
arkusza udostępniania Androida. Nie dzwoń jednak
Intent.createChooser()
Jeśli masz zainstalowanych wiele 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 pojedyncza aplikacja
uruchamia się.
Oto przykład użycia resolvera 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 sekcji Filtry intencji i zamiarów.