Поделиться текстом на Facebook из приложения для Android через ACTION_SEND - PullRequest
91 голосов
/ 18 августа 2010

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

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

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

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

Ответы [ 10 ]

51 голосов
/ 11 февраля 2011

Чтобы приложение «Поделиться» работало с приложением 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"));

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

facebook share

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

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

45 голосов
/ 05 июня 2013

06/2013:

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

Во-первых, вам нужен запрос Intent to handler option. Затем используйте имя пакета, чтобы отфильтровать 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 - расширенный доступ через Android

11 голосов
/ 21 декабря 2012

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

Если вы отформатируете 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 для создания диалога, он прочитает метаданные заголовка и вставит его в ваш общий ресурс.

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

11 голосов
/ 13 июня 2011

РЕДАКТИРОВАНИЕ: в новой версии официального приложения Facebook для Android (14 июля 2011 г.) ЭТО РАБОТАЕТ !!!

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

2 голосов
/ 15 сентября 2010

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

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

В разделе «использование» есть это:

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

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

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

1 голос
/ 07 декабря 2016
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);

}
1 голос
/ 12 декабря 2013
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
0 голосов
/ 24 июля 2016

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

0 голосов
/ 25 сентября 2011

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

На данный момент единственное решение этой проблемы - использовать их SDK..

...