Udostępnij tekst na Facebooku z aplikacji na Androida przez ACTION_SEND

91

Mam aplikację na Androida i obsługuje ona wysyłanie tekstu za pośrednictwem innych aplikacji. Dlatego używa ACTION_SENDintencji i EXTRA_TEXTpola. Wybieracz przedstawia mi wszystkie aplikacje, które mogą obsłużyć taki zamiar. Są to Twitter, e-mail, ... i Facebook. Ale kiedy wybieram Facebooka, otwiera przeglądarkę i przechodzi do następującej strony:

http://m.facebook.com/sharer.php?u=mytext

Pokazuje mój tekst i przycisk przesyłania. Ale kiedy naciskam przycisk przesyłania, nic się nie dzieje. Strona po prostu wczytuje się ponownie. Myślę, że możliwe jest wysyłanie adresów URL tylko za pośrednictwem aplikacji Facebook. Czy to możliwe?

Czy komuś udało się wysłać SMS-a ACTION_SENDprzez aplikację Facebook na Androida?

Goddchen
źródło
4
Jeśli odwiedzasz ten post SO i jesteś sfrustrowany, że aplikacja Facebook nie obsługuje poprawnie ACTION_SEND, poświęć trochę czasu, aby dodać swój post do następującego tematu: forum.developers.facebook.net/viewtopic.php?id=93900
Błąd 454
7
Zgaduję, że 21-3-2012 nadal nie jest rozwiązany? Ponieważ nie mogę zmusić go do pracy ..
Diego
1
developers.facebook.com/bugs/332619626816423 - Wygląda na to, że zespół projektantów Facebooka zamknął to, ponieważ wstępne wypełnienie wiadomości jest niezgodne z ich polityką :(
Brett
1
@Brett To jest cholernie śmieszne. Chcą tylko zmusić Cię do dodania ich zestawu SDK do projektu.
theblang
2
17 maja 2015 - nadal nie współpracuję z facebookiem.
Faisal Asif

Odpowiedzi:

11

EDITED: w nowej wersji oficjalnej aplikacji Facebook na Androida (14 lipca 2011) TO DZIAŁA !!!

STARY: Powyższe przykłady nie działają, jeśli użytkownik wybierze aplikację Facebook do udostępniania, ale działają, jeśli użytkownik wybierze aplikację Seesmic do publikowania na Facebooku. Wydaje mi się, że Seesmic ma lepszą implementację API Facebooka niż Facebook!

Giulio Prisco
źródło
W wersji 1.6.1 na Facebooku nie działa i wydaje się, że podczas wysyłania pojawiają się dodatkowe błędy!
sobota
Zaczęło działać! Nie wiem, w czym był problem. Dzięki temu działa również z FB v 1.6.1.
sob.
8
Ta odpowiedź jest błędna od czasu wydania wersji 1.6.2 aplikacji na Facebooku: developers.facebook.com/bugs/363863587019268
alaeri
51

Aby udostępnianie działało z aplikacją Facebook, wystarczy podać co najmniej jeden link:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "Wonderful search engine http://www.google.fr/");
startActivity(Intent.createChooser(intent, "Share with"));

Spowoduje to wyświetlenie prawidłowego okna udostępniania, ale po kliknięciu udostępnij nic się nie dzieje (próbowałem również z oficjalną aplikacją Twittera, nie działa).

Jedynym sposobem, w jaki udało mi się udostępnić aplikację na Facebooku, jest udostępnienie tylko linku bez tekstu:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "http://www.google.fr/");
startActivity(Intent.createChooser(intent, "Share with"));

Pokaże się następujące okno i przycisk Udostępnij będzie działał:

udostępnienie na Facebook

Najwyraźniej automatycznie pobiera obraz i tekst z linku, aby wypełnić udział.

Jeśli chcesz udostępniać tylko tekst, będziesz musiał skorzystać z interfejsu Facebooka: https://github.com/facebook/facebook-android-sdk

