Android / Java - Опубликовать простой текст на стене Facebook? - PullRequest
45 голосов
/ 02 июня 2010

Я пытаюсь интегрировать публикацию на стене из своего приложения.У меня уже есть область, где пользователь может сохранить свое имя пользователя и пароль (в зашифрованном виде).Я хотел бы, чтобы моя программа вызывала сохраненные имя пользователя и пароль, передавала их в Facebook для аутентификации, а затем позволяла приложению публиковать простой текст (возможно, и ссылку) на стене пользователя.

Тем не менее, я прочитал все на страницах разработчиков в Facebook (API выглядит совершенно чуждым для меня ... Я никогда раньше не занимался разработкой веб-приложений любого типа ... только настольные приложения)и экспериментировал с библиотеками Java здесь , но, если честно, я не понимаю ни одной из различных реализаций.Некоторые утверждают, что они просты в использовании, но, видимо, они все над моей головой.

Я даже пытался связываться с официальным Android Android SDK, но в нем используется интерфейс веб-просмотра, и я не могу ввести имя пользователя и пароль для простой аутентификации.Кроме того, я все еще не знаю, как разместить сообщение на стене даже после правильной аутентификации.

Пожалуйста, помогите.Спасибо.

О, кстати, у меня уже есть ключ API Facebook и идентификатор приложения.

[ОБНОВЛЕНИЕ 1]

Для дальнейшего уточнения: Если я использую следующий фрагмент кода софициальный Android Android SDK http://github.com/facebook/facebook-android-sdk что мне делать дальше (после того, как пользователь вошел в систему)?Это мне неясно.

Facebook facebookClient = new Facebook();
facebookClient.authorize(this, "[APP ID]", new String[] {"publish_stream", "read_stream", "offline_access"}, this);

, где «this» - это действие, которое реализует DialogListener, а «[APP ID]» - это идентификатор моего приложения Facebook.

Спасибо.

[ОБНОВЛЕНИЕ 2]

Я нашел решение (см. Ниже), хотя единственное, чего не хватает, - это возможности автоматического заполнения текстовых полей для входа данными, которые я сохранил в приложении.Официальный Android Android SDK может не допустить этого.Я буду продолжать изучать это.

Ответы [ 4 ]

45 голосов
/ 02 июня 2010

Я понял это с помощью Тома (спасибо). Ключ заключался в создании диалога с вызовом API stream.publish с использованием Android Android SDK Facebook. Вот шаги:

  1. Загрузить официальный Android Android SDK: http://github.com/facebook/facebook-android-sdk
  2. Импорт файлов проекта в Eclipse.
  3. Экспорт проекта в виде файла * .jar. (это может вызвать конфликт)

    [UPDATE]

    Facebook недавно обновил исходный код, и я заметил, что значок файла вызвал конфликты идентификатора ресурса с моими проектами (Android 1.5+). Мое решение - забыть об экспорте в качестве баночки. Вместо этого скопируйте папку «com» ​​Facebook прямо в папку «src» вашего приложения (т. Е. «Com.facebook.android» должен быть пакетом в вашем приложении ... прямо рядом с исходными файлами). Если у вас уже есть папка «com» ​​в папке «src», не беспокойтесь ни о каких диалоговых окнах, которые появляются о перезаписи файлов, ни один из ваших исходных файлов не должен быть перезаписан. Вернитесь в Eclipse и обновите папку «src», а «com.facebook.android» теперь должен быть указан как пакет. Скопируйте один из включенных значков Facebook в папку «drawable» вашего приложения и обновите его. Eclipse будет жаловаться на файл «FbDialog.java» ... просто добавьте импорт, указывающий на файл «R» вашего приложения, в заголовок этого файла (например, если имя пакета вашего приложения «com.android.myapp», затем добавьте это: "импорт com.android.myapp.R;"). Перейдите к # 5, если вам нужно было сделать это.

  4. Добавьте файл .jar в путь сборки вашего проекта

  5. Посмотрите на следующий упрощенный пример кода:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import com.facebook.android.*;
import com.facebook.android.Facebook.DialogListener;

