Einfache Daten an andere Apps senden

Android verwendet Intents und die damit verbundenen Extras, damit Nutzer Informationen schnell und einfach ganz einfach mit ihren Lieblings-Apps.

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 senden. 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 den nächsten Phase einer klar definierten Aufgabe. Beispielsweise können Sie ein PDF aus Ihrer App öffnen und es den Nutzenden das bevorzugte Gerät auswählen.

Wenn Sie einen Intent erstellen, geben Sie die Aktion an, die der Intent ausführen soll. Android verwendet die Aktion ACTION_SEND Daten von einer Aktivität an eine andere zu senden, auch über Prozessgrenzen hinweg. Sie müssen angeben, die Daten und deren Typ. Das System erkennt automatisch die kompatiblen Aktivitäten, die die Daten empfangen und dem Nutzer sie anzeigen können. Beim Intent-Resolver Wenn nur eine Aktivität den Intent verarbeiten kann, beginnt diese Aktivität sofort.

Vorteile des Android-Sharesheet

Wir empfehlen dir dringend, das Android-Sharesheet zu verwenden, um für Konsistenz Apps. Keine eigene Liste mit gemeinsamen Zielen für Ihre App anzeigen und keine eigene erstellen Sharesheet-Varianten

Über das Android-Sharesheet können Nutzer Informationen mit dem mit nur einem Tippen relevante App-Vorschläge erhalten. Das Sharesheet kann Ziele vorschlagen, die für benutzerdefinierte Lösungen nicht verfügbar sind, und ein konsistentes Ranking verwendet. Das liegt daran, dass auf dem Sharesheet Informationen zu App- und Nutzeraktivitäten berücksichtigt werden können. die nur dem System zur Verfügung stehen.

Das Android-Sharesheet bietet auch viele praktische Funktionen für Entwickler. So können Sie zum Beispiel Gehen Sie so vor:

Android-Sharesheet verwenden

Erstellen Sie für alle Freigabetypen einen Intent und legen Sie seine Aktion auf Intent.ACTION_SEND Rufe zum Anzeigen des Android-Sharesheet folgende Nummer auf: Intent.createChooser(), und übergib das 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 von einer Aktivität zur anderen. Die meisten Browser können beispielsweise die URL der aktuell angezeigten Seite als Text in einer anderen App. Dies ist hilfreich, wenn Sie einen Artikel oder eine Website über oder in sozialen Netzwerken erreicht werden. 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. E-Mail-Empfänger. (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC) den E-Mail-Betreff (EXTRA_SUBJECT) usw.

Hinweis:Bei einigen E-Mail-Apps, z. B. Gmail, wird eine String[] für Extras wie EXTRA_EMAIL und EXTRA_CC. Verwenden Sie putExtra(String, String[]) um sie Ihrem 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 in der zusätzlichen EXTRA_STREAM, als wie im folgenden Beispiel dargestellt. 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 von Uri auf die sie verweist. Dafür gibt es zwei empfohlene Vorgehensweisen:

  • Speichern Sie die Daten in Ihrem eigenen ContentProvider und achten Sie darauf, dass andere Apps die erforderliche Zugriffsberechtigung für deinen Anbieter haben. Die bevorzugte Methode, Berechtigungen pro URI, die temporär und gewähren nur der empfangenden Anwendung Zugriff. Eine einfache Möglichkeit, ContentProvider so verwendet: Hilfsklasse FileProvider.
  • Verwende das System MediaStore. Das MediaStore ist in erster Linie für Video-, Audio- und Bild-MIME-Typen vorgesehen. Ab Android 3.0 (API) Ebene 11), können auch Nicht-Medientypen gespeichert werden. Weitere Informationen finden Sie unter MediaStore.Files Dateien können mithilfe vonMediaStore scanFile(), Danach wird ein Uri im Stil von content:// die für die Freigabe geeignet sind, onScanCompleted() Callback des Nutzers an. Beachten Sie, dass die Inhalte nach dem Hinzufügen zum MediaStore des Systems für alle Nutzer zugänglich sind. eine beliebige App auf dem Gerät.

Den richtigen MIME-Typ verwenden

Geben Sie den spezifischsten MIME-Typ für die Daten an, die Sie importieren möchten. Senden. Verwenden Sie beispielsweise text/plain, wenn Sie Nur-Text freigeben. Hier sind einige Gängige MIME-Typen beim Senden einfacher Daten unter 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

<ph type="x-smartling-placeholder">

Weitere Informationen zu MIME-Typen finden Sie in der IANA offizielles Register für MIME-Medientypen.

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

Mehrere Inhalte teilen

