Поделиться текстом на Facebook из приложения для Android через ACTION_SEND


91

У меня есть приложение для Android, которое поддерживает отправку текста через другие приложения. Поэтому он использует ACTION_SENDнамерение и EXTRA_TEXTполе. Выборщик представляет мне все приложения, которые могут справиться с таким намерением. Это Twitter, электронная почта ... и Facebook. Но когда я выбираю Facebook, он открывает браузер и переходит на следующую страницу:

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

Он показывает мой текст и кнопку отправки. Но когда я нажимаю кнопку отправки, ничего не происходит. Страница снова загружается. Я думаю, что возможно отправлять URL-адреса только через приложение Facebook. Могло ли это быть?

Кому-нибудь удалось отправить текст через ACTION_SENDприложение Facebook для Android?


4
Если вы посетили это сообщение SO и разочарованы тем, что приложение facebook не поддерживает должным образом ACTION_SEND, пожалуйста, найдите время, чтобы добавить свое сообщение в следующую тему: forum.developers.facebook.net/viewtopic.php?id=93900
Ошибка 454

7
Полагаю, 21-3-2012 все еще не решена? Потому что я не могу заставить его работать ..
Диего

1
developers.facebook.com/bugs/332619626816423 - Похоже, команда дизайнеров facebook закрыла этот, поскольку предварительное заполнение сообщения противоречит их политике :(
Бретт

1
@Brett Это чертовски смешно. Они просто хотят заставить вас добавить их SDK в ваш проект.
theblang 03

2
17 мая 2015 г. - все еще не работает с facebook.
Фейсал Асиф

Ответы:


11

ИЗМЕНИТЬ: с новым выпуском официального приложения Facebook для Android (14 июля 2011 г.) ЭТО РАБОТАЕТ !!!

СТАРОЕ: приведенные выше примеры не работают, если пользователь выбирает приложение Facebook для публикации, но они работают, если пользователь выбирает приложение Seesmic для публикации в Facebook. Полагаю, у Seesmic есть лучшая реализация API Facebook, чем у Facebook!


В Facebook версии 1.6.1 он не работает, и, похоже, при отправке есть некоторые дополнительные ошибки!
сб

Началось работать! Не знаю, в чем проблема. Спасибо, он тоже работает с FB v 1.6.1.
сб

8
Этот ответ неверен с момента выпуска версии 1.6.2 приложения facebook: developers.facebook.com/bugs/363863587019268
alaeri

51

Чтобы Поделиться работала с приложением facebook, вам нужно предоставить хотя бы одну ссылку:

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"));

Это покажет правильное окно совместного использования, но когда вы нажмете на «Поделиться», ничего не произойдет (я также пробовал использовать официальное приложение Twitter, оно не работает).

Единственный способ, который я нашел, чтобы заставить работать приложение Facebook, - это поделиться только ссылкой без текста:

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"));

Откроется следующее окно, и кнопка «Поделиться» будет работать:

расшарить на Фейсбук

Очевидно, он автоматически берет изображение и текст из ссылки, чтобы заполнить общий ресурс.

Если вы хотите поделиться только текстом, вам нужно будет использовать API facebook: https://github.com/facebook/facebook-android-sdk


4
Где текст «Замечательная поисковая машина»? Это та же самая ошибка, о которой люди сообщают выше, да?
Кайл Клегг

3
Он говорит, что вы можете размещать только ссылку. Нет текста. Текст «Замечательная поисковая машина» пришлось убрать, чтобы он заработал.
chubbsondubs

Я поставлю +1, если вы обновите ответ. На данный момент Facebookприложение будет правильно извлекать ссылку из строки вида Wonderful search engine http://www.google.fr/. Обратите внимание, что я сказал потянуть ссылку , она все равно ничего не сделает с текстом. Также Twitterработает как с текстом, так и со ссылкой.
theblang 04

45

06/2013:

  • Это ошибка Facebook, а не ваш код
  • Facebook НЕ исправит эту ошибку , они говорят, что «намеренно» нарушили систему совместного использования Android: https://developers.facebook.com/bugs/332619626816423
  • используйте SDK или поделитесь только URL.
  • Советы: вы можете немного схитрить, используя заголовок веб-страницы в качестве текста для сообщения.

28
Большое спасибо Faceobook. </
sarcasm

Спасибо @Loda за то, что привлекли наше внимание
Jigar

28

Сначала вам нужно запросить Intent для опции совместного использования обработчика. Затем используйте имя пакета для фильтрации Intent, тогда у нас будет только один вариант Intent для совместного использования обработчика!

Поделиться через Facebook

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;
   }
}

