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.

Android udostępnia 2 sposoby udostępniania danych między aplikacjami:

  • Arkusz udostępniania na Androidzie jest przeznaczony głównie do wysyłania treści poza aplikację lub bezpośrednio do innego użytkownika. Na przykład udostępnianie adresu URL znajomemu.
  • Rozwiązanie do rozpoznawania intencji w Androidzie najlepiej sprawdza się w przypadku przekazywania danych do następnego etapu dobrze zdefiniowanego zadania. Na przykład otwieranie pliku PDF z poziomu aplikacji i umożliwianie użytkownikom wybrania preferowanej przeglądarki.

Podczas tworzenia intencji określasz działanie, które ma ona wykonać. Android używa działania ACTION_SENDdo wysyłania danych z jednej aktywności do drugiej, nawet w ramach różnych procesów. 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 narzędzia do rozwiązywania intencji, jeśli tylko jedna aktywność może obsłużyć intencję, natychmiast się ona uruchamia.

Dlaczego warto korzystać z arkusza udostępniania w Androidzie

Zdecydowanie zalecamy używanie arkusza udostępniania Androida, aby zapewnić użytkownikom spójność w różnych aplikacjach. Nie wyświetlaj własnej listy miejsc docelowych udostępniania ani nie twórz własnych wariantów arkusza udostępniania.

Arkusz udostępniania na Androidzie umożliwia użytkownikom udostępnianie informacji odpowiednim osobom za pomocą odpowiednich sugestii aplikacji – wszystko za pomocą jednego kliknięcia. Arkusz udostępniania może sugerować miejsca docelowe niedostępne dla rozwiązań niestandardowych i używa spójnego rankingu. Wynika to z faktu, że arkusz udostępniania może uwzględniać informacje o aktywności w aplikacji i aktywności użytkownika, które są dostępne tylko dla systemu.

Arkusz udostępniania na Androidzie ma 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ć arkusz udostępniania na Androidzie, wywołaj funkcję Intent.createChooser(), przekazując do niej obiekt Intent. Zwraca wersję intencji, która zawsze wyświetla arkusz udostępniania Androida.

Wysyłanie treści tekstowych

Najprostszym i najczęstszym zastosowaniem arkusza udostępniania na Androidzie jest wysył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 do udostępniania artykułów lub stron internetowych 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, np. odbiorców e-maila (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC), temat e-maila (EXTRA_SUBJECT) itp.

Uwaga: niektóre aplikacje do obsługi poczty e-mail, np. Gmail, oczekują znaku String[] w przypadku dodatków takich jak EXTRA_EMAIL i EXTRA_CC. Użyj putExtra(String, String[]) aby dodać je do intencji.

Wysyłanie treści binarnych

Udostępniaj dane binarne za pomocą działania ACTION_SEND. Ustaw odpowiedni typ MIME i umieść identyfikator URI danych w dodatkowym polu EXTRA_STREAM, jak pokazano w tym przykładzie. Jest to powszechnie używane do udostępniania obrazów, ale można go używać do udostępniania dowolnego rodzaju 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 musi mieć uprawnienia dostępu do danych, na które wskazuje 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 udzielania dostępu jest używanie uprawnień do poszczególnych identyfikatorów URI, które są tymczasowe i przyznają dostęp tylko aplikacji odbierającej. Łatwym sposobem na utworzenie elementu ContentProvider takiego jak ten jest użycie klasy pomocniczej FileProvider.
  • Użyj systemu MediaStore. Element MediaStore jest przeznaczony głównie dla typów MIME plików wideo, audio i obrazów. Jednak od Androida 3.0 (API na poziomie 11) może też przechowywać typy inne niż multimedia. Więcej informacji znajdziesz w artykule MediaStore.Files. Pliki można wstawiać do elementu MediaStore za pomocą funkcji scanFile(), po czym do podanego wywołania zwrotnego onScanCompleted() przekazywany jest obiekt content:// w stylu Uri odpowiedni do udostępniania. Pamiętaj, że po dodaniu do systemu MediaStore treści są dostępne dla każdej aplikacji na urządzeniu.

Używaj odpowiedniego typu MIME

Podaj najbardziej szczegółowy typ MIME dostępny dla przesyłanych danych. Na przykład podczas udostępniania zwykłego tekstu użyj text/plain. Oto kilka typowych typów MIME podczas wysyłania prostych danych na Androidzie:

Odbiorniki rejestrują się w usłudze 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 MIME IANA.

W zależności od podanego typu MIME arkusz udostępniania na Androidzie może wyświetlać podgląd treści. Niektóre funkcje w wersji zapoznawczej 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ą adresów URI wskazujących 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 różnych typów obrazów użyj symbolu "image/*", aby dopasować aktywność, która obsługuje dowolny typ obrazu. Możesz udostępniać różne typy plików, ale zdecydowanie odradzamy takie działanie, ponieważ odbiorca nie będzie wiedzieć, co ma zostać wysłane. Jeśli musisz wysłać kilka typów, użyj "*/*". To aplikacja odbierająca musi przeanalizować i przetworzyć Twoje dane. 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 treści multimedialnych do podglądów tekstu

Począwszy od Androida 10 (interfejs API na poziomie 29), arkusz 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 skomplikowanego adresu URL, np. https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Bogatszy podgląd może uspokoić użytkowników, którzy będą wiedzieć, co jest udostępniane.

Jeśli wyświetlasz podgląd tekstu, możesz ustawić tytuł, miniaturę lub oba te elementy. Dodaj opis do elementu Intent.EXTRA_TITLE przed wywołaniem elementu Intent.createChooser() i dodaj odpowiednią miniaturę za pomocą elementu ClipData.

Uwaga: identyfikator URI treści obrazu jest podawany z FileProvider, zwykle z skonfigurowanego <cache-path>. Więcej informacji znajdziesz w artykule Udostępnianie plików. Upewnij się, że arkusz udostępniania ma odpowiednie uprawnienia do odczytywania dowolnego obrazu, którego chcesz użyć jako miniatury. Więcej informacji znajdziesz na stronie 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 arkusza udostępniania

Zrzut ekranu z niestandardowymi działaniami na arkuszu udostępniania Androida.

Na Androidzie 14 (poziom interfejsu API 34) i nowszym aplikacje mogą dodawać niestandardowe działania do arkusza udostępniania Androida. Niestandardowe działania są wyświetlane jako małe ikony działań u góry arkusza udostępniania na Androidzie, a aplikacje mogą określić dowolne Intent jako działanie wywoływane po kliknięciu ikony.

Aby dodać niestandardowe działania na arkuszu udostępniania na Androidzie, najpierw utwórz element ChooserAction z elementem 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śl ją jako EXTRA_CHOOSER_CUSTOM_ACTIONS udostępnianie 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 niestandardowych miejsc docelowych

Arkusz udostępniania na Androidzie umożliwia określenie maksymalnie 2 obiektów ChooserTarget, które są wyświetlane przed skrótami udostępniania i celami selektora wczytanymi z ChooserTargetServices. Możesz też określić maksymalnie 2 intencje wskazujące działania, które są wymienione przed sugestiami aplikacji:

Dodaj Intent.EXTRA_CHOOSER_TARGETSIntent.EXTRA_INITIAL_INTENTS do intencji 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);

Korzystaj z tej funkcji z rozwagą. Każdy dodany przez Ciebie niestandardowy Intent i ChooserTarget zmniejsza liczbę sugerowaną przez system. Zwykle odradzamy dodawanie celów niestandardowych. Typowym przykładem dodania Intent.EXTRA_INITIAL_INTENTS jest udostępnienie dodatkowych działań, które użytkownicy mogą wykonać w przypadku udostępnionych treści. Na przykład użytkownik udostępnia obrazy, a Intent.EXTRA_INITIAL_INTENTS umożliwia mu wysłanie linku zamiast tego. Typowym przykładem dodania Intent.EXTRA_CHOOSER_TARGETS jest wyświetlanie odpowiednich osób lub urządzeń, które obsługuje Twoja aplikacja.

Wykluczanie określonych celów według komponentu

Możesz wykluczyć konkretne miejsca docelowe, podając Intent.EXTRA_EXCLUDE_COMPONENTS. Rób to tylko w przypadku usuwania miejsc docelowych, nad którymi masz kontrolę. Częstym przypadkiem użycia jest ukrywanie celów udostępniania aplikacji, gdy użytkownicy udostępniają treści z poziomu aplikacji, ponieważ prawdopodobnie chcą udostępnić je poza nią.

Dodaj Intent.EXTRA_EXCLUDE_COMPONENTS do intencji po wywołaniu funkcji 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ą miejsce docelowe. Arkusz udostępniania na Androidzie umożliwia uzyskanie tych informacji przez podanie ComponentName wybranych przez użytkowników 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ź w 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ć niestandardowe działania do arkusza udostępniania Androida. 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 określ ją jako EXTRA_CHOOSER_CUSTOM_ACTIONS udostępnianie 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 narzędzia do rozwiązywania intencji w Androidzie

Zrzut ekranu narzędzia do rozwiązywania intencji ACTION_SEND.

Rozwiązanie do rozpoznawania intencji w Androidzie najlepiej sprawdza się w przypadku wysyłania danych do innej aplikacji w ramach dobrze zdefiniowanego przepływu zadań.

Aby użyć narzędzia do rozwiązywania intencji Androida, utwórz intencję i dodaj dodatkowe informacje, tak jak w przypadku wywoływania arkusza udostępniania Androida. Nie dzwoń pod numer Intent.createChooser().

Jeśli jest zainstalowanych kilka aplikacji z filtrami, które pasują do ACTION_SEND i typu MIME, system wyświetla okno dialogowe z prośbą o wybór, zwane rozwiązywaniem intencji, które umożliwia użytkownikowi wybranie aplikacji, do której ma zostać udostępniona zawartość. Jeśli pasuje tylko jedna aplikacja, zostanie ona uruchomiona.

Oto przykład użycia narzędzia do rozpoznawania 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.