Wie können Sie bestimmte Apps herausfiltern, wenn Sie die Absicht ACTION_SEND verwenden? Diese Frage wurde auf verschiedene Weise gestellt, aber ich konnte auf der Grundlage der gegebenen Antworten keine Lösung finden. Hoffentlich kann jemand helfen. Ich möchte die Möglichkeit bieten, innerhalb einer App zu teilen. Nach dem Rat von Android-Entwickler Alexander Lucas würde ich es vorziehen, dies mit Absichten und nicht mit den Facebook / Twitter-APIs zu tun.
Das Teilen mit der Absicht ACTION_SEND ist großartig, aber das Problem ist, dass (1) ich nicht jede Freigabeoption dort haben möchte, sondern sie lieber auf FB, Twitter und E-Mail beschränken möchte und (2) ich nicht teilen möchte das gleiche für jede Sharing-App . Zum Beispiel werde ich in meiner Twitter-Freigabe einige Erwähnungen und Hashtags auf 140 Zeichen oder weniger beschränken, während die Facebook-Freigabe einen Link und ein Feature-Image enthalten wird.
Ist es möglich, die Optionen für die Absicht ACTION_SEND (Freigabe) einzuschränken? Ich habe etwas über die Verwendung von PackageManager und queryIntentActivities gesehen, konnte jedoch die Verbindung zwischen dem PackageManager und der Absicht ACTION_SEND nicht herausfinden.
ODER
Anstatt die Freigabe-Apps zu filtern, könnte mein Problem auch gelöst werden, wenn ich die Absicht ACTION_SEND verwenden könnte, um direkt zu Facebook oder Twitter zu wechseln, anstatt den Dialog aufzurufen. Wenn dies der Fall wäre, könnte ich meinen eigenen Dialog erstellen und wenn sie auf "Facebook" klicken, eine Facebook-spezifische Absicht erstellen und sie einfach bis zu Facebook senden. Gleiches gilt für Twitter.
ODER ist das nicht möglich? Sind die Facebook- und Twitter-APIs der einzige Weg?
quelle
Antworten:
Meines Wissens hat StackOverflow viele Leute, die diese Frage auf verschiedene Weise stellen, aber noch hat niemand sie vollständig beantwortet.
Meine Spezifikation sah vor, dass der Benutzer E-Mail, Twitter, Facebook oder SMS mit benutzerdefiniertem Text für jeden auswählen kann. So habe ich das erreicht:
Ich habe an verschiedenen Orten einiges dazu gefunden, aber ich habe nirgendwo anders alles an einem Ort gesehen.
Beachten Sie, dass diese Methode auch alle albernen Optionen verbirgt, die ich nicht möchte, wie z. B. das Teilen über WLAN und Bluetooth.
Hoffe das hilft jemandem.
Bearbeiten: In einem Kommentar wurde ich gebeten zu erklären, was dieser Code tut. Grundsätzlich wird
ACTION_SEND
NUR eine Absicht für den nativen E-Mail-Client erstellt und dann andere Absichten in die Auswahl übernommen. Wenn Sie die ursprüngliche Absicht per E-Mail festlegen, wird all der zusätzliche Müll wie WLAN und Bluetooth beseitigt. Dann greife ich zu den anderen Absichten, die ich möchte, aus einem generischenACTION_SEND
Klartext und gehe sie an, bevor ich die Auswahl zeige.Wenn ich die zusätzlichen Absichten ergreife, lege ich für jede einen benutzerdefinierten Text fest.
Edit2: Es ist eine Weile her, seit ich das gepostet habe, und die Dinge haben sich ein bisschen geändert. Wenn Sie Google Mail zweimal in der Liste der Optionen sehen, entfernen Sie die spezielle Behandlung für "android.gm", wie in einem Kommentar von @h_k unten vorgeschlagen.
Da diese eine Antwort die Quelle fast aller meiner Stackoverflow-Reputationspunkte ist, muss ich zumindest versuchen, sie auf dem neuesten Stand zu halten.
quelle
Wenn Sie eine angepasste Option wünschen, sollten Sie sich für diese Aktion nicht auf das von Android bereitgestellte Standarddialogfeld verlassen.
Was Sie stattdessen tun müssen, ist Ihre eigene auszurollen. Sie müssen den PackageManager abfragen, auf welchen Paketen die von Ihnen gewünschte Aktion ausgeführt wird, und dann basierend auf der Antwort Filterung und benutzerdefinierten Text anwenden.
Schauen Sie sich insbesondere die Methode queryIntentActivities der PackageManager- Klasse an. Sie erstellen die Absicht, die den Standarddialog starten würde (die Absicht ACTION_SEND), übergeben diese an diese Methode und Sie erhalten eine Liste von Objekten, die Informationen zu den Aktivitäten enthalten, die diese Absicht verarbeiten können. Damit können Sie die gewünschten auswählen.
Sobald Sie Ihre Liste der Pakete erstellt haben, die Sie präsentieren möchten, müssen Sie einen eigenen Listendialog erstellen (vorzugsweise eine Aktivität mit dem Dialogthema), in dem diese Liste angezeigt wird.
Eine Sache, die zu beachten ist, ist, dass es sehr schwierig ist, diesen benutzerdefinierten Dialog wie den Standarddialog aussehen zu lassen. Das Problem ist, dass das in diesem Dialogfeld verwendete Thema ein internes Thema ist und von Ihrer Anwendung nicht verwendet werden kann. Sie können entweder versuchen, es dem nativen so ähnlich zu machen, wie Sie möchten, oder einen vollständig benutzerdefinierten Look wählen (viele Apps tun dies wie die Galerie-App usw.).
quelle
Probieren Sie diese aus, um nur drei Apps zu teilen - Facebook, Twitter, KakaoStory.
quelle
Ich habe hier eine Lösung gefunden, die für mich funktioniert (siehe den dritten Kommentar zur ersten Antwort). Dieser Code sucht nach einem gültigen Twitter-Client und verwendet ihn zum Posten des Tweets. Hinweis: Sie erhalten keine Absicht mit den verschiedenen Twitter-Clients und können auswählen.
Mit Twitter teilen:
Aufruf dieser Methode:
Facebook wird mit " com.facebook.katana " ähnlich sein , obwohl Sie den Nachrichtentext immer noch nicht festlegen können (veraltet im Juli 2011).
Codequelle: Absicht, den Twitter-Client auf Android zu öffnen
quelle
Vielen Dank an @dacoinminster. Ich nehme einige Änderungen an seiner Antwort vor, einschließlich der Paketnamen der beliebten Apps und der Sortierung dieser Apps.
quelle
Sie können den folgenden Code ausprobieren, er funktioniert einwandfrei.
Hier teilen wir einige spezifische Apps mit, nämlich Facebook, Messenger, Twitter, Google Plus und Google Mail.
quelle
Diese Lösung zeigt eine Liste von Anwendungen in einem ListView-Dialogfeld an, die der Auswahl ähnelt:
Es liegt an Ihnen:
Die Adapterklasse:
und seine Verwendung:
quelle
Am saubersten ist es, die folgenden Klassen zu kopieren: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Fügen Sie die Möglichkeit hinzu, die Absichten im ActivityChooserModel und die entsprechenden Unterstützungsmethoden im ShareActionProvider zu filtern. Ich habe die erforderlichen Klassen erstellt. Sie können sie in Ihr Projekt kopieren ( https://gist.github.com/saulpower/10557956 ). Dies bietet nicht nur die Möglichkeit, die Apps zu filtern, mit denen Sie teilen möchten (wenn Sie den Paketnamen kennen), sondern auch den Verlauf zu deaktivieren.
quelle
Ich habe die Antwort von @dacoinminster verbessert und dies ist das Ergebnis mit einem Beispiel zum Teilen Ihrer App:
quelle
Ich hatte das gleiche Problem und diese akzeptierte Lösung hat mir nicht geholfen. Wenn jemand das gleiche Problem hat, können Sie mein Code-Snippet verwenden:
quelle
quelle
So einfach und prägnant. Dank des Open Source-Entwicklers cketti für die Freigabe dieser Lösung:
Und dies ist die Verbindung zu seinem Kern.
quelle