Бонус - Поделиться через Twitter

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;
   }
}

А если вы хотите узнать, как поделиться через другое приложение для обмена, найдите его там Tép Blog - Advance share через Android


13
Используя способы, которыми вы все еще не можете поделиться текстом (просто ссылку) в facebook и twitter. Вы должны использовать SDK Facebook (Twitter) для Android.
secretlm

Здравствуйте, я пробовал это, но не было сообщения, которым я хочу поделиться на facebook ... Есть идеи, почему? Он просит меня войти в систему и показывает "Что у вас на уме?" текст подсказки, а не фактический текст, которым я хочу поделиться
Рамеш Сангили

Это не работает. Он показывает тот же пустой ввод, что и при обычном (диалоговом) намерении.
Ixx 04

3
но в твиттере текст легко разместить
Trikaldarshiii

1
Не работает для Facebook, и чтобы разрешить публикацию в Twitter, нет необходимости устанавливать компонент намерения.
Juozas Kontvainis

11

Итак, у меня есть обходной путь, но он предполагает, что вы контролируете страницу, которой делитесь ...

Если вы отформатируете свой EXTRA_TEXT вот так ...

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

... тогда в приложениях, не относящихся к Facebook, ваш текст должен выглядеть примерно так:

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

Эй!
Это отличная картинка!

Теперь, если вы обновите свой веб-сайт так, чтобы запросы с параметром запроса extraText возвращали содержимое extraText в метаданных страницы.

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

Затем, когда Facebook экранирует этот URL-адрес для создания диалогового окна, он считывает метаданные заголовка и вставляет их в диалоговое окно общего доступа.

Я понимаю, что это довольно неприятное решение, так что относитесь к нему с недоверием ...


(плюс один) для справки xkcd.
Аамир Абро

2

Похоже, что приложение Facebook неправильно обрабатывает это намерение. Самый надежный способ - использовать API Facebook для Android.

SDK находится по этой ссылке: http://github.com/facebook/facebook-android-sdk

В разделе «Использование» имеется следующее:

Отобразите диалоговое окно Facebook.

SDK поддерживает несколько диалоговых окон WebView html для взаимодействия с пользователем, например для создания записи на стене. Это предназначено для обеспечения быстрой функциональности Facebook без необходимости реализации собственного пользовательского интерфейса Android и передачи данных в facebook напрямую через API.

Кажется, это лучший способ сделать это - отобразить диалоговое окно, которое будет размещено на стене. Единственная проблема в том, что им, возможно, придется сначала войти в систему


Ну, это не совсем то, о чем я просил. Но в любом случае спасибо за подсказку. Мне нужно было бы добавить отдельный пункт меню для
публикации в

Да, я понял, что вы имели в виду, и это сука, но у меня была та же проблема с намерением ACTION_SEND в моем приложении, а Facebook не исправил свое приложение, так что это кажется лучшей альтернативой
HXCaine

3
Я только что провел еще несколько поисков и обнаружил, что в Интернете есть люди с этой проблемой, а Facebook совсем не помогает. 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

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);

}

0

Похоже, что это ошибка в приложении Facebook, о которой сообщили в апреле 2011 года, и разработчики Android для Facebook еще не исправили ее.

Единственный обходной путь на данный момент - использовать их SDK.


2
Я думаю, они хотят, чтобы вы использовали веб-приложение, чтобы делиться контентом с друзьями, чтобы вы могли видеть рекламу ... У меня такая же проблема, и я буду реализовывать обмен Facebbok через facebook api.
Игорь

0

если вы хотите показать текст, поставьте # в начале сообщения, которое вы хотите, он поделится им как хэштег

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.