Einfache Daten an andere Apps senden

Android verwendet Intents und die zugehörigen Extras, damit Nutzer Informationen schnell und einfach über ihre bevorzugten Apps teilen können.

Android bietet Nutzern zwei Möglichkeiten, Daten zwischen Apps zu teilen:

  • Das Android Sharesheet ist in erster Linie dafür gedacht, Inhalte außerhalb Ihrer App und/oder direkt an einen anderen Nutzer zu senden. Das kann zum Beispiel der Fall sein, wenn Sie eine URL mit einem Freund teilen.
  • Der Android-Intent-Resolver eignet sich am besten, um Daten an die nächste Phase einer genau definierten Aufgabe zu übergeben. Sie können beispielsweise eine PDF-Datei über Ihre App öffnen und Nutzern die Möglichkeit geben, ihren bevorzugten Viewer auszuwählen.

Wenn Sie eine Intention erstellen, geben Sie die Aktion an, die die Intention ausführen soll. Android verwendet die Aktion ACTION_SEND, um Daten von einer Aktivität an eine andere zu senden, auch über Prozessgrenzen hinweg. Sie müssen die Daten und ihren Typ angeben. Das System ermittelt automatisch die kompatiblen Aktivitäten, die die Daten empfangen können, und zeigt sie dem Nutzer an. Wenn nur eine Aktivität den Intent verarbeiten kann, wird diese Aktivität sofort gestartet.

Vorteile der Verwendung des Android-Freigabeblatts

Wir empfehlen dringend, das Android Sharesheet zu verwenden, um für Nutzer eine einheitliche Erfahrung in allen Apps zu schaffen. Die eigene Liste der Freigabeziele Ihrer App darf nicht angezeigt werden und Sie dürfen keine eigenen Varianten des Freigabeblatts erstellen.

Mit dem Android Sharesheet können Nutzer Informationen mit der richtigen Person teilen. Dazu werden relevante App-Vorschläge angezeigt und alles ist mit nur einem Tippen möglich. Im Freigabe-Sheet können Ziele vorgeschlagen werden, die für benutzerdefinierte Lösungen nicht verfügbar sind. Außerdem wird eine einheitliche Rangfolge verwendet. Das liegt daran, dass das Sharesheet Informationen zu App- und Nutzeraktivitäten berücksichtigen kann, die nur dem System zur Verfügung stehen.

Das Android Sharesheet bietet auch viele praktische Funktionen für Entwickler. Sie können beispielsweise Folgendes tun:

Android-Sharesheet verwenden

Erstellen Sie für alle Arten der Freigabe einen Intent und legen Sie die zugehörige Aktion auf Intent.ACTION_SEND fest. Rufen Sie Intent.createChooser() auf und übergeben Sie das Intent-Objekt, um das Android-Sharesheet einzublenden. Es wird eine Version Ihres Intents zurückgegeben, in der immer das Android-Freigabeblatt angezeigt wird.

Textinhalte senden

Die einfachste und häufigste Verwendung des Android Sharesheet besteht darin, Textinhalte von einer Aktivität an eine andere zu senden. Die meisten Browser können beispielsweise die URL der aktuell angezeigten Seite als Text mit einer anderen App teilen. Das ist nützlich, um einen Artikel oder eine Website per E-Mail oder in sozialen Netzwerken mit Freunden zu teilen. Hier ein Beispiel:

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);

Optional können Sie Extras hinzufügen, um weitere Informationen anzugeben, z. B. E-Mail-Empfänger (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC) und den E-Mail-Betreff (EXTRA_SUBJECT).

Hinweis:Bei einigen E‑Mail-Apps wie Gmail wird für Extras wie EXTRA_EMAIL und EXTRA_CC ein String[] erwartet. Verwenden Sie putExtra(String, String[]), um diese Ihrem Intent hinzuzufügen.

Binärinhalte senden

Binäre Daten mit der Aktion ACTION_SEND teilen Legen Sie den entsprechenden MIME-Typ fest und fügen Sie einen URI zu den Daten in das Extra EXTRA_STREAM ein, wie im folgenden Beispiel gezeigt. Diese Methode wird häufig zum Teilen von Bildern verwendet, kann aber auch zum Teilen von binären Inhalten beliebiger Art verwendet werden.

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));