Wenn du mehrere Inhalte teilen möchtest, verwende die ACTION_SEND_MULTIPLE zusammen mit einer Liste von URIs, die auf den Inhalt verweisen. Der MIME-Typ variiert je nach die Sie teilen. Wenn Sie beispielsweise drei JPEG-Bilder teilen, verwenden Sie den Typ "image/jpg" Verwenden Sie "image/*" für eine Mischung aus Bildtypen, um einen die alle Arten von Bildern verarbeitet. Es ist zwar möglich, eine Kombination aus mehreren Typen zu verwenden, davon abraten, da es für den Empfänger nicht deutlich, was gesendet werden soll. Wenn mehrere Typen gesendet werden müssen, verwenden Sie "*/*" Es liegt an der empfangenden Anwendung, und verarbeiten Ihre Daten. 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 angegebenen Uri-Objekte auf einen Punkt verweisen auf Daten, 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 Textes angezeigt, der freigegeben. In einigen Fällen kann geteilter Text schwer verständlich sein. Erwägen Sie die Freigabe eines komplizierte URL wie https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Eine umfassendere in der Vorschau können Sie Ihren Nutzern mitteilen, was freigegeben wird.

Für die Vorschau von Text können Sie einen Titel, ein Thumbnail oder beides festlegen. Beschreibung hinzufügen für Intent.EXTRA_TITLE vor dem Aufruf von Intent.createChooser() und fügen Sie einen relevantes Thumbnail mit ClipData.

Hinweis:Der Bildinhalts-URI wird über ein FileProvider, normalerweise von einem konfigurierten <cache-path>. Weitere Informationen finden Sie unter Dateien freigeben. Geben Sie Sharesheet die richtigen Berechtigungen, um jedes Bild, das du als Thumbnail verwenden möchtest, zu lesen. Weitere Informationen siehe 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 und in Apps angezeigt. kann eine beliebige Intent als Aktion angeben, die aufgerufen wird, wenn auf das Symbol geklickt wird.

Wenn du auf 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 Ein Array, das alle Ihre benutzerdefinierten Aktionen enthält und als EXTRA_CHOOSER_CUSTOM_ACTIONS des Anteils 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);

Benutzerdefinierte Ziele hinzufügen

Im Android-Sharesheet kannst du bis zu zwei ChooserTarget-Objekte angeben, die werden vor den Freigabeverknüpfungen und Auswahlzielen von ChooserTargetServices angezeigt. Sie können auch Sie können bis zu zwei Intents angeben, die auf aufgelistete Aktivitäten verweisen. vor den App-Vorschlägen ein:

Intent.EXTRA_CHOOSER_TARGETS und Intent.EXTRA_INITIAL_INTENTS hinzufügen zu Ihren Share Intent nach dem Anruf 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);

Verwenden Sie diese Funktion mit Vorsicht. Jeden benutzerdefinierten Intent und ChooserTarget, die Sie hinzufügen, reduziert die vom System vorgeschlagene Anzahl. In der Regel raten wir davon ab, benutzerdefinierte Ziele hinzuzufügen. Ein gängiges geeignetes Beispiel für das Hinzufügen Über Intent.EXTRA_INITIAL_INTENTS sollen Nutzer zusätzliche Aktionen für freigegebene Elemente ermöglichen Inhalte. Beispiel: Ein Nutzer teilt Bilder und Intent.EXTRA_INITIAL_INTENTS wird verwendet, um stattdessen einen Link senden lassen. Ein gängiges geeignetes Beispiel für das Hinzufügen von Intent.EXTRA_CHOOSER_TARGETS besteht darin, relevante Personen oder Geräte zu präsentieren, 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, App-Freigabeziele festlegen, wenn Nutzer Inhalte innerhalb Ihrer App teilen, da sie diese wahrscheinlich teilen werden außerhalb Ihrer App.

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. Die Mit Android Sharesheet kannst du diese Informationen abrufen, indem du die ComponentName von die Ihre Nutzer auswählen, mit einem IntentSender.

Erstellen Sie zuerst ein PendingIntent für eine BroadcastReceiver und geben Sie seine IntentSender in 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());

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

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. ChooserAction erstellen mit ChooserAction.Builder. Sie können eine PendingIntent als Aktion angeben, die beim Anklicken des Symbols aufgerufen wird. Erstellen Ein Array, das alle Ihre benutzerdefinierten Aktionen enthält und als EXTRA_CHOOSER_CUSTOM_ACTIONS des Anteils 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);

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 es nennen würden das Android Sharesheet. Rufen Sie jedoch nicht an. Intent.createChooser()

Bei mehreren installierten Apps mit übereinstimmenden Filtern ACTION_SEND und des MIME-Typs enthält, zeigt das System ein Dialogfenster namens Intent-Resolver an. über die der Nutzer ein Ziel für die Freigabe auswählen kann. Wenn eine einzelne Anwendung stimmt, läuft er.

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: