Android – Facebook SDK 3 – 如何在没有LoginButton的情况下以编程方式login

我正在编写一个与Facebook SDK集成的应用程序,以共享一些(string)内容作为墙贴。 现在,我做了HelloFacebookSample的工作。 但是它使用他们的LoginButton来login用户。

我不要那个。 我想要做的就是点击操作栏中的我的分享button,并将其分享到Facebook。 因此,我想以编程方式login,我试图模拟LoginButton做什么,但目前为止没有成功。 我明白了

12-06 15:34:33.180:E / AndroidRuntime(19493):java.lang.UnsupportedOperationException:会话:尝试重新授权具有未决请求的会话。

公共类MainActivity扩展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); } 

}

那么,这仍然是我试图弯曲正确的方式的HelloFacebookSample项目。 我唯一玩过的是performPublish方法,创build会话的东西

希望有一个更简单的方法寿! PS: 我正在使用Facebook SDK 3

是你发布你的整个活动?

您还需要重写onActivityResult,并将值传递给Session.getActiveSession()。onActivityResult(…)。 否则,会话将不知道用户授权您的应用程序,这就是为什么你看到错误(Session认为仍然有一个挂起的authentication请求,这就是为什么你不能重新授权发布)。

因为我有同样的感受,在这里,@ Beppi对@Ming Li的回答给出了评论,而且由于我在我的应用程序中使用了Facebook SDK,所以我决定创build更加简化的基于最新Facebook SDK 3.0.b的API级别。

开源库: android-simple-facebook
https://github.com/sromku/android-simple-facebook

对你的问题: How to login programatically?

  1. 设置login/注销监听器

     // 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. 点击任何视图,只需调用login(Activity)方法即可

     mSimpleFacebook.login(MainActivity.this); 

  3. 注销呼叫logout()方法。 喜欢这个:

     mSimpleFacebook.logout(); 

如何在login前设置权限,这里看到非常友好的解释。

希望它可以对某人有所帮助:)

伟大的一段代码,谢谢。

请注意,对于v3 SDK版本,重新授权代码必须replace为:

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