Android / Java-zamieść prosty tekst na Facebook wall?

[1]}próbuję zintegrować publikowanie na ścianie z mojej aplikacji. Mam już obszar, w którym użytkownik może zapisać swoją nazwę użytkownika i hasło (zaszyfrowane). Chciałbym, aby mój program przywołał zapisaną nazwę użytkownika i hasło, przekazać je do Facebook w celu uwierzytelnienia, a następnie pozwolić aplikacji na publikowanie prostego tekstu (może link też) do ściany użytkownika.

To powiedziawszy, przeczytałem wszystko na stronach deweloperów na Facebook (api wygląda zupełnie obcy dla mnie... Nigdy nie robiłem żadnych rodzaj tworzenia aplikacji internetowych przed... tylko aplikacje desktopowe), i eksperymentował z bibliotekami Javy tutaj , ale szczerze mówiąc, nie rozumiem żadnej z różnych implementacji. Niektórzy twierdzą, że są proste w użyciu, ale najwyraźniej są ponad moją głową.

Próbowałem nawet mieszać z oficjalnym Facebook Android SDK, ale to używa interfejsu webview, i nie mogę przekazać w Nazwie użytkownika i hasła do łatwego uwierzytelniania. Poza tym nadal nie mam pojęcia, jak pisać do ściana nawet po prawidłowym uwierzytelnieniu.

Proszę o pomoc. Dzięki.

Oh, btw Mam już klucz API Facebook i ID aplikacji.

[UPDATE 1]

Dla dalszych wyjaśnień: Jeśli użyję poniższego fragmentu kodu z oficjalnym Facebook Android SDK http://github.com/facebook/facebook-android-sdk co powinienem zrobić dalej (po zalogowaniu się użytkownika)? Nie jest to dla mnie jasne.

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

Gdzie" to " jest działaniem implementującym DialogListener, a "[APP ID] " to mój identyfikator aplikacji Facebook.

Dzięki.

[UPDATE 2]

Znalazłem rozwiązanie (patrz poniżej), ale brakuje tylko możliwości automatycznego wypełniania pól tekstowych logowania danymi przechowywanymi w aplikacji. Oficjalny facebook Android SDK może na to nie pozwolić. Będę się temu przyglądał.

Author: Amokrane Chentir, 2010-06-02

4 answers

Rozgryzłem to, z Pomocą Toma (dzięki). Kluczem było stworzenie okna dialogowego z "stream.publikuj " wywołanie API, przy użyciu Facebook Android SDK. Oto kroki:

  1. Pobierz oficjalny Facebook Android SDK: http://github.com/facebook/facebook-android-sdk
  2. Importuj pliki projektu do Eclipse.
  3. Eksportuj projekt jako *.plik jar. (może to spowodować konflikt)

    [UPDATE]

    [1]} Facebook ostatnio zaktualizował kod źródłowy i zauważyłem, że plik ikony spowodował konflikty identyfikatorów zasobów z moimi projektami (Android 1.5+). Moim rozwiązaniem jest zapomnieć o eksporcie jako słoik. Zamiast tego skopiuj folder Facebook " com "bezpośrednio do folderu" src " aplikacji (np.facebook.android " powinien być pakietem w Twojej aplikacji... obok plików źródłowych). Jeśli masz już folder " com "w folderze "src", nie martw się o pojawiające się okna dialogowe dotyczące nadpisywania plików, żaden z plików źródłowych nie powinien być nadpisane. Wróć do Eclipse i odśwież folder " src " I " com.facebook.android " powinien być teraz wymieniony jako pakiet. Skopiuj jedną z dołączonych ikon Facebook do folderu aplikacji" drawable " i odśwież to. Eclipse będzie narzekać na " FbDialog.java " plik... wystarczy dodać import wskazujący na plik " r "aplikacji do nagłówka tego pliku (np. jeśli Nazwa pakietu aplikacji to" com.android.myapp, "następnie dodaj to:" import com.android.myapp.R;"). Idź do # 5 jeśli potrzebujesz zrobić to.
  4. Dodaj .plik jar do ścieżki budowania projektu

  5. spójrz na następujący uproszczony przykładowy kod:

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

 45
Author: RyanM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-27 11:47:59
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();
             }
 6
Author: Nilesh Gawade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 17:34:38

Oto obiektywna odpowiedź na twoje nowe pytanie: "co robić dalej?"

Szybkie spojrzenie na kod źródłowy prowadzi mnie do przekonania, że to jest to, co robisz:

Sprawdź ten adres URL dla reszty ( http://en.wikipedia.org/wiki/Representational_State_Transfer ) metody API, których możesz użyć, aby zostawić komentarz / post:

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

Konkretnie to: http://developers.facebook.com/docs/reference/rest/links.post

Sprawdź linie od 171 do 295 na Facebook ' u.java http://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/android/Facebook.java

Aby zobaczyć, jak używać API do wysyłania tych żądań.

Prawdopodobnie będziesz potrzebował tej metody(jest przeciążona, patrz kod).

        /**
* 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) 
 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-01 22:28:37

Do tych, którzy mają problemy, w nowym facebook(); , ciąg jest app_id, i po prostu usunąć APP_ID w autoryzowanym wywołaniu.

Facebook Facebook SDK zaktualizował ten Komunikat, ale nie wiem, dlaczego wyświetlany jest komunikat o błędzie.
 0
Author: Joakim Engstrom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-12 15:02:42