Einfache Daten an andere Apps senden

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

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

  • Das Android-Sharesheet ist in erster Linie zum Senden von Inhalten außerhalb deiner App und/oder direkt an einen anderen Nutzer gedacht. Zum Beispiel, wenn Sie eine URL mit einem Freund teilen.
  • Der Android-Intent-Resolver eignet sich am besten für die Übergabe von Daten an die nächste Phase einer klar definierten Aufgabe. Beispielsweise kannst du ein PDF aus deiner App öffnen und es Nutzern ermöglichen, ihren bevorzugten Viewer auszuwählen.

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

Vorteile des Android-Sharesheet

Wir empfehlen dir dringend, das Android-Sharesheet zu verwenden, um für Konsistenz für deine Nutzer in allen Apps zu sorgen. Verwenden Sie nicht die eigene Liste von Freigabezielen Ihrer App und erstellen Sie keine eigenen Sharesheet-Varianten.

Mit Android Sharesheet können Nutzer Informationen mit der richtigen Person teilen und erhalten relevante App-Vorschläge mit nur einem Fingertipp. Das Sharesheet kann Ziele vorschlagen, die für benutzerdefinierte Lösungen nicht verfügbar sind, und ein konsistentes Ranking verwendet. Das liegt daran, dass das Sharesheet Informationen zur App- und Nutzeraktivität berücksichtigen kann, die nur für das System verfügbar sind.

Das Android-Sharesheet bietet auch viele praktische Funktionen für Entwickler. Sie haben beispielsweise folgende Möglichkeiten:

Android-Sharesheet verwenden

Erstellen Sie für alle Freigabetypen einen Intent und legen Sie seine Aktion auf Intent.ACTION_SEND fest. Wenn du das Android-Sharesheet aufrufen möchtest, rufe Intent.createChooser() auf und übergib dein Intent-Objekt. Er gibt eine Version deines Intents zurück, in der immer das Android-Sharesheet angezeigt wird.

Textinhalt senden

Die einfachste und häufigste Verwendung des Android-Sharesheet ist das Senden von Textinhalten von einer Aktivität an eine andere. Die meisten Browser können beispielsweise die URL der aktuell angezeigten Seite als Text an eine andere App weitergeben. Dies ist nützlich, um einen Artikel oder eine Website per E-Mail oder über soziale Netzwerke 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 zusätzliche Informationen hinzufügen, z. B. die E-Mail-Empfänger (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC) oder den E-Mail-Betreff (EXTRA_SUBJECT).

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

Binäre Inhalte senden

Teilen Sie Binärdaten mit der Aktion ACTION_SEND. Legen Sie den entsprechenden MIME-Typ fest und platzieren Sie einen URI zu den Daten im zusätzlichen EXTRA_STREAM, wie im folgenden Beispiel gezeigt. Dies wird üblicherweise verwendet, um ein Bild zu teilen, kann aber auch für beliebige Arten von binären Inhalten genutzt 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 für den Zugriff auf die Daten, auf die der Uri verweist. Dafür gibt es zwei empfohlene Vorgehensweisen:

  • Speichern Sie die Daten in Ihrem eigenen ContentProvider und achten Sie darauf, dass andere Anwendungen die entsprechende Berechtigung für den Zugriff auf Ihren Anbieter haben. Der bevorzugte Mechanismus für die Bereitstellung des Zugriffs besteht darin, Berechtigungen pro URI zu verwenden. Diese sind temporär und gewähren nur der empfangenden Anwendung Zugriff. Eine einfache Möglichkeit, ein ContentProvider wie diese zu erstellen, ist die Verwendung der Hilfsklasse FileProvider.
  • Verwende das System MediaStore. Das MediaStore-Objekt ist in erster Linie für Video-, Audio- und Bild-MIME-Typen vorgesehen. Ab Android 3.0 (API-Ebene 11) können aber auch Nicht-Medientypen gespeichert werden. Weitere Informationen finden Sie unter MediaStore.Files. Dateien können mithilfe von scanFile() in die MediaStore eingefügt werden. Danach wird ein Uri-Element im content://-Stil, das für die Freigabe geeignet ist, an den bereitgestellten onScanCompleted()-Callback übergeben. Beachten Sie, dass der Inhalt nach dem Hinzufügen zum MediaStore des Systems für jede App auf dem Gerät zugänglich ist.

