web-dev-qa-db-fra.com

Comment poster sur le mur de Facebook en utilisant le SDK Android de Facebook, sans ouvrir de boîte de dialogue

J'utilise facebook sdk et avec l'aide de l'exemple donné avec ce SDK, j'ai développé un code pour me connecter et stocker access_token dans la base de données.

j'ai 2 problèmes:

1). quand j'essaye de récupérer access_token de la base de données et de le transmettre à Facebook, cela ne me permet pas de poster sur le mur en utilisant cet exemple donné avec ce sdk de facebook, pourquoi est-ce vrai ??

2) Je suis passé par ce code Facebook.Java, mais ce que j’ai eu, c’est que pour poster sur un mur, j’ai dû ouvrir une boîte de dialogue car il n’existait aucune autre méthode pour transmettre mon message tout de suite et poster. Dites-moi s'il vous plaît la solution ou dites-moi que je devrais faire quand je veux poster sur un mur sans ouvrir une boîte de dialogue

   mPostButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                String message = "Post this to my wall";

                Bundle params = new Bundle();             

                params.putString("message", message);

                mAsyncRunner.request("me/feed", params, "POST", new WallPostRequestListener());

            }
        });

 public class WallPostRequestListener extends BaseRequestListener {

        public void onComplete(final String response) {
            Log.d("Facebook-Example", "Got response: " + response);
            String message = "<empty>";
            try {
                JSONObject json = Util.parseJson(response);
                message = json.getString("message");
            } catch (JSONException e) {
                Log.w("Facebook-Example", "JSON Error in response");
            } catch (FacebookError e) {
                Log.w("Facebook-Example", "Facebook Error: " + e.getMessage());
            }
            final String text = "Your Wall Post: " + message;
            Example.this.runOnUiThread(new Runnable() {
                public void run() {
                    mText.setText(text);
                }
            });
        }
    }

Quel est le problème avec le code ci-dessus .. il ne s'affiche pas sur le mur et me donne Wall Post: vide sur le téléphone et l'émulateur à la fois

Merci d'avance..

17
Ankit

j'ai appliqué le code suivant et pouvais publier avec succès mon message sur le mur.

public void postOnWall(String msg) {
        Log.d("Tests", "Testing graph API wall post");
         try {
                String response = mFacebook.request("me");
                Bundle parameters = new Bundle();
                parameters.putString("message", msg);
                parameters.putString("description", "test test test");
                response = mFacebook.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();
         }
    }
37
Ankit

J'ai mis à jour mon tutoriel sur http://www.integratingstuff.com/2010/10/14/integrating-facebook-into-an-Android-application/ et il répond maintenant exactement à cette question . est basé sur et correspond fondamentalement à la réponse d'Ankit, mais guide les gens du début à la fin tout au long de la mise en œuvre du processus.

7
Integrating Stuff

Eh bien, ce n'est pas que quelque chose soit affiché sur le mur sans en informer l'utilisateur. Lorsque l'utilisateur autorise votre application, le Android Facebook sdk présente une autre page, où il y a un texte envoyé par vos applications et une zone de texte dans laquelle l'utilisateur peut écrire sur son mur, similaire à la capture d'écran que j'ai jointe.

La disposition réelle sur le périphérique mobile est légèrement différente, mais elle est dans le même format. Ce processus est bien illustré dans les exemples de Facebook Android sdk.

Maintenant, vérifiez la question posée dans ce post:

Facebook Connect Android - Utilisation de stream.publish @ http://api.facebook.com/restserver.php'> Facebook Connect Android - Utilisation de stream.publish @ http://api.facebook.com/restserver.php

Dans cette question, recherchez: postParams.put (), des types de lignes similaires figureront dans certains de vos fichiers Java. Ce sont les lignes à l'aide desquelles vous pouvez poster les données sur Facebook.

Par exemple:

postParams.put("user_message", "TESTING 123");

est le message,

postParams.put("attachment", "{\"name\":\"Facebook Connect for Android\",\"href\":\"http://code.google.com/p/fbconnect-Android/\",\"caption\":\"Caption\",\"description\":\"Description\",\"media\":[{\"type\":\"image\",\"src\":\"http://img40.yfrog.com/img40/5914/iphoneconnectbtn.jpg\",\"href\":\"http://developers.facebook.com/connect.php?tab=iphone/\"}],\"properties\":{\"another link\":{\"text\":\"Facebook home page\",\"href\":\"http://www.facebook.com\"}}}");

est la ligne où vous fournissez une icône pour une application, une description, une légende, un titre, etc.

alt text

2
viv

J'ai utilisé le code d'Ankit pour publier sur le mur Facebook, mais son code me donne l'erreur Android.os.NetworkOnMainThreadException.

Après une recherche sur ce problème, une solution m’a dit de mettre votre code dans AsyncTask pour le résoudre. Après avoir modifié son code, cela fonctionne très bien pour moi.

Le code modifié ressemble à ceci:

public class UiAsyncTask extends AsyncTask<Void, Void, Void> {

    public void onPreExecute() {
        // On first execute
    }

    public Void doInBackground(Void... unused) {
        // Background Work
         Log.d("Tests", "Testing graph API wall post");
         try {
                String response = facebook.request("me");
                Bundle parameters = new Bundle();
                parameters.putString("message", "This test message for wall post");
                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();
         }
        return null;
    }

    public void onPostExecute(Void unused) {
         // Result
    }
}
1
Deepak

Cette classe m'aide pour les messages envoyés sur mon mur FacebookSANSdialogue:

public class FBManager{

  private static final String FB_ACCESS_TOKEN = "fb_access_token";
  private static final String FB_EXPIRES = "fb_expires";

  private Activity context;
  private Facebook facebookApi;

  private Runnable successRunnable=new Runnable(){
    @Override
    public void run() {
        Toast.makeText(context, "Success", Toast.LENGTH_LONG).show();
    }
  };    

  public FBManager(Activity context){

    this.context = context;

    facebookApi = new Facebook(FB_API_ID);

    facebookApi.setAccessToken(restoreAccessToken());

  } 

  public void postOnWall(final String text, final String link){
    new Thread(){
        @Override
        public void run(){
            try {
                Bundle parameters = new Bundle();
                parameters.putString("message", text);
                if(link!=null){
                    parameters.putString("link", link);
                }
                String response = facebookApi.request("me/feed", parameters, "POST");
                if(!response.equals("")){
                    if(!response.contains("error")){
                        context.runOnUiThread(successRunnable);                     
                    }else{
                        Log.e("Facebook error:", response);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }.start();     
  }


  public void save(String access_token, long expires){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    Editor editor=prefs.edit();
    editor.putString(FB_ACCESS_TOKEN, access_token);
    editor.putLong(FB_EXPIRES, expires);
    editor.commit();
  }

  public String restoreAccessToken(){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    return prefs.getString(FB_ACCESS_TOKEN, null);      
  }

  public long restoreExpires(){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    return prefs.getLong(FB_EXPIRES, 0);        
  } 

}

1
anivaler