Amira Elsayed Ismail
Amira Elsayed Ismail

Reputation: 9394

Facebook Session Permission Android

I want to use facebook sdk 3.5 to get user data, and also to allow my application to post on user wall

I have successfully make a simple application that use already installed fb app on mobile to get active session if found but the session is always opened with default permission, I want to make it opened with publish permission to be able post on user wall

I always get (200#)the user doesn't authenticate this application

Here is my code

public class FBSharingManager {

private static final String GRAPH_USER_LOADED = "graph_user_loaded";
private static final int REAUTH_ACTIVITY_CODE = 100;
private static final String[] PERMISSIONS = new String[] { "access_token",
        "status_update", "user_birthday", "publish_stream",
        "publish_actions", "email" };

private Activity mActivity;
private Session mSession;
private GraphUser mGraphUser;
private Bundle mSharingParameters;

public FBSharingManager(Activity activity) {

    this.mActivity = activity;
    loginAndGetSession();
}

public void synchPersonalProfileWithFaceBook() {

    ConnectivityManager connectivityManager = (ConnectivityManager) mActivity
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo.isConnected()) {

        if (mGraphUser == null) {

            getPersonalData();
        } else {

            broadcastGraphUser();
        }
    } else {

        Log.i("Myservices2", "network unavailable");
        String message = mActivity.getResources().getString(
                R.string.network_unavailable);

    }
}

private void loginAndGetSession() {

    Session.openActiveSession (mActivity, true,
            new Session.StatusCallback() {

                @Override
                public void call(final Session session, SessionState state,
                        Exception exception) {

                    if (session.isOpened()) {

                        mSession = session;
                        Session.setActiveSession(mSession);
                    }
                }
            });
}

private void requestPublishPermissions() {

    if (mSession != null && mSession.isOpened()) {

        Session.NewPermissionsRequest reauthRequest = new Session.NewPermissionsRequest(mActivity, PERMISSIONS).setRequestCode(REAUTH_ACTIVITY_CODE);
        reauthRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        mSession.requestNewPublishPermissions(reauthRequest);
    }
}

private void getPersonalData() {

    if (mSession != null && mSession.isOpened()) {

        Request.newMeRequest(mSession, new Request.GraphUserCallback() {
            @Override
            public void onCompleted(GraphUser user, Response response) {
                if (user != null) {

                    mGraphUser = user;
                    broadcastGraphUser();
                }
            }
        }).executeAsync();
    }

}

private void broadcastGraphUser() {

    // mActivity.showDialog(((ProfileActivity)mActivity).LOADING_DIALOIG);
    Log.i("fb user name", mGraphUser.getFirstName());
    Toast.makeText(mActivity.getApplicationContext(),mGraphUser.getFirstName(), Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(GRAPH_USER_LOADED);
    LocalBroadcastManager.getInstance(mActivity).sendBroadcast(intent);
    // mActivity.removeDialog(((ProfileActivity)mActivity).LOADING_DIALOIG);

}

public void shareOnFB(Bundle bundle) {

    ConnectivityManager connectivityManager = (ConnectivityManager) mActivity
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

    if (networkInfo.isConnected()) {

        mSharingParameters = bundle;

        if (mSession != null && mSession.isOpened()) {

            requestPublishPermissions();
            postToWallWraper();
        }

    } else {

        String message = mActivity.getResources().getString(
                R.string.network_unavailable);
    }
}

private void postToWallWraper() {

    if (mSession != null && mSession.isOpened()){

        Request.Callback callback = new Request.Callback() {
            public void onCompleted(Response response) {

                FacebookRequestError error = response.getError();
                if (error != null) {
                    Toast.makeText(mActivity.getApplicationContext(),
                            error.getErrorMessage(), Toast.LENGTH_SHORT)
                            .show();
                } else {
                    Toast.makeText(mActivity.getApplicationContext(),
                            "Done", Toast.LENGTH_LONG).show();
                }
            }
        };

        Request request = new Request(mSession, "me/feed",
                mSharingParameters, HttpMethod.POST, callback);

        RequestAsyncTask task = new RequestAsyncTask(request);
        task.execute();
    }

}

public GraphUser getUser() {
    return mGraphUser;
}

public void setUser(GraphUser user) {
    this.mGraphUser = user;
}

public Session getSession() {
    return mSession;
}

public void setSession(Session mSession) {
    this.mSession = mSession;
}
}

and this is activity code

public class MainActivity extends FragmentActivity {

    private FBSharingManager mFBSharingManager;
    private TextView welcome;
    private Button getuserdata, publishtowall;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mFBSharingManager = new FBSharingManager(this);

        welcome = (TextView) findViewById(R.id.welcome);
        getuserdata = (Button) findViewById(R.id.getuserdata);
        publishtowall = (Button) findViewById(R.id.publishtowall);


        getuserdata.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                mFBSharingManager.synchPersonalProfileWithFaceBook();
            }
        });

        publishtowall.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Bundle postParams = new Bundle();
                postParams.putString("name", "Facebook SDK for Android");
                postParams.putString("caption", "Build great social apps and get more installs.");
                postParams.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps.");
                postParams.putString("link", "https://developers.facebook.com/android");
                postParams.putString("picture", "https://raw.github.com/fbsamples/ios-3.x-howtos/master/Images/iossdk_logo.png");

                mFBSharingManager.shareOnFB(postParams);
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Session session = Session.getActiveSession();
        if (session != null) {
            session.onActivityResult(this, requestCode, resultCode, data);
            mFBSharingManager.setSession(session);
        }
    }

}

when I request to add permission to my session it back to my activity onActivityResult but it deosn't change the permission

Any help please

Upvotes: 3

Views: 1813

Answers (1)

Ming Li
Ming Li

Reputation: 15662

Please refer to the HelloFacebook sample app on how to properly request publish permissions and post.

The problem with your code is that you're requesting publish permissions (which is an asynchronous request), and immediately afterward making a post request, but by the time the post request is made, you haven't received the response from the publish permission request yet, which is why the post fails.

Also, as an aside, why are you suppressing SSO when making the publish permission request?

Upvotes: 1

Related Questions