Die empfangende Anwendung benötigt die Berechtigung, auf die Daten zuzugreifen, auf die Uri verweist. Dafür gibt es zwei empfohlene Vorgehensweisen:

  • Speichern Sie die Daten in Ihrem eigenen ContentProvider und achten Sie darauf, dass andere Apps die richtige Berechtigung für den Zugriff auf Ihren Anbieter haben. Der bevorzugte Mechanismus für den Zugriff sind Berechtigungen pro URI, die temporär sind und nur der empfangenden Anwendung Zugriff gewähren. Eine einfache Möglichkeit, ein solches ContentProvider zu erstellen, ist die Verwendung der Helper-Klasse FileProvider.
  • Verwenden Sie das System MediaStore. Der MediaStore ist hauptsächlich für Video-, Audio- und Bild-MIME-Typen vorgesehen. Ab Android 3.0 (API-Level 11) können dort jedoch auch andere Dateitypen gespeichert werden. Weitere Informationen finden Sie unter MediaStore.Files. Dateien können mit scanFile() in die MediaStore eingefügt werden. Danach wird ein content://-ähnlicher Uri, der sich zum Teilen eignet, an den bereitgestellten onScanCompleted()-Callback übergeben. Hinweis: Sobald die Inhalte dem System MediaStore hinzugefügt wurden, können alle Apps auf dem Gerät darauf zugreifen.

Den richtigen MIME-Typ verwenden

Geben Sie den spezifischsten verfügbaren MIME-Typ für die Daten an, die Sie senden. Verwenden Sie beispielsweise text/plain, wenn Sie Nur-Text freigeben. Hier sind einige gängige MIME-Typen für das Senden einfacher Daten in Android:

Empfänger registrieren sich für Absender senden
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Unterstützte Dateiendungen application/pdf

Weitere Informationen zu MIME-Typen finden Sie im offiziellen IANA-Register für MIME-Medientypen.

Im Android Sharesheet wird je nach bereitgestelltem MIME-Typ möglicherweise eine Inhaltsvorschau angezeigt. Einige Vorschaufunktionen sind nur für bestimmte Typen verfügbar.

Mehrere Inhalte teilen

Wenn Sie mehrere Inhalte teilen möchten, verwenden Sie die Aktion ACTION_SEND_MULTIPLE zusammen mit einer Liste von URIs, die auf die Inhalte verweisen. Der MIME-Typ variiert je nach den Inhalten, die Sie teilen. Wenn Sie beispielsweise drei JPEG-Bilder teilen, verwenden Sie den Typ "image/jpg". Wenn Sie eine Mischung aus Bildtypen verwenden möchten, verwenden Sie "image/*", um eine Aktivität abzugleichen, die jeden Bildtyp verarbeitet. Es ist zwar möglich, verschiedene Typen zu teilen, wir raten jedoch dringend davon ab, da der Empfänger nicht weiß, was gesendet werden soll. Wenn Sie mehrere Typen senden müssen, verwenden Sie "*/*". Es liegt an der empfangenden Anwendung, Ihre Daten zu parsen und zu verarbeiten. Beispiel:

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));

Achten Sie darauf, dass die bereitgestellten Uri-Objekte auf Daten verweisen, auf die eine empfangende Anwendung zugreifen kann.

Rich Content zu Textvorschauen hinzufügen

Ab Android 10 (API-Level 29) wird im Android-Sharesheet eine Vorschau des geteilten Texts angezeigt. In einigen Fällen ist der geteilte Text schwer zu verstehen. Sie können eine komplizierte URL wie https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4 teilen. Eine ausführlichere Vorschau kann Nutzern zeigen, was geteilt wird.

Wenn Sie Text in der Vorschau anzeigen, können Sie einen Titel, ein Vorschaubild oder beides festlegen. Fügen Sie Intent.EXTRA_TITLE eine Beschreibung hinzu, bevor Sie Intent.createChooser() aufrufen, und fügen Sie mit ClipData ein relevantes Thumbnail hinzu.

Hinweis:Der URI für den Bildinhalt wird von einem FileProvider bereitgestellt, in der Regel von einem konfigurierten <cache-path>. Weitere Informationen finden Sie unter Dateien freigeben. Achten Sie darauf, Sharesheet die Berechtigungen zum Lesen aller Bilder zu erteilen, die Sie als Thumbnail verwenden möchten. Weitere Informationen finden Sie unter Intent.FLAG_GRANT_READ_URI_PERMISSION.

Beispiel:

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));

Die Vorschau sieht in etwa so aus:

Benutzerdefinierte Aktionen zum Freigabeblatt hinzufügen

Screenshot von benutzerdefinierten Aktionen im Android-Freigabeblatt.

Unter Android 14 (API‑Level 34) und höher können Apps dem Android-Freigabe-Sheet benutzerdefinierte Aktionen hinzufügen. Die benutzerdefinierten Aktionen werden als kleine Aktionssymbole oben im Android-Freigabe-Sheet angezeigt. Apps können Intent als Aktion festlegen, die beim Klicken auf das Symbol aufgerufen wird.

Wenn Sie dem Android-Freigabe-Sheet benutzerdefinierte Aktionen hinzufügen möchten, erstellen Sie zuerst einen ChooserAction mit ChooserAction.Builder. Sie können PendingIntent als Aktion angeben, die aufgerufen wird, wenn auf das Symbol geklickt wird. Erstellen Sie ein Array mit allen benutzerdefinierten Aktionen und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS der Freigabe Intent an.

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);

Benutzerdefinierte Ziele hinzufügen

Im Android Sharesheet können Sie bis zu zwei ChooserTarget-Objekte angeben, die vor den Freigabeverknüpfungen und Auswahlzielen angezeigt werden, die aus ChooserTargetServices geladen werden. Sie können auch bis zu zwei Intents angeben, die auf Aktivitäten verweisen, die vor den App-Vorschlägen aufgeführt sind:

Fügen Sie Ihrem Share-Intent nach dem Aufrufen von Intent.createChooser() Intent.EXTRA_CHOOSER_TARGETS und Intent.EXTRA_INITIAL_INTENTS hinzu:

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);

Verwenden Sie diese Funktion mit Vorsicht. Jede benutzerdefinierte Intent- und ChooserTarget-Variable, die Sie hinzufügen, verringert die Anzahl der vom System vorgeschlagenen Variablen. Wir raten generell davon ab, benutzerdefinierte Ziele hinzuzufügen. Ein häufiges Beispiel für das Hinzufügen von Intent.EXTRA_INITIAL_INTENTS ist, Nutzern zusätzliche Aktionen zu ermöglichen, die sie für freigegebene Inhalte ausführen können. Ein Nutzer teilt beispielsweise Bilder und Intent.EXTRA_INITIAL_INTENTS wird verwendet, damit er stattdessen einen Link senden kann. Ein häufiges Beispiel für die Verwendung von Intent.EXTRA_CHOOSER_TARGETS ist die Anzeige relevanter Personen oder Geräte, die Ihre App bietet.

Bestimmte Ziele nach Komponente ausschließen

Sie können bestimmte Ziele ausschließen, indem Sie Intent.EXTRA_EXCLUDE_COMPONENTS angeben. Entfernen Sie nur Ziele, über die Sie die Kontrolle haben. Ein häufiger Anwendungsfall ist das Ausblenden der Freigabeziele Ihrer App, wenn Nutzer Inhalte aus Ihrer App heraus teilen, da sie Inhalte wahrscheinlich außerhalb Ihrer App teilen möchten.

Fügen Sie Ihrem Intent nach dem Aufrufen von Intent.createChooser() Intent.EXTRA_EXCLUDE_COMPONENTS hinzu:

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);

Informationen zur Freigabe abrufen

Es kann hilfreich sein, zu wissen, wann Ihre Nutzer Inhalte teilen und welches Ziel sie auswählen. Mit dem Android Sharesheet können Sie diese Informationen abrufen, indem Sie die ComponentName der Ziele angeben, die Ihre Nutzer über ein IntentSender auswählen.

Erstellen Sie zuerst ein PendingIntent für ein BroadcastReceiver und geben Sie das IntentSender in Intent.createChooser() an:

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());

Nehmen Sie den Rückruf in MyBroadcastReceiver entgegen und sehen Sie in Intent.EXTRA_CHOSEN_COMPONENT nach:

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);
}

Benutzerdefinierte Aktionen zum Freigabeblatt hinzufügen

Unter Android 14 (API‑Level 34) und höher können Apps dem Android-Freigabe-Sheet benutzerdefinierte Aktionen hinzufügen. Erstellen Sie eine ChooserAction mit ChooserAction.Builder. Sie können PendingIntent als Aktion angeben, die aufgerufen wird, wenn auf das Symbol geklickt wird. Erstellen Sie ein Array mit allen benutzerdefinierten Aktionen und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS der Freigabe Intent an.

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);

Android-Intent-Resolver verwenden

Screenshot des Intent-Resolvers für ACTION_SEND

Der Android-Intent-Resolver eignet sich am besten, wenn Daten im Rahmen eines genau definierten Aufgabenablaufs an eine andere App gesendet werden.

Wenn Sie den Android-Intent-Resolver verwenden möchten, erstellen Sie einen Intent und fügen Sie Extras hinzu, wie Sie es auch beim Aufrufen des Android-Sharesheets tun würden. Rufe jedoch nicht Intent.createChooser() an.

Wenn mehrere installierte Anwendungen mit Filtern vorhanden sind, die mit ACTION_SEND und dem MIME-Typ übereinstimmen, zeigt das System ein Dialogfeld zur Mehrdeutigkeitsauflösung an, das als Intent-Resolver bezeichnet wird und in dem der Nutzer ein Ziel für die Freigabe auswählen kann. Wenn nur eine Anwendung übereinstimmt, wird sie ausgeführt.

Hier ist ein Beispiel für die Verwendung des Android-Intent-Resolvers zum Senden von Text:

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);

Weitere Informationen

Weitere Informationen zum Senden von Daten finden Sie unter Intents und Intent-Filter.