17
votes

Using the Facebook SDK, I can login and store my access_token into a database. When I try to create a post, the Facebook wall is still empty on both my phone and emulator due to these problems:

1) I fetch an access_token from the database and pass the access_token to Facebook, but I'm not allowed to post on a wall.

2) I cannot post my message without opening a dialog box.

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

How can I post to Facebook without opening the dialog box?

5
It seems to be so easy, but I tryed the code of Ankit and get the following error: 02-02 16:52:58.672: WARN/Bundle(6774): Key access_token expected byte[] but value was a java.lang.String. The default value <null> was returned. Why?user322281
It seems you have not restored Access_Token and Token_Exprires values in Facebook Object before doing response = mFacebook.request("me/feed", parameters,"POST"); so the solution towards your problem could be, SessionStore.restore(mFacebook, this); (method given in facebook example with filename SessionStore) Or else FacebookObject.setAccessToken(restore access_token provided by Facebook);FacebookObject.setAccessExpires(restore access_expires provided by facebook);Ankit

5 Answers

37
votes

i applied following code and could successfully posted my message on wall.

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

I updated my tutorial at http://www.integratingstuff.com/2010/10/14/integrating-facebook-into-an-android-application/ and it is now exactly answering this question. It is based on and basically the same as Ankit's answer, but guides people from start to finish through implementing the whole process.

2
votes

Well it's not that something gets posted on wall without informing user. When user allows your application, then the Android Facebook sdk presents another page, where there is a text that your applications sends, and a textBox where user can write on his wall, similar to the screenshot i have attached

The actual layout on mobile device is slightly different, but it's in the same format. This process is well shown in the sample examples of facebook android sdk.

Now check the question asked in this post:

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

In that question look for these : postParams.put(), similar type of lines will be there in some of your JAVA files. These are the lines using which you can post the data to Facebook.

For example:

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

is the 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\"}}}");

is the line where you are providing icon for application, description,caption, title etc.

alt text

1
votes

I used Ankit's code for posting on facebook wall but his code give me error android.os.NetworkOnMainThreadException.

After searching on this problem a solution told me that put your code in AsyncTask to get rid out of this problem. After modified his code it's working fine for me.

The modified code is looks like:

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
votes

This class helps me for sent messages on my Facebook wall WITHOUT dialog:

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

}