Android – Facebook SDK 3 – Comment se connecter par programmation sans LoginButton

J’écris une application qui s’intègre avec Facebook SDK, pour partager du contenu (chaîne) sous la forme d’un message mural. Maintenant, j’ai fait le travail HelloFacebookSample. Cependant, il utilise son LoginButton pour connecter l’utilisateur.

Je ne veux pas ça. Tout ce que je veux faire est de cliquer sur mon bouton de partage dans la barre d’actions et de le partager avec Facebook. Par conséquent, je veux me connecter par programmation, j’ai essayé d’émuler ce que fait LoginButton, mais sans succès jusqu’à présent. Je reçois

12-06 15: 34: 33.180: E / AndroidRuntime (19493): java.lang.UnsupportedOperationException: Session: une tentative de nouvelle autorisation d’une session ayant une demande en attente a été effectuée.

la classe publique MainActivity étend FacebookActivity {

@SuppressWarnings("serial") private static final List PERMISSIONS = new ArrayList() { { 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 { Ssortingng getId(); } private void showPublishResult(Ssortingng message, GraphObject result, FacebookRequestError error) { Ssortingng title = null; Ssortingng alertMessage = null; if (error == null) { title = getSsortingng(R.ssortingng.success); Ssortingng id = result.cast(GraphObjectWithId.class).getId(); alertMessage = getSsortingng(R.ssortingng.successfully_posted_post, message, id); } else { title = getSsortingng(R.ssortingng.error); alertMessage = error.getErrorMessage(); } AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(title).setMessage(alertMessage).setPositiveButton(getSsortingng(R.ssortingng.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 Ssortingng message = getSsortingng(R.ssortingng.status_update, // user.getFirstName(), (new Date().toSsortingng())); final Ssortingng 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); } 

}

Eh bien, c’est toujours le projet HelloFacebookSample qui essaie de plier dans le bon sens. La seule chose avec laquelle j’ai joué est la méthode performPublish, avec la création de la session.

J’espère qu’il y a un moyen plus facile que ça! PS: j’utilise Facebook SDK 3

Est-ce que vous avez posté toute votre activité?

Vous devez également remplacer onActivityResult et transmettre les valeurs à Session.getActiveSession (). OnActivityResult (…). Sinon, la session ne saura pas que l’utilisateur a autorisé votre application, et c’est pourquoi vous voyez l’erreur (Session pense qu’il y a toujours une demande d’authentification en attente, c’est pourquoi vous ne pouvez pas réautoriser la publication).

Comme j’avais le même sentiment que beaucoup de ceux qui ont voté le commentaire de @ Beppi sur @Ming Li, et depuis que j’utilise Facebook SDK dans mes applications, j’ai décidé de créer un niveau d’API plus simplifié basé sur le dernier SDK 3.0.b de Facebook.

La bibliothèque open source: android-simple-facebook
https://github.com/sromku/android-simple-facebook

A votre question: How to login programatically?

  1. Définir un écouteur de connexion / déconnexion

     // set login / logout listener OnLoginOutListener onLoginOutListener = new SimpleFacebook.OnLoginOutListener() { @Override public void onFail() { Log.w(TAG, "Failed to login"); } @Override public void onException(Throwable throwable) { Log.e(TAG, "Bad thing happened", throwable); } @Override public void onThinking() { // show progress bar or something to the user while login is happening Log.i(TAG, "In progress"); } @Override public void onLogout() { // change the state of the button or do whatever you want Log.i(TAG, "Logged out"); } @Override public void onLogin() { // change the state of the button or do whatever you want Log.i(TAG, "Logged in"); } }; // set the listener mSimpleFacebook.setLogInOutListener(onLoginOutListener); 
  2. En cliquant sur n’importe quelle vue, il suffit d’appeler la méthode login(Activity)

     mSimpleFacebook.login(MainActivity.this); 

  3. Pour déconnecter la méthode d’appel logout() Comme ça:

     mSimpleFacebook.logout(); 

Comment définir des permissions avant la connexion, voir l’explication très conviviale ici .

J’espère que cela pourrait être utile à quelqu’un 🙂

Super morceau de code, merci.

Veuillez noter qu’avec la version v3 SDK, le code de réautorisation doit être remplacé par:

 Session.NewPermissionsRequest reauthRequest = new Session.NewPermissionsRequest(FacebookActivity.this, PERMISSIONS) .setRequestCode(REAUTHORIZE_ACTIVITY) .setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); session.requestNewPublishPermissions(reauthRequest);