Wysyłanie prostych danych do innych aplikacji

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.

Użytkownicy Androida mogą udostępniać dane 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 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_SENDdo 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ępnianie można sugerować cele niedostępne dla rozwiązań niestandardowych i stosować spójne rankingi. 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:

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 treści tekstowych

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:

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. Aby dodać je do intencji, użyj opcji putExtra(String, String[]).

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żyć do udostępnienia 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 ContentProvider, upewniając się, że inne aplikacje mają odpowiednie uprawnienia dostępu do Twojego dostawcy. Preferowanym mechanizmem zapewniania dostępu jest użycie uprawnień na poziomie adresu URI, które są tymczasowe i przyznają dostęp tylko aplikacji odbiorczej. Łatwym sposobem na utworzenie takiej funkcji ContentProvider jest użycie klasy pomocniczej FileProvider.
  • Użyj systemu MediaStore. MediaStore jest przeznaczony głównie do typów MIME filmów, dźwięku i obrazów. Jednak od Androida 3.0 (interfejs API 11) można w nim przechowywać też inne typy danych. Więcej informacji znajdziesz tutaj: MediaStore.Files. Pliki można wstawiać do MediaStore za pomocą funkcji scanFile(). Następnie do podanego odwołania funkcji onScanCompleted() przekazywany jest obiekt Uri w stylu content://, który nadaje się do udostępniania. Pamiętaj, że po dodaniu do systemu MediaStore 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 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/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Obsługiwane rozszerzenia plików application/pdf

Więcej informacji o typach MIME znajdziesz w oficjalnym rejestrze typów multimediów MIME IANA.

W zależności od typu MIME może się wyświetlić podgląd treści w panelu udostępniania na Androidzie. Niektóre funkcje podglądu są dostępne tylko w przypadku określonych typów.

Udostępnianie wielu 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 zależy od rodzaju 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 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ą na dane, do których aplikacja odbiorcza 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. 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. Przed wywołaniem funkcji Intent.createChooser() dodaj opis do funkcji Intent.EXTRA_TITLE i dodaj odpowiednią miniaturę za pomocą funkcji 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

Zrzut ekranu z niestandardowymi działaniami na karcie udostępniania w Androidzie

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 na karcie udostępniania na Androidzie, najpierw utwórz ChooserAction za pomocą 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.

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_TARGETSIntent.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 zachowaniem ostrożności. Każda niestandardowa wartość Intent i ChooserTarget, którą dodasz, zmniejsza liczbę sugerowaną przez system. Ogólnie odradzamy dodawanie celów niestandardowych. Typowym odpowiednim przykładem dodania Intent.EXTRA_INITIAL_INTENTS jest umożliwienie użytkownikom wykonywania dodatkowych działań w przypadku udostępnionych 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_TARGETSjest wyświetlanie odpowiednich osób lub urządzeń, które obsługuje Twoja aplikacja.

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 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 ComponentNameceló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 za pomocą 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.

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

Zrzut ekranu z rozwiązaniem intencji ACTION_SEND.

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 dzwoń do numeru Intent.createChooser().

Jeśli masz zainstalowane liczne aplikacje z filtrami pasującymi do ACTION_SEND i typu MIME, system wyświetli okno dialogowe rozróżniania zwane rozwiązywaczem zamiaru, które umożliwia użytkownikowi wybranie celu udostępniania. Jeśli pasuje do niej tylko jedna aplikacja, to ona 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.