web-dev-qa-db-fra.com

Android / Java - Poster un texte simple sur le mur Facebook?

J'essaie d'intégrer la publication sur son mur depuis mon application. J'ai déjà un espace où l'utilisateur peut enregistrer son nom d'utilisateur et son mot de passe (crypté). J'aimerais que mon programme rappelle le nom d'utilisateur et le mot de passe enregistrés, les transmette à Facebook pour authentification, puis permette à l'application de publier un texte simple (peut-être aussi un lien) sur le mur de l'utilisateur.

Cela dit, j'ai tout lu sur les pages des développeurs sur Facebook (l'API me semble complètement étrangère ... Je n'ai jamais fait de développement d'applications Web auparavant ... juste des applications de bureau), et j'ai expérimenté avec le = Java bibliothèques ici mais pour être honnête, je ne comprends aucune des différentes implémentations. Certains prétendent être simples à utiliser, mais apparemment ils sont bien au-dessus de mes tête.

J'ai même essayé de jouer avec le Facebook officiel Android SDK, mais qui utilise une interface de visualisation Web, et je ne peux pas transmettre le nom d'utilisateur et le mot de passe pour une authentification facile. De plus, je suis toujours ne sait pas comment publier sur le mur même après une authentification correcte.

Veuillez aider. Merci.

Oh, btw j'ai déjà une clé API Facebook et un ID d'application.

[MISE À JOUR 1]

Pour plus de précisions: si j'utilise l'extrait de code suivant avec le Facebook officiel Android SDK http://github.com/facebook/facebook-Android-sdk ce qui devrait Je fais ensuite (après que l'utilisateur s'est connecté)? Cela ne me semble pas clair.

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

où "ceci" est une activité qui implémente un DialogListener et "[APP ID]" est mon ID d'application Facebook.

Merci.

[MISE À JOUR 2]

J'ai trouvé une solution (voir ci-dessous), bien que la seule chose qui manque soit la possibilité de remplir automatiquement les zones de texte de connexion avec les données que j'ai stockées dans l'application. Le SDK officiel Facebook Android SDK peut ne pas permettre cela. Je continuerai de le vérifier.

45
RyanM

Je l'ai compris, avec l'aide de Tom (merci). La clé consistait à créer une boîte de dialogue avec l'appel d'API "stream.publish", en utilisant le SDK Facebook Android. Voici les étapes:

  1. Téléchargez le Facebook officiel Android SDK: http://github.com/facebook/facebook-Android-sdk
  2. Importez les fichiers de projet dans Eclipse.
  3. Exportez le projet en tant que fichier * .jar. (cela pourrait provoquer un conflit)

    [MISE À JOUR]

    Facebook a récemment mis à jour le code source et j'ai remarqué que le fichier icône provoquait des conflits d'ID de ressource avec mes projets (Android 1.5+). Ma solution est d'oublier d'exporter en pot. Au lieu de cela, copiez le dossier Facebook "com" directement dans le dossier "src" de votre application (c'est-à-dire que "com.facebook.Android" devrait être un package dans votre application ... juste à côté de vos fichiers source). Si vous avez déjà un dossier "com" dans votre dossier "src", ne vous inquiétez pas des boîtes de dialogue qui apparaissent à propos de l'écrasement des fichiers, aucun de vos fichiers source ne doit être écrasé. Revenez dans Eclipse et actualisez le dossier "src" et "com.facebook.Android" devrait maintenant être répertorié comme un package. Copiez l'une des icônes Facebook incluses dans le dossier "dessinable" de votre application et actualisez-la également. Eclipse se plaindra du fichier "FbDialog.Java" ... ajoutez simplement une importation pointant vers le fichier "R" de votre application dans l'en-tête de ce fichier (par exemple si le nom du package de votre application est "com.Android.myapp", puis ajoutez ceci: "import com.Android.myapp.R;"). Allez à # 5 si vous en avez besoin.

  4. Ajoutez le fichier .jar au chemin de génération de votre projet

  5. Regardez l'exemple de code simplifié suivant:

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
RyanM
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
Nilesh Gawade

Voici une réponse objective à votre nouvelle question, "Que dois-je faire ensuite?"

Un rapide coup d'œil au code source me porte à croire que c'est ce que vous faites:

Vérifiez cette URL pour les méthodes REST ( http://en.wikipedia.org/wiki/Representational_State_Transfer ) API que vous pouvez utiliser pour laisser un commentaire/message:

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

Plus précisément ceci: http://developers.facebook.com/docs/reference/rest/links.post

Consultez les lignes 171 à 295 de Facebook.Java http://github.com/facebook/facebook-Android-sdk/blob/master/facebook/src/com/facebook/Android/Facebook.Java

Pour voir comment utiliser l'API pour effectuer ces demandes.

Vous voudrez probablement cette méthode (elle est surchargée, voir le 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) 
1
user132014

Pour ceux qui ont des problèmes, dans le nouveau facebook (); , la chaîne est votre App_id, et supprimez simplement l'APP_ID dans l'appel autorisé.

Je ne sais pas pourquoi le message d'erreur s'affiche, mais je suppose que Facebook a mis à jour le SDK Facebook.

0
Joakim Engstrom