2010-06-01 7 views
45

Ich versuche, die Buchung an die eigene Wand in meiner App zu integrieren. Ich habe bereits einen Bereich, in dem der Benutzer seinen Benutzernamen und sein Passwort (verschlüsselt) speichern kann. Ich möchte, dass mein Programm den gespeicherten Benutzernamen und das Passwort speichert, dieses zur Authentifizierung an Facebook übergibt und dann der App erlaubt, einfachen Text (möglicherweise auch einen Link) an die Benutzerwand zu senden.Android/Java - Post einfachen Text zu Facebook-Wand?

Das heißt, ich habe alles auf den Entwicklerseiten bei Facebook gelesen (die API sieht mir völlig fremd ... Ich habe noch nie irgendeine Art von Web-App-Entwicklung gemacht ... nur Desktop-Apps), und Experimentiert mit den Java-Bibliotheken here, aber um ehrlich zu sein, ich verstehe keine der verschiedenen Implementierungen. Einige behaupten, einfach zu bedienen zu sein, aber anscheinend sind sie alle über meinem Kopf.

Ich habe sogar versucht, mit dem offiziellen Facebook Android SDK zu spielen, aber das verwendet eine Webview-Schnittstelle, und ich kann nicht den Benutzernamen und das Passwort für die einfache Authentifizierung übergeben. Außerdem bin ich immer noch ratlos, wie man selbst nach korrekter Authentifizierung an die Wand posten kann.

Bitte helfen. Danke.

Oh, übrigens ich habe bereits einen Facebook API Schlüssel und Application ID.

[UPDATE 1]

Zur weiteren Klarstellung: Wenn ich den folgenden Code-Schnipsel mit dem offiziellen Facebook Android SDK http://github.com/facebook/facebook-android-sdk was soll ich als nächstes tun (nachdem der Benutzer angemeldet hat in)? Das ist mir unklar.

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

wo "die" eine Tätigkeit, die ein DialogListener implementiert, und "[APP ID]" ist meine Facebook-Anwendung ID.

Danke.

[UPDATE 2]

fand ich eine Lösung (siehe unten), obwohl das einzige, was fehlt, ist die Fähigkeit, ist die Login-Textfelder mit den Daten automatisch ausfüllen ich in der App gespeichert haben. Das offizielle Facebook Android SDK lässt dies möglicherweise nicht zu. Ich werde weiter nachsehen.

+0

Ich habe keine Möglichkeit gefunden, dieses Statusupdate "im Hintergrund" durchzuführen, ohne einen Dialog anzuzeigen. Ich habe versucht, die Graph-API direkt mit dem vom SDK für Android bereitgestellten access_token zu verwenden, und es wird einfach nicht funktionieren. Keine Ausnahmen jedoch. –

+0

Ich bekomme immer noch funktioniert, aber die Single Sign-On-Option kann ohne Benutzername/Passwort anmelden, wenn sie bereits Facebook auf ihrem Telefon verwenden. Es fordert immer noch die Autorisierung an. – HaMMeReD

+0

Alter vielen Dank Sie haben meinen Arsch gerettet. Ich habe dieses Ding für morgen Demo arbeiten. Aber immer noch gibt es ein paar Dinge, die ich in meinem Facebook-Sharing brauche: - - Kann ich ein Bild zusammen mit dem Text an der Wand posten? - Kann ich den gesamten Inhalt meines Posts mit der Website meines Kunden verknüpfen? Mit Ausnahme dieser bin ich glücklich, ich habe es herausgefunden – abhishek

Antwort

45

Ich fand es heraus, mit Toms Hilfe (danke).Der Schlüssel war das Erstellen eines Dialogs mit dem API-Aufruf "stream.publish" mithilfe des Facebook Android SDK. Hier sind die Schritte:

  1. Laden Sie die offizielle Facebook Android SDK: http://github.com/facebook/facebook-android-sdk
  2. Import die Projektdateien in Eclipse.
  3. Exportieren Sie das Projekt als * .jar-Datei. (Dies könnte einen Konflikt verursachen)

    [UPDATE]

    Facebook vor kurzem den Quellcode aktualisiert und ich bemerkte die Symboldatei Ressource-ID Konflikte mit meinen Projekten (Android 1.5+) verursacht. Meine Lösung ist es, den Export als Glas zu vergessen. Kopiere stattdessen den Facebook "com" -Ordner direkt in den "src" -Ordner deiner App (d. H. "Com.facebook.android" sollte ein Paket in deiner App sein ... direkt neben deinen Quelldateien). Wenn Sie bereits einen "com" -Ordner in Ihrem "src" -Ordner haben, machen Sie sich keine Sorgen über irgendwelche Dialogboxen, die beim Überschreiben von Dateien erscheinen, keine Ihrer Quelldateien sollte überschrieben werden. Gehen Sie zurück in Eclipse und aktualisieren Sie den Ordner "src" und "com.facebook.android" sollte nun als Paket aufgelistet werden. Kopiere eines der mitgelieferten Facebook-Symbole in den "Drawable" -Ordner deiner App und aktualisiere das ebenfalls. Eclipse wird sich über die "FbDialog.java" -Datei beschweren ... fügen Sie einfach einen Import hinzu, der auf die "R" -Datei Ihrer App verweist, zum Header dieser Datei (zB wenn der Paketname Ihrer App "com.android.myapp" ist, dann fügen Sie hinzu dies: "import com.android.myapp.R;"). Gehen Sie zu # 5, wenn Sie dies tun müssen.

  4. Fügen Sie die .jar-Datei auf Ihrem Build-Pfad des Projekts

  5. Blick auf die folgenden vereinfachten Beispielcode:
 

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

Welches Projekt sollte als .jar exportiert werden? Der im Facebook-Ordner (nicht Beispiele Ordner)? Ich bekomme einen Bildschirm mit vielen Optionen, welche Ressourcen exportiert werden sollen, was soll ich dort wählen? Tnx – DixieFlatline

+0

Hey, alles, was Sie brauchen, ist der Quellordner („Facebook“) und Ressourcen, wenn es Sie, dass zu wählen können. Es gibt jedoch eine Sache. Facebook hat die Quelle kürzlich ein wenig geändert und ich hatte Probleme das importierte Glas in meine Projekte zu importieren (es gab einen Konflikt mit dem Facebook Icon und eine Datei in meinen Projekten). Ich habe die Lösung aktualisiert, um den Fix hinzuzufügen. Tut mir leid, dass ich nicht früher reagiert habe. – RyanM

+0

Was den Kommentar für if (! Values.containsKey („post_id“)) in der Funktion onComplete, ich denke, man kann einfach nur ein neues DialogDelegate für das vierte Argument von facebookClient.dialog um das Problem zu vermeiden, übergibt. Wie auch immer, danke für ein sehr nützliches Beispiel! – 9re

1

Hier ist eine objektive Antwort auf Ihre neue Frage: "Was mache ich als nächstes?"

Ein kurzer Blick auf den Quellcode führt mich ist das zu glauben, was Sie tun können:

Aktivieren Sie diese URL für den REST (http://en.wikipedia.org/wiki/Representational_State_Transfer) API-Methoden können Sie einen Kommentar/Post verwenden lassen:

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

Insbesondere folgt aus: http://developers.facebook.com/docs/reference/rest/links.post

Check out Linien 171 bis 295 von Facebook.java http://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/android/Facebook.java

Um zu sehen, wie Sie die API verwenden, um diese Anfragen zu stellen.

Wahrscheinlich möchten Sie diese Methode (sie ist überladen, siehe Code).

 /** 
* 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

Danke für die Antwort. Ihre Links haben mir geholfen, zu erkennen, was ich als nächstes tun muss (ich habe die Lösung veröffentlicht). Das einzige, was fehlt, ist die Möglichkeit, die Login-Textfelder automatisch mit den Daten zu füllen, die ich in der App gespeichert habe. – RyanM

0

Für diejenigen, die Probleme haben, in der neuen Facebook(); Die Zeichenfolge lautet App_id. Löschen Sie einfach die APP_ID im autorisierten Anruf.

Weiß nicht, warum die Fehlermeldung angezeigt wird, aber ich denke, dass Facebook das Facebook SDK aktualisiert hat.

6
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(); 
      } 
Verwandte Themen