public class FacebookActivity extends Activity implements DialogListener,
        OnClickListener
{

    private Facebook facebookClient;
    private LinearLayout facebookButton;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.test);//my layout xml

        facebookButton = (LinearLayout)this.findViewById(R.id.Test_Facebook_Layout);

    }

    @Override
    public void onComplete(Bundle values)
    {

        if (values.isEmpty())
        {
            //"skip" clicked ?
            return;
        }

        // if facebookClient.authorize(...) was successful, this runs
        // this also runs after successful post
        // after posting, "post_id" is added to the values bundle
        // I use that to differentiate between a call from
        // faceBook.authorize(...) and a call from a successful post
        // is there a better way of doing this?
        if (!values.containsKey("post_id"))
        {
            try
            {
                Bundle parameters = new Bundle();
                parameters.putString("message", "this is a test");// the message to post to the wall
                facebookClient.dialog(this, "stream.publish", parameters, this);// "stream.publish" is an API call
            }
            catch (Exception e)
            {
                // TODO: handle exception
                System.out.println(e.getMessage());
            }
        }
    }

    @Override
    public void onError(DialogError e)
    {
        System.out.println("Error: " + e.getMessage());
    }

    @Override
    public void onFacebookError(FacebookError e)
    {
        System.out.println("Error: " + e.getMessage());
    }

    @Override
    public void onCancel()
    {
    }

    @Override
    public void onClick(View v)
    {
        if (v == facebookButton)
        {
            facebookClient = new Facebook();
            // replace APP_API_ID with your own
            facebookClient.authorize(this, APP_API_ID,
                new String[] {"publish_stream", "read_stream", "offline_access"}, this);
        }
    }
}

6 голосов
/ 26 сентября 2011
AsyncFacebookRunner mAsyncRunner;
    Facebook    facebook =new Facebook("Your app id");

btnLogin.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                facebook.authorize(FbdemoActivity.this, new String[]{ "user_photos,publish_checkins,publish_actions,publish_stream"},new DialogListener() {
                    @Override
                    public void onComplete(Bundle values) {



                    }

                    @Override
                    public void onFacebookError(FacebookError error) {
                    }

                    @Override
                    public void onError(DialogError e) {
                    }

                    @Override
                    public void onCancel() {
                    }
                });

            }
        });

    public void postOnWall(String msg) {
            Log.d("Tests", "Testing graph API wall post");
             try {
                    String response = facebook.request("me");
                    Bundle parameters = new Bundle();
                    parameters.putString("message", msg);
                    parameters.putString("description", "test test test");
                    response = facebook.request("me/feed", parameters, 
                            "POST");
                    Log.d("Tests", "got response: " + response);
                    if (response == null || response.equals("") || 
                            response.equals("false")) {
                       Log.v("Error", "Blank response");
                   }
             } catch(Exception e) {
                 e.printStackTrace();
             }
1 голос
/ 02 июня 2010

Вот объективный ответ на ваш новый вопрос: «Что мне делать дальше?»

Быстрый взгляд на исходный код заставляет меня поверить, что это то, что вы делаете:

Проверьте этот URL на наличие REST (http://en.wikipedia.org/wiki/Representational_State_Transfer) методов API, которые вы можете использовать, чтобы оставить комментарий / сообщение:

http://developers.facebook.com/docs/reference/rest/

Конкретно это: http://developers.facebook.com/docs/reference/rest/links.post

Проверьте строки с 171 по 295 в Facebook.java http://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/android/Facebook.java

Чтобы узнать, как использовать API для выполнения этих запросов.

Возможно, вам понадобится этот метод (он перегружен, см. Код).

        /**
* Make a request to Facebook's old (pre-graph) API with the given
* parameters. One of the parameter keys must be "method" and its value
* should be a valid REST server API method.
*
* See http://developers.facebook.com/docs/reference/rest/
*
* Note that this method blocks waiting for a network response, so do not
* call it in a UI thread.
*
* Example:
* <code>
* Bundle parameters = new Bundle();
* parameters.putString("method", "auth.expireSession");
* String response = request(parameters);
* </code>
*
* @param parameters
* Key-value pairs of parameters to the request. Refer to the
* documentation: one of the parameters must be "method".
* @throws IOException
* if a network error occurs
* @throws MalformedURLException
* if accessing an invalid endpoint
* @throws IllegalArgumentException
* if one of the parameters is not "method"
* @return JSON string representation of the response
*/
    public String request(Bundle parameters) 
0 голосов
/ 12 декабря 2010

Для тех, у кого проблемы, в новом фейсбуке (); , строка это вы App_id, и просто удалите APP_ID в авторизованном вызове.

Не знаю, почему отображается сообщение об ошибке, но я думаю, что Facebook обновил SDK facebook.

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