Facebook SDK 3.8 : permission publish_actions not

2019-03-15 21:33发布

问题:

I'm following the facebook android sharing tutorial by facebook (https://developers.facebook.com/docs/android/share). The app runs fine and I can login with facebook an click on the demo share button. So this is the procedure of my app:

  1. Login with facebook
  2. The facebook session object gets updated and the following permissions are saved within the session object: user_likes, user_friends, user_status, basic_info
  3. Now, I want to share something. Therefore the user clicks on a share button and a request for an additional permission called publish_actions is made

The following code performs this request:

public class MainActivity extends Activity {

    private Button shareButton;
    private UiLifecycleHelper uiHelper;
    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
    private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
    private boolean pendingPublishReauthorization = false;

...
    private void publishStory() {
        Session session = Session.getActiveSession();
        if( session != null) {
            List<String> permissions = session.getPermissions();
            if(!isSubsetOf(PERMISSIONS, permissions)) {
                pendingPublishReauthorization = true;
                Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS);
//Request the new permission here. The answer is processed in onSessionStateChange() method
                session.requestNewPublishPermissions(newPermissionsRequest);
                return;
            }

...

    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
//since the session is already open we enter this if branch
        if (state.isOpened()) {
            shareButton.setVisibility(View.VISIBLE);
//The result of state.equals(SessionState.OPENED_TOKEN_UPDATED) is false which indicates that the session object has not been updated (as far as I understand the fb api)
            Log.e(TAG, "state.equals(SessionState.OPENED_TOKEN_UPDATED) = " + state.equals(SessionState.OPENED_TOKEN_UPDATED));
//Output all the current permission the session has (publish_actions is not included here)
            List<String> permissions = session.getPermissions();
            Iterator<String> it = permissions.iterator();
            Log.e(TAG, "Content of list:");
            while(it.hasNext())
                Log.e(TAG, "permission = " + it.next());
//Since the OPENED_TOKEN_UPDATED has not been updated nothing further happens here              
            if (pendingPublishReauthorization && state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
                pendingPublishReauthorization = false;
                publishStory();
            }
        } else if (state.isClosed()) {
            shareButton.setVisibility(View.INVISIBLE);
        }
    }

So, although this seems to be correct there must be some remaining error. The publish_actions permission is not granted however I do not understand why. Only the existing permissions remain publish_actions.

Further remark: I've read some questions that say that an additional popup should appear asking the user to grant the permission. However this does not happen in my case. Maybe this is the problem? If so, what do I have to do to get the popup window?

UPDATE: I also additionally tried the following gist from github: https://gist.github.com/vishalpawale/5556996 This sample code fails due to the exact same reason. It does not get any publish_action permission. Seems to be a actual bug in the Facebook SDK?

回答1:

For publish permission you should send request in app settings and send for review, see https://developers.facebook.com/docs/apps/review/



回答2:

if you are using Facebook sdk 3.14.x+ thn after april 30th facebook has changed the application testing and submission process. Posted answer regarding permission related. check this link



回答3:

We were having the same issue here.

Try using:

Session.getActiveSession().refreshPermissions();

This will refresh the list of permissions available on

List<String> permissions = session.getPermissions();

It will only work with Facebook registered developers users or test users registered through the Facebook App Dashboard.

This worked for us.



回答4:

It only returns read-permission, not the write permission. Try the snippet below

    final Bundle permBundle = new Bundle();
    permBundle.putCharSequence("permission", "publish_actions");
    GraphRequest request = new GraphRequest(
            AccessToken.getCurrentAccessToken(),
            "/me/permissions", permBundle, HttpMethod.GET,
            new GraphRequest.Callback() {
                @Override
                public void onCompleted(GraphResponse graphResponse) {
                    Log.d(TAG, "response2: " + graphResponse.getJSONObject());
                    try {
                        JSONArray permList = (JSONArray) graphResponse.getJSONObject().get("data");
                        if(permList.length() == 0){
                            // no data for perms, hence asking permission
                            askForFBPublishPerm();
                        }else{
                            JSONObject permData = (JSONObject) permList.get(0);
                            String permVal = (String) permData.get("status");
                            if(permVal.equals("granted")){
                                postToFB();
                            }else{
                                askForFBPublishPerm();
                            }
                        }
                    } catch (JSONException e) {
                        Log.d(TAG, "exception while parsing fb check perm data" + e.toString());
                    }

                }
            }
    );
    request.executeAsync();