Android Coden
Android 4 min lesen

Inhalte teilen: Sharesheet und Intents in Android

Inhalte per Sharesheet teilen statt Apps fest zu verdrahten. Dieser Artikel erklärt Intents und MIME-Typen im modernen Android.

Sobald Nutzerinnen und Nutzer Inhalte aus deiner App heraus teilen wollen – einen Text, eine URL, ein Bild – erwartet Android, dass du das systemweite Sharesheet verwendest statt eine andere App direkt anzusprechen. Dieses Verhalten ist kein Nice-to-have, sondern ein Kern-Designprinzip der Plattform: Die Nutzerin entscheidet, welche App die Daten empfängt. Nicht du.

Was ist das?

Sharing Content in Android bezeichnet den Mechanismus, über den eine App Daten an andere Apps des Systems weitergibt – ohne zu wissen oder festzulegen, welche Ziel-App verwendet wird. Das passiert über das Android-Sharesheet: eine system-eigene Bottom-Sheet-UI, die alle registrierten Empfänger-Apps auflistet und der Nutzerin die Wahl überlässt.

Technisch steckt dahinter ein impliziter Intent. Statt eine konkrete Klasse zu adressieren (expliziter Intent), beschreibst du nur, was du teilen möchtest: eine Aktion – typischerweise Intent.ACTION_SEND – und den Typ des Inhalts als MIME-Typ. Android sucht alle installierten Apps, die diesen Intent verarbeiten können, und zeigt sie im Sharesheet an.

Das ist eine konsequente Umsetzung der Android-Architekturprinzipien. Deine App ist nicht verantwortlich für alles, was nach dem Teilen passiert. Sie ist nur zuständig für das Zusammenstellen des Inhalts – die Weitergabe delegiert sie ans System. Das passt direkt zur Data-Layer-Idee, wonach Daten klar von der UI-Logik getrennt vorgehalten werden, damit sie flexibel konsumiert werden können.

Wie funktioniert es?

Der Kern jeder Sharing-Aktion ist ein Intent mit der Aktion Intent.ACTION_SEND für einen einzelnen Datensatz oder Intent.ACTION_SEND_MULTIPLE für mehrere. Zusammen mit dem MIME-Typ gibst du damit an, welche Art von Inhalt übermittelt werden soll.

MIME-Typen gezielt setzen

MIME-Typen sind hierarchisch aufgebaut: text/plain, image/jpeg, image/*, */*. Je spezifischer du den Typ setzt, desto präziser filtert das Sharesheet. Apps, die nur Bilder verarbeiten, erscheinen dann nicht, wenn du einen Text teilst. Nutze */* nur als letzten Ausweg, weil es die Filterfunktion des Sharesheet vollständig deaktiviert und die Nutzerin mit einer unübersichtlich langen App-Liste konfrontiert.

ShareCompat als empfohlene API

Die Jetpack-Klasse ShareCompat.IntentBuilder abstrahiert den Intent-Aufbau und ist die empfohlene API für modernen Android-Code:

ShareCompat.IntentBuilder(context)
    .setType("text/plain")
    .setText("Schau dir das an: https://android-coden.de")
    .setChooserTitle("Teilen über…")
    .startChooser()

startChooser() ruft intern Intent.createChooser() auf und zeigt immer das systemweite Picker-Sheet, auch wenn nur eine einzige passende App installiert ist. Das ist ein wichtiger Unterschied zu startActivity(intent) direkt: Wenn nur eine App passt, würde Android sie ohne Rückfrage starten – was die Nutzerin überraschen kann.

Sharing aus Compose

In Compose greifst du via LocalContext.current auf den Kontext zu und rufst den Intent-Builder innerhalb eines Event-Handlers auf:

val context = LocalContext.current

Button(onClick = {
    ShareCompat.IntentBuilder(context)
        .setType("text/plain")
        .setText(articleUrl)
        .startChooser()
}) {
    Text("Artikel teilen")
}

Wenn du Architektur-Grenzen sauber hältst, gehört die Sharing-Logik ins ViewModel oder in einen Use Case. Der Compose-Callback delegiert dann nur den Aufruf, statt selbst Intent-Objekte zu konstruieren.

In der Praxis

Der häufigste Fehler: App-Package hardcoden

Ein verbreiteter Anfänger-Fehler ist, beim Teilen direkt eine bestimmte App anzusprechen:

// FALSCH – nie so machen
val intent = Intent(Intent.ACTION_SEND).apply {
    setPackage("com.whatsapp")
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, text)
}
startActivity(intent)

Das bricht sofort, wenn die adressierte App nicht installiert ist, und du umgehst das Intent-System, das für genau diese Aufgabe gebaut wurde. Außerdem verstößt es gegen die Google-Play-Richtlinien, die eine offene Weitergabelogik verlangen. Verwende stattdessen immer das Sharesheet und lass die Nutzerin entscheiden.

FileProvider für Dateien

Sobald du keine einfachen Texte, sondern Dateien teilst – Bilder, PDFs, Sprachaufnahmen – brauchst du FileProvider aus der AndroidX-Bibliothek. Direkte file://-URIs sind seit Android 7 (API 24) für die Inter-App-Kommunikation verboten. content://-URIs über FileProvider sind der einzig korrekte Weg:

val uri = FileProvider.getUriForFile(
    context,
    "${context.packageName}.provider",
    file
)

ShareCompat.IntentBuilder(context)
    .setType("image/png")
    .setStream(uri)
    .startChooser()

ShareCompat setzt FLAG_GRANT_READ_URI_PERMISSION automatisch. Wenn du den Intent manuell baust, musst du dieses Flag explizit hinzufügen, sonst verweigert die Ziel-App den Zugriff auf die URI und die Nutzerinnen sehen einen leeren Inhalt oder eine Fehlermeldung.

Stolperfalle: ActivityNotFoundException

Auf sehr stark eingeschränkten Geräten oder in Testumgebungen kann startChooser() eine ActivityNotFoundException auslösen, wenn kein einziger Intent-Handler installiert ist. Fange diese Exception ab oder prüfe mit packageManager.resolveActivity(), ob mindestens eine App vorhanden ist, bevor du den Intent startest.

Fazit

Sharing Content ist ein kleines, aber charakteristisches Beispiel dafür, wie Android-Apps kooperieren statt zu kontrollieren: Du lieferst den Inhalt, das System liefert den Kanal. Verstehe den Unterschied zwischen ACTION_SEND und ACTION_SEND_MULTIPLE, setze MIME-Typen so präzise wie möglich, und verwende immer createChooser() statt direktem startActivity(). Öffne jetzt eine deiner bestehenden Apps und überprüfe jeden Sharing-Aufruf: Nutzt er das systemweite Sharesheet? Ist der MIME-Typ korrekt gesetzt? Wird FileProvider für Datei-URIs eingesetzt? Das sind die drei Fragen, mit denen du dieses Wissen direkt in echtem Code verankern kannst.

Quellen (1)
Redaktion

Geschrieben von

Redaktion

Das Redaktionsteam recherchiert und schreibt Artikel zu aktuellen Themen rund um Tech, Lifestyle und Ratgeber.