Wysyłanie prostych danych do innych aplikacji

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

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:

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 utworzenie ContentProvider podobny do tego to użycie FileProvider 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ługi MediaStore za pomocą scanFile(), po czym Uri w stylu content:// odpowiednie do udostępniania są przekazywane do onScanCompleted() oddzwanianie. Pamiętaj, że po dodaniu do systemu MediaStore 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/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
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:

Dodawanie działań niestandardowych do arkusza udostępniania

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:

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

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.