ol_v_er
źródło
4
Gdzie jest tekst „Wspaniała wyszukiwarka”? To ten sam błąd, który ludzie zgłaszają powyżej, tak?
Kyle Clegg
3
Mówi, że możesz zamieścić tylko link. Brak tekstu. Aby działała, należało usunąć tekst „Cudowna wyszukiwarka”.
chubbsondubs
Dam +1, jeśli zaktualizujesz odpowiedź. Od teraz Facebookaplikacja będzie poprawnie pobierać link z ciągu, takiego jak Wonderful search engine http://www.google.fr/. Zwróć uwagę, że powiedziałem, aby wyciągnąć link , nadal nic nie zrobi z tekstem. Ponadto, Twitterwspółpracuje zarówno z tekstu i link.
theblang
45

06/2013:

  • To jest błąd z Facebooka, a nie twój kod
  • Facebook NIE naprawi tego błędu , twierdzą, że „z założenia” zepsuli system udostępniania Androida: https://developers.facebook.com/bugs/332619626816423
  • użyj SDK lub udostępnij tylko URL.
  • Wskazówki: możesz trochę oszukać, używając tytułu strony internetowej jako tekstu postu.
Loda
źródło
28
Wielkie dzięki Faceobook. </sarcasm>
mr_lou,
Dzięki @Loda za zwrócenie naszej uwagi
Jigar
28

Najpierw potrzebujesz opcji udostępniania zapytania Intent to handler. Następnie użyj nazwy pakietu do przefiltrowania intencji, wtedy będziemy mieć tylko jedną opcję zamiaru, która ma opcję udostępniania obsługi!

Udostępnij na Facebooku

Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Content to share");
PackageManager pm = v.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
for (final ResolveInfo app : activityList) {
    if ((app.activityInfo.name).contains("facebook")) {
        final ActivityInfo activity = app.activityInfo;
        final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |             Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        shareIntent.setComponent(name);
        v.getContext().startActivity(shareIntent);
        break;
   }
}

Bonus - Udostępnij na Twitterze

Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Content to share");
PackageManager pm = v.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
for (final ResolveInfo app : activityList) {
    if ("com.twitter.android.PostActivity".equals(app.activityInfo.name)) {
        final ActivityInfo activity = app.activityInfo;
        final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |             Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        shareIntent.setComponent(name);
        v.getContext().startActivity(shareIntent);
        break;
   }
}

A jeśli chcesz dowiedzieć się, jak udostępniać za pomocą innej aplikacji do udostępniania, znajdź ją tam Tép Blog - Zaawansowane udostępnianie za pośrednictwem systemu Android

Khai Nguyen
źródło
13
Korzystając ze sposobów, w jakie nadal nie możesz udostępniać tekstu (tylko link) na Facebooku i Twitterze. Musisz użyć SDK Facebook (Twitter) dla Androida.
secretlm
Witam, próbowałem tego, ale nie wyświetlał się komunikat, że chcę go udostępnić na Facebooku ... Masz jakiś pomysł, dlaczego? Pyta mnie o zalogowanie się i wyświetla "Co masz na myśli?" tekst podpowiedzi, a nie rzeczywisty tekst, którym chcę się podzielić
Ramesh Sangili,
To nie działa. Pokazuje te same puste dane wejściowe, co w przypadku intencji normalnej (dialogowej).
Ixx,
3
ale na Twitterze można łatwo publikować
teksty
1
Nie działa na Facebooku, a aby umożliwić udostępnianie na Twitterze, nie ma potrzeby ustawiania komponentu intencji.
Juozas Kontvainis,
11

Mam więc obejście, ale zakłada się, że masz kontrolę nad udostępnianą stroną ...

Jeśli sformatujesz EXTRA_TEXT w ten sposób ...

String myText = "Hey!\nThis is a neat pic!";
String extraText = "http://www.example.com/myPicPage.html?extraText=\n\n" + myText;

... wtedy w aplikacjach innych niż Facebook twój tekst powinien wyglądać mniej więcej tak:

http://www.example.com/myPicPage.html?extraText=

Hej!
To fajne zdjęcie!

Teraz, jeśli zaktualizujesz swoją witrynę w taki sposób, że żądania z parametrem zapytania extraText zwracają zawartość extraText w metadanych strony.

<!-- Make sure to sanitize your inputs! e.g. http://xkcd.com/327/ -->
<meta name="title" content="Hey! this is a neat pic!">

Następnie, gdy Facebook ucieka z tego adresu URL, aby wygenerować okno dialogowe, odczyta metadane tytułu i osadzi je w oknie udostępniania.