Den richtigen MIME-Typ verwenden

Geben Sie den spezifischsten MIME-Typ für die von Ihnen gesendeten Daten an. 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 in der offiziellen IANA-Registry für MIME-Medientypen.

Je nach angegebenem MIME-Typ wird auf dem Android-Sharesheet möglicherweise eine Inhaltsvorschau angezeigt. Einige Vorschaufeatures sind nur für bestimmte Typen verfügbar.

Mehrere Inhalte teilen

Wenn Sie mehrere Inhalte freigeben möchten, verwenden Sie die Aktion ACTION_SEND_MULTIPLE zusammen mit einer Liste von URIs, die auf den Inhalt verweisen. Der MIME-Typ hängt von der Mischung der freigegebenen Inhalte ab. Wenn Sie beispielsweise drei JPEG-Bilder teilen, verwenden Sie den Typ "image/jpg". Verwenden Sie "image/*" für eine Mischung aus Image-Typen, um eine Aktivität abzugleichen, die einen beliebigen Image-Typ verarbeitet. Es ist zwar möglich, eine Mischung aus verschiedenen Typen zu teilen, wir raten jedoch dringend davon ab, da für den Empfänger nicht klar ist, was gesendet werden soll. Wenn mehrere Typen gesendet werden müssen, verwenden Sie "*/*". Die empfangende Anwendung muss Ihre Daten parsen und 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));

Die bereitgestellten Uri-Objekte müssen 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 Textes angezeigt. In einigen Fällen kann geteilter Text schwer verständlich sein. Sie können auch eine komplizierte URL wie https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4 verwenden. Durch eine umfassendere Vorschau können Ihre Nutzer besser nachvollziehen, was geteilt wird.

Für die Vorschau von Text können Sie einen Titel, ein Thumbnail oder beides festlegen. Fügen Sie Intent.EXTRA_TITLE eine Beschreibung hinzu, bevor Sie Intent.createChooser() aufrufen, und fügen Sie mit ClipData eine relevante Miniaturansicht hinzu.

Hinweis:Der Image-Inhalts-URI wird über eine FileProvider bereitgestellt, in der Regel von einem konfigurierten <cache-path>. Weitere Informationen finden Sie unter Dateien freigeben. Achte darauf, dass du Sharesheet die richtigen Berechtigungen zum Lesen jedes Bildes gibst, das du als Thumbnail verwenden möchtest. 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:

Dem Sharesheet benutzerdefinierte Aktionen hinzufügen

Screenshot der benutzerdefinierten Aktionen auf dem Android-Sharesheet.

Auf Geräten mit Android 14 (API-Level 34) und höher können dem Android-Sharesheet benutzerdefinierte Aktionen hinzugefügt werden. Die benutzerdefinierten Aktionen werden als kleine Aktionssymbole oben im Android-Sharesheet angezeigt und in Apps kann eine beliebige Intent als Aktion angegeben werden, die beim Anklicken des Symbols aufgerufen wird.

Wenn du dem Android-Sharesheet benutzerdefinierte Aktionen hinzufügen möchtest, erstelle zuerst ein ChooserAction mit ChooserAction.Builder. Sie können eine PendingIntent als Aktion angeben, die beim Anklicken des Symbols aufgerufen wird. Erstellen Sie ein Array, das alle Ihre benutzerdefinierten Aktionen enthält, und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS des gemeinsamen 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 kannst du bis zu zwei ChooserTarget-Objekte angeben, die angezeigt werden, bevor die Verknüpfungen und Auswahlziele für die Freigabe aus ChooserTargetServices geladen werden. Sie können auch bis zu zwei Intents angeben, die auf Aktivitäten verweisen, die vor den Anwendungsvorschlägen aufgeführt sind:

Fügen Sie Ihrem Freigabe-Intent Intent.EXTRA_CHOOSER_TARGETS und Intent.EXTRA_INITIAL_INTENTS hinzu, nachdem Sie Intent.createChooser() aufgerufen haben:

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. Mit jeder benutzerdefinierten Intent und ChooserTarget, die Sie hinzufügen, reduziert sich die vom System vorgeschlagene Anzahl. In der Regel raten wir davon ab, benutzerdefinierte Ziele hinzuzufügen. Ein gängiges Beispiel für das Hinzufügen von Intent.EXTRA_INITIAL_INTENTS ist die Bereitstellung zusätzlicher Aktionen, die Nutzer für freigegebene Inhalte ausführen können. Beispiel: Ein Nutzer teilt Bilder und Intent.EXTRA_INITIAL_INTENTS wird verwendet, damit er stattdessen einen Link senden kann. Ein gängiges geeignetes Beispiel für das Hinzufügen von Intent.EXTRA_CHOOSER_TARGETS ist die Anzeige relevanter Personen oder Geräte, die deine App bietet.

Bestimmte Ziele nach Komponente ausschließen

Sie können bestimmte Ziele ausschließen, indem Sie Intent.EXTRA_EXCLUDE_COMPONENTS angeben. Entfernen Sie so nur Ziele, über die Sie die Kontrolle haben. Ein häufiger Anwendungsfall besteht darin, die Freigabeziele Ihrer App auszublenden, wenn Nutzer Inhalte innerhalb Ihrer App teilen, da sie diese wahrscheinlich außerhalb der App teilen.

Fügen Sie dem Intent Intent.EXTRA_EXCLUDE_COMPONENTS hinzu, nachdem Sie Intent.createChooser() aufgerufen haben:

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 erhalten

Es kann hilfreich sein zu wissen, wann Ihre Nutzer Inhalte freigeben und welches Ziel sie auswählen. Im Android Sharesheet kannst du diese Informationen abrufen, indem du die ComponentName der Ziele angibst, die deine Nutzer mit einem IntentSender auswählen.

Erstellen Sie zuerst ein PendingIntent für eine BroadcastReceiver und geben Sie die zugehörigen 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());

Du erhältst den Callback in MyBroadcastReceiver und sieh 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);
}

Dem Sharesheet benutzerdefinierte Aktionen hinzufügen

Auf Geräten mit Android 14 (API-Level 34) und höher können dem Android-Sharesheet benutzerdefinierte Aktionen hinzugefügt werden. Erstellen Sie ein ChooserAction mit ChooserAction.Builder. Sie können eine PendingIntent als Aktion angeben, die beim Anklicken des Symbols aufgerufen wird. Erstellen Sie ein Array, das alle Ihre benutzerdefinierten Aktionen enthält, und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS des gemeinsamen 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 von ACTION_SEND Intent-Resolver.

Der Intent-Resolver von Android wird am besten verwendet, wenn Daten im Rahmen eines klar definierten Aufgabenablaufs an eine andere App gesendet werden.

Um den Android-Intent-Resolver zu verwenden, erstellen Sie einen Intent und fügen Sie Extras hinzu, wie Sie das Android-Sharesheet nennen würden. Rufen Sie Intent.createChooser() jedoch nicht auf.

Wenn es mehrere installierte Anwendungen mit Filtern gibt, die ACTION_SEND und dem MIME-Typ entsprechen, wird vom System ein Dialogfenster mit dem Namen Intent-Resolver angezeigt, über das der Nutzer ein Ziel für die Freigabe auswählen kann. Wenn eine einzelne 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.