我在整合新的Facebook SDK 3.0 for Android的Feed对话框时遇到问题。文档非常清楚如何做到这一点,但省略了一个非常重要的案例,只提到它几乎不会发生。
Facebook Feed Dialog Documentation
当用户想要发布内容时,就是这种情况,但他尚未登录,并且没有会话和访问令牌。
SDK提供了一种在旧的Facebook对象中设置访问令牌(和整个会话)的方法,但是在用户登录并通过Feed发布其Feed后,我找不到获取会话或访问令牌的方法对话框。
所以流程是:
facebook.dialog()
并显示登录对话框我的问题是,如何在步骤5中获取访问令牌(在某处确保创建)并在我的程序中使用它来创建有效的SDK 3.0 Session对象,以便用户可以使用Access进行有效的Session使用facebook对话框后的令牌?
---编辑---
我只是想澄清一下,当手机上没有安装原生Facebook应用程序时 - 因此我想使用webview对话框。
答案 0 :(得分:6)
如果在Facebook类上设置已打开的会话,则dialog()不应提示用户登录。
以下是一个例子:
public class MainActivity extends Activity {
boolean pendingShare;
Session session;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (savedInstanceState != null) {
pendingShare = savedInstanceState.getBoolean("pendingShare");
session = Session.restoreSession(this, null, new SessionCallback(), savedInstanceState);
}
((Button) findViewById(R.id.share_button)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onClickShare();
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("pendingShare", pendingShare);
Session.saveSession(session, outState);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (session != null) {
session.onActivityResult(this, requestCode, resultCode, data);
}
}
private void onClickShare() {
pendingShare = true;
session = new Session(MainActivity.this);
session.openForRead(new Session.OpenRequest(MainActivity.this).setCallback(new SessionCallback()));
}
private void share(Session session) {
Facebook facebook = new Facebook(session.getApplicationId());
facebook.setSession(session);
facebook.dialog(this, "feed", null);
pendingShare = false;
}
class SessionCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (state.isOpened() && pendingShare) {
share(session);
}
}
}
}
保存/恢复“pendingShare”(和会话)在这里非常有用,因为您可以在登录期间卸载Activity,这会记住在重新加载MainActivity时触发dialog()调用。