0

这是我用于将图像从 Android 发布到 Facebook 的代码。

public class HelloFacebookSampleActivity extends FragmentActivity {

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
private static final Location SEATTLE_LOCATION = new Location("") {
    {
        setLatitude(47.6097);
        setLongitude(-122.3331);
    }
};

private final String PENDING_ACTION_BUNDLE_KEY = "com.facebook.samples.hellofacebook:PendingAction";

private Button postStatusUpdateButton;
private Button postPhotoButton;
private Button pickFriendsButton;
private Button pickPlaceButton;
private LoginButton loginButton;
private ProfilePictureView profilePictureView;
private TextView greeting;
private PendingAction pendingAction = PendingAction.NONE;
private ViewGroup controlsContainer;
private GraphUser user;

private enum PendingAction {
    NONE,
    POST_PHOTO,
    POST_STATUS_UPDATE
}
private UiLifecycleHelper uiHelper;

private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        onSessionStateChange(session, state, exception);
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    uiHelper = new UiLifecycleHelper(this, callback);
    uiHelper.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        String name = savedInstanceState.getString(PENDING_ACTION_BUNDLE_KEY);
        pendingAction = PendingAction.valueOf(name);
    }

    setContentView(R.layout.main);

    loginButton = (LoginButton) findViewById(R.id.login_button);
    loginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {
        @Override
        public void onUserInfoFetched(GraphUser user) {
            HelloFacebookSampleActivity.this.user = user;
            updateUI();
            // It's possible that we were waiting for this.user to be populated in order to post a
            // status update.
            handlePendingAction();
        }
    });

    profilePictureView = (ProfilePictureView) findViewById(R.id.profilePicture);
    greeting = (TextView) findViewById(R.id.greeting);

    postStatusUpdateButton = (Button) findViewById(R.id.postStatusUpdateButton);
    postStatusUpdateButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            onClickPostStatusUpdate();
        }
    });

    postPhotoButton = (Button) findViewById(R.id.postPhotoButton);
    postPhotoButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            onClickPostPhoto();
        }
    });

    pickFriendsButton = (Button) findViewById(R.id.pickFriendsButton);
    pickFriendsButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            onClickPickFriends();
        }
    });

    pickPlaceButton = (Button) findViewById(R.id.pickPlaceButton);
    pickPlaceButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            onClickPickPlace();
        }
    });

    controlsContainer = (ViewGroup) findViewById(R.id.main_ui_container);

    final FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = fm.findFragmentById(R.id.fragment_container);
    if (fragment != null) {
        // If we're being re-created and have a fragment, we need to a) hide the main UI controls and
        // b) hook up its listeners again.
        controlsContainer.setVisibility(View.GONE);
        if (fragment instanceof FriendPickerFragment) {
            setFriendPickerListeners((FriendPickerFragment) fragment);
        } else if (fragment instanceof PlacePickerFragment) {
            setPlacePickerListeners((PlacePickerFragment) fragment);
        }
    }

    // Listen for changes in the back stack so we know if a fragment got popped off because the user
    // clicked the back button.
    fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (fm.getBackStackEntryCount() == 0) {
                // We need to re-show our UI.
                controlsContainer.setVisibility(View.VISIBLE);
            }
        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    uiHelper.onResume();

    updateUI();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);

    outState.putString(PENDING_ACTION_BUNDLE_KEY, pendingAction.name());
}

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

@Override
public void onPause() {
    super.onPause();
    uiHelper.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (pendingAction != PendingAction.NONE &&
            (exception instanceof FacebookOperationCanceledException ||
            exception instanceof FacebookAuthorizationException)) {
            new AlertDialog.Builder(HelloFacebookSampleActivity.this)
                .setTitle(R.string.cancelled)
                .setMessage(R.string.permission_not_granted)
                .setPositiveButton(R.string.ok, null)
                .show();
        pendingAction = PendingAction.NONE;
    } else if (state == SessionState.OPENED_TOKEN_UPDATED) {
        handlePendingAction();
    }
    updateUI();
}

private void updateUI() {
    Session session = Session.getActiveSession();
    boolean enableButtons = (session != null && session.isOpened());

    postStatusUpdateButton.setEnabled(enableButtons);
    // postPhotoButton.setEnabled(enableButtons);
    pickFriendsButton.setEnabled(enableButtons);
    pickPlaceButton.setEnabled(enableButtons);

    if (enableButtons && user != null) {
        profilePictureView.setProfileId(user.getId());
        greeting.setText(getString(R.string.hello_user, user.getFirstName()));
    } else {
        profilePictureView.setProfileId(null);
        greeting.setText(null);
    }
}

@SuppressWarnings("incomplete-switch")
private void handlePendingAction() {
    PendingAction previouslyPendingAction = pendingAction;
    // These actions may re-set pendingAction if they are still pending, but we assume they
    // will succeed.
    pendingAction = PendingAction.NONE;

    switch (previouslyPendingAction) {
        case POST_PHOTO:
            postPhoto();
            break;
        case POST_STATUS_UPDATE:
            postStatusUpdate();
            break;
    }
}

private interface GraphObjectWithId extends GraphObject {
    String getId();
}

private void showPublishResult(String message, GraphObject result, FacebookRequestError error) {
    String title = null;
    String alertMessage = null;
    if (error == null) {
        title = getString(R.string.success);
        String id = result.cast(GraphObjectWithId.class).getId();
        alertMessage = getString(R.string.successfully_posted_post, message, id);
    } else {
        title = getString(R.string.error);
        alertMessage = error.getErrorMessage();
    }

    new AlertDialog.Builder(this)
            .setTitle(title)
            .setMessage(alertMessage)
            .setPositiveButton(R.string.ok, null)
            .show();
}

private void onClickPostStatusUpdate() {
    performPublish(PendingAction.POST_STATUS_UPDATE);
}

private void postStatusUpdate() {
    if (user != null && hasPublishPermission()) {
        final String message = getString(R.string.status_update, user.getFirstName(), (new Date().toString()));
        Request request = Request
                .newStatusUpdateRequest(Session.getActiveSession(), message, new Request.Callback() {
                    @Override
                    public void onCompleted(Response response) {
                        showPublishResult(message, response.getGraphObject(), response.getError());
                    }
                });
        request.executeAsync();
    } else {
        pendingAction = PendingAction.POST_STATUS_UPDATE;
    }
}

private void onClickPostPhoto() {
    performPublish(PendingAction.POST_PHOTO);
}

private void postPhoto() {
    if (hasPublishPermission()) {
        Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);
        Request request = Request.newUploadPhotoRequest(Session.getActiveSession(), image, new Request.Callback() {
            @Override
            public void onCompleted(Response response) {
                showPublishResult(getString(R.string.photo_post), response.getGraphObject(), response.getError());
            }
        });
        request.executeAsync();
    } else {
        pendingAction = PendingAction.POST_PHOTO;
    }
}

private void showPickerFragment(PickerFragment<?> fragment) {
    fragment.setOnErrorListener(new PickerFragment.OnErrorListener() {
        @Override
        public void onError(PickerFragment<?> pickerFragment, FacebookException error) {
            String text = getString(R.string.exception, error.getMessage());
            Toast toast = Toast.makeText(HelloFacebookSampleActivity.this, text, Toast.LENGTH_SHORT);
            toast.show();
        }
    });

    FragmentManager fm = getSupportFragmentManager();
    fm.beginTransaction()
            .replace(R.id.fragment_container, fragment)
            .addToBackStack(null)
            .commit();

    controlsContainer.setVisibility(View.GONE);

    // We want the fragment fully created so we can use it immediately.
    fm.executePendingTransactions();

    fragment.loadData(false);
}

private void onClickPickFriends() {
    final FriendPickerFragment fragment = new FriendPickerFragment();

    setFriendPickerListeners(fragment);

    showPickerFragment(fragment);
}

private void setFriendPickerListeners(final FriendPickerFragment fragment) {
    fragment.setOnDoneButtonClickedListener(new FriendPickerFragment.OnDoneButtonClickedListener() {
        @Override
        public void onDoneButtonClicked(PickerFragment<?> pickerFragment) {
            onFriendPickerDone(fragment);
        }
    });
}

private void onFriendPickerDone(FriendPickerFragment fragment) {
    FragmentManager fm = getSupportFragmentManager();
    fm.popBackStack();

    String results = "";

    Collection<GraphUser> selection = fragment.getSelection();
    if (selection != null && selection.size() > 0) {
        ArrayList<String> names = new ArrayList<String>();
        for (GraphUser user : selection) {
            names.add(user.getName());
        }
        results = TextUtils.join(", ", names);
    } else {
        results = getString(R.string.no_friends_selected);
    }

    showAlert(getString(R.string.you_picked), results);
}

private void onPlacePickerDone(PlacePickerFragment fragment) {
    FragmentManager fm = getSupportFragmentManager();
    fm.popBackStack();

    String result = "";

    GraphPlace selection = fragment.getSelection();
    if (selection != null) {
        result = selection.getName();
    } else {
        result = getString(R.string.no_place_selected);
    }

    showAlert(getString(R.string.you_picked), result);
}

private void onClickPickPlace() {
    final PlacePickerFragment fragment = new PlacePickerFragment();
    fragment.setLocation(SEATTLE_LOCATION);
    fragment.setTitleText(getString(R.string.pick_seattle_place));

    setPlacePickerListeners(fragment);

    showPickerFragment(fragment);
}

private void setPlacePickerListeners(final PlacePickerFragment fragment) {
    fragment.setOnDoneButtonClickedListener(new PlacePickerFragment.OnDoneButtonClickedListener() {
        @Override
        public void onDoneButtonClicked(PickerFragment<?> pickerFragment) {
            onPlacePickerDone(fragment);
        }
    });
    fragment.setOnSelectionChangedListener(new PlacePickerFragment.OnSelectionChangedListener() {
        @Override
        public void onSelectionChanged(PickerFragment<?> pickerFragment) {
            if (fragment.getSelection() != null) {
                onPlacePickerDone(fragment);
            }
        }
    });
}

private void showAlert(String title, String message) {
    new AlertDialog.Builder(this)
            .setTitle(title)
            .setMessage(message)
            .setPositiveButton(R.string.ok, null)
            .show();
}

private boolean hasPublishPermission() {
    Session session = Session.getActiveSession();
    return session != null && session.getPermissions().contains("publish_actions");
}

private void performPublish(PendingAction action) {
    Session session = Session.getActiveSession();
    if (session != null) {
        pendingAction = action;
        if (hasPublishPermission()) {
            // We can do the action right away.
            handlePendingAction();
        } else {
            // We need to get new permissions, then complete the action when we get called back.
            session.requestNewPublishPermissions(new Session.NewPermissionsRequest(this, PERMISSIONS));
        }
    }
}

}

但是当我点击我的登录按钮时,它会将我带到 facebook 的登录页面并返回到 Android 应用程序,但出现以下异常

09-22 01:48:20.859: E/AndroidRuntime(15874): FATAL EXCEPTION: main
09-22 01:48:20.859: E/AndroidRuntime(15874): java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that is not currently open.
09-22 01:48:20.859: E/AndroidRuntime(15874):    at com.facebook.Session.requestNewPermissions(Session.java:977)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at com.facebook.Session.requestNewPublishPermissions(Session.java:501)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at com.facebook.samples.hellofacebook.HelloFacebookSampleActivity.performPublish(HelloFacebookSampleActivity.java:436)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at com.facebook.samples.hellofacebook.HelloFacebookSampleActivity.onClickPostPhoto(HelloFacebookSampleActivity.java:292)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at com.facebook.samples.hellofacebook.HelloFacebookSampleActivity.access$5(HelloFacebookSampleActivity.java:291)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at com.facebook.samples.hellofacebook.HelloFacebookSampleActivity$5.onClick(HelloFacebookSampleActivity.java:117)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at android.view.View.performClick(View.java:4084)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at android.view.View$PerformClick.run(View.java:16966)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at android.os.Handler.handleCallback(Handler.java:615)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at android.os.Handler.dispatchMessage(Handler.java:92)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at android.os.Looper.loop(Looper.java:137)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at android.app.ActivityThread.main(ActivityThread.java:4745)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at java.lang.reflect.Method.invokeNative(Native Method)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at java.lang.reflect.Method.invoke(Method.java:511)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-22 01:48:20.859: E/AndroidRuntime(15874):    at dalvik.system.NativeStart.main(Native Method)
4

1 回答 1

0

此解决方案应该有效:

会话:尝试为具有待处理请求的会话请求新权限

我认为您正在尝试同时进行登录和共享操作。您应该等到登录操作完成并获得所需的权限。然后,您可以通过您的应用程序共享您的内容。希望这可以帮助。

...

您应该shareOnFacebook()在方法中调用onCompleted()方法。

于 2013-09-21T20:54:20.840 回答