Zdaję sobie sprawę, że to niezłe rozwiązanie, więc weź z przymrużeniem oka ...

Joseph Lee
źródło
(plus jeden) dla odniesienia xkcd.
Aamir Abro
2

Wygląda na to, że aplikacja Facebook nieprawidłowo obsługuje ten cel. Wydaje się, że najbardziej niezawodnym sposobem jest użycie Facebook API dla Androida.

Pakiet SDK znajduje się pod tym linkiem: http://github.com/facebook/facebook-android-sdk

W sekcji „użycie” jest to:

Wyświetl okno dialogowe Facebooka.

SDK obsługuje kilka okien dialogowych HTML WebView do interakcji użytkownika, takich jak tworzenie wpisu na ścianie. Ma to na celu zapewnienie szybkiej funkcjonalności Facebooka bez konieczności wdrażania natywnego interfejsu użytkownika Androida i przekazywania danych bezpośrednio do Facebooka przez interfejsy API.

Wydaje się, że to najlepszy sposób na zrobienie tego - wyświetl okno dialogowe, które zostanie opublikowane na ścianie. Jedynym problemem jest to, że być może będą musieli najpierw się zalogować

HXCaine
źródło
Cóż, nie jest to dokładnie to, o co prosiłem. Ale mimo wszystko dzięki za podpowiedź.
Musiałbym
Tak, zrozumiałem, co masz na myśli i to dziwka, ale miałem ten sam problem z intencją ACTION_SEND w mojej aplikacji, a Facebook nie naprawił ich aplikacji, więc wydaje się, że jest to najlepsza alternatywa
HXCaine
3
Właśnie przeprowadziłem więcej poszukiwań i odkryłem, że w całym Internecie są ludzie z tym problemem, a Facebook wcale nie pomaga. forum.developers.facebook.net/viewtopic.php?pid=255227
HXCaine
1
Check this out : By this we can check activity results also....
// Open all sharing option for user
                    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); 
                    sharingIntent.setType("text/plain");                    
                    sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, ShortDesc+" from "+BusinessName);
                    sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, ShortDesc+" "+ShareURL);
                    sharingIntent.putExtra(Intent.EXTRA_TITLE, ShortDesc+" "+ShareURL);
                    startActivityForResult(Intent.createChooser(sharingIntent, "Share via"),1000);
/**
     * Get the result when we share any data to another activity 
     * */
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch(requestCode) {
        case 1000:
            if(resultCode == RESULT_OK)
                Toast.makeText(getApplicationContext(), "Activity 1 returned OK", Toast.LENGTH_LONG).show();
            else
                Toast.makeText(getApplicationContext(), "Activity 1 returned NOT OK", Toast.LENGTH_LONG).show();
            break;
        case 1002:
            if(resultCode == RESULT_OK)
                Toast.makeText(getApplicationContext(), "Activity 2 returned OK", Toast.LENGTH_LONG).show();
            break;
        }// end switch



    }// end onActivityResult
Vinod Joshi
źródło
1
ShareDialog shareDialog = new ShareDialog(this);
if(ShareDialog.canShow(ShareLinkContent.class)) {

    ShareLinkContent linkContent = new ShareLinkContent.Builder().setContentTitle(strTitle).setContentDescription(strDescription)
                            .setContentUrl(Uri.parse(strNewsHtmlUrl))
                            .build();
    shareDialog.show(linkContent);

}
Ram Bhawan Kushwaha
źródło
0

Wygląda na to, że jest to błąd w aplikacji Facebook, który został zgłoszony w kwietniu 2011 r. I wciąż nie został naprawiony przez programistów Facebooka na Androida.

W tej chwili jedynym rozwiązaniem jest użycie ich zestawu SDK.

Joseph Woodward
źródło
2
Myślę, że chcą, abyś używał aplikacji internetowej do udostępniania treści, które można udostępniać znajomym, abyś mógł zobaczyć de Ads ... Mam ten sam problem i zaimplementuję udostępnianie Facebbok przez Facebook API.
Igor
0

jeśli chcesz pokazać tekst wstawiony # na początku wiadomości, którą chcesz, udostępni ją jako hashtag

MFQ
źródło