J'écris une application qui s'intègre au SDK de Facebook, pour partager un contenu (chaîne de caractères) comme un message sur le mur. Maintenant, j'ai fait fonctionner l'exemple HelloFacebookSample. Cependant, il utilise leur LoginButton pour connecter l'utilisateur.
Ce n'est pas ce que je veux. Tout ce que je veux faire, c'est cliquer sur mon bouton de partage dans la barre d'action et le partager sur Facebook. Je veux donc me connecter de manière programmatique, j'ai essayé d'émuler ce que fait le LoginButton mais sans succès jusqu'à présent. J'obtiens
12-06 15:34:33.180 : E/AndroidRuntime(19493) : java.lang.UnsupportedOperationException : Session : une tentative a été faite d'autoriser à nouveau une session dont la demande est en attente.
public class MainActivity extends FacebookActivity {
@SuppressWarnings("serial")
private static final List<String> PERMISSIONS = new ArrayList<String>() {
{
add("publish_actions");
}
};
private final int REAUTHORIZE_ACTIVITY = 3;
private Button postStatusUpdateButton;
private PendingAction pendingAction = PendingAction.NONE;
private enum PendingAction {
NONE, POST_PHOTO, POST_STATUS_UPDATE
}
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
postStatusUpdateButton = (Button) findViewById(R.id.postStatusUpdateButton);
postStatusUpdateButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Log.d("MainActivity", "onClick");
onClickPostStatusUpdate();
}
});
}
@Override
protected void onSessionStateChange(SessionState state, Exception exception) {
super.onSessionStateChange(state, exception);
}
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();
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title).setMessage(alertMessage).setPositiveButton(getString(R.string.ok), null);
builder.show();
}
private void onClickPostStatusUpdate() {
Log.d("MainActivity", "onClickPostStatusUpdate");
performPublish(PendingAction.POST_STATUS_UPDATE);
}
private boolean hasPublishPermission() {
Session session = Session.getActiveSession();
return session != null && session.getPermissions().contains("publish_actions");
}
private void performPublish(PendingAction action) {
Log.d("MainActivity", "peformPublish");
Session session = Session.getActiveSession();
if (session == null) {
session = new Session.Builder(this).setApplicationId("xxx").build();
Session.setActiveSession(session);
}
if (!session.isOpened()) {
Session.OpenRequest openRequest = new Session.OpenRequest(this);
openRequest.setPermissions(PERMISSIONS);
openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
session.openForPublish(openRequest);
}
if (session != null) {
// postStatusUpdate();
pendingAction = action;
if (hasPublishPermission()) {
// We can do the action right away.
handlePendingAction();
// postStatusUpdate();
} else {
// We need to reauthorize, then complete the action when we get
// called back.
Session.ReauthorizeRequest reauthRequest = new Session.ReauthorizeRequest(this, PERMISSIONS)
.setRequestCode(REAUTHORIZE_ACTIVITY).setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
session.reauthorizeForPublish(reauthRequest);
}
}
}
@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_STATUS_UPDATE:
postStatusUpdate();
break;
}
}
private void postStatusUpdate() {
// if (user != null && hasPublishPermission()) {
if (hasPublishPermission()) {
// final String message = getString(R.string.status_update,
// user.getFirstName(), (new Date().toString()));
final String message = "kks uz nemam nervy";
Request request = Request.newStatusUpdateRequest(Session.getActiveSession(), message,
new Request.Callback() {
@Override
public void onCompleted(Response response) {
showPublishResult(message, response.getGraphObject(), response.getError());
}
});
Request.executeBatchAsync(request);
} else {
pendingAction = PendingAction.POST_STATUS_UPDATE;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d("MainActivity", "onActivityResult");
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
}
Bon, il s'agit toujours du projet HelloFacebookSample que j'essaie de plier dans le bon sens. La seule chose avec laquelle j'ai joué est la méthode performPublish, des trucs avec la création de la session.
J'espère qu'il existe un moyen plus facile ! P.S. : J'utilise Facebook SDK 3
1 votes
J'ai le même problème, comment l'avez-vous résolu ?
0 votes
Notez que dans les versions récentes du SDK
Session.ReauthorizeRequest
n'existe plus. Vous pouvez trouver un exemple fonctionnel mis à jour basé sur ce code aquí