一次请求获取阅读和发布权限

20

在你们都说不可能之前,打开Spotify应用并点击“使用Facebook登录”按钮。

我想知道他们是如何做到的,以及如何在一个请求中获取“publish_stream”和基本权限/电子邮件。

另外,如果我有上一个会话的某些信息(上一次使用应用程序的时间),是否可以使用Facebook SDK重新打开Facebook会话?

编辑 -下面是针对音乐广告的屏幕截图

Spotify magic


仅仅因为Spotify可以做到并不意味着该功能扩展到了所有其他应用程序。你知道还有哪些应用程序可以直接从FB打开第三方计算机应用程序吗? - Tommy Crush
你是在暗示Spotify正在利用Facebook来抵消其版权流媒体付款,而扎克伯格正在推广这种合作关系是因为他长期以来一直喜欢P2P流媒体服务吗?...那太疯狂了。 - baconcheese113
5个回答

20

你在Spotify看到的内容并不是通过publish_stream实现的,他们使用的是Open Graph

Open Graph概念涉及将应用程序的操作与FB活动帖子集成,并通过用户使用的应用程序与用户共享。 在上述链接中了解更多信息。


编辑说明查看Open Graph权限

示例活动:

public class MainActivity extends Activity implements StatusCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        OpenRequest open = new OpenRequest(this);
        open.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        open.setPermissions(Arrays.asList(new String[]{"email", "publish_actions", "user_birthday", "user_hometown"}));
        open.setCallback(this);
        Session s = new Session(this);
        s.openForPublish(open);
    }

    @Override
    public void call(Session session, SessionState state, Exception exception) {
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(Session.getActiveSession()!=null)
            Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }
}

如果用户未登录,此活动将显示以下内容:

输入图像描述


1
这是正确的答案。尝试添加publish_actions权限。我将编辑此答案并添加一个测试。 - Sherif elKhatib
我正在尝试使用单个请求完成与Pinterest类似的FB登录(带有电子邮件、基本信息和发布操作权限)。我已经实现了上述代码,但无法实现...请帮忙... - sanjay

1

在我的应用程序中,我创建了一个OpenRequest实例,并为其设置了权限。

Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) 
{
    Session session = new Session.Builder(context).build();
    Session.setActiveSession(session);
    currentSession = session;
}

if (currentSession.isOpened()) 
{
    //Do whatever u want. User has logged in
}
else if(!currentSession.isOpened())
{
    //Ask for username and password
    OpenRequest op = new Session.OpenRequest(context);

    op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
    op.setCallback(null);

    List<String> permissions = new ArrayList<String>();
    permissions.add("publish_stream");
    op.setPermissions(permissions);

    Session session = new Builder(InvitePartners.this).build();
    Session.setActiveSession(session);
    session.openForPublish(op);
}

这可能对你有用。

1
我只是在onCreate方法中单独设置它。
    LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
    authButton.setPublishPermissions("publish_actions");
    authButton.setFragment(this);
    Session.NewPermissionsRequest newPermissionsRequest = new 
            Session.NewPermissionsRequest(this, Arrays.asList("read_stream"));
    Session.getActiveSession().requestNewReadPermissions(newPermissionsRequest);

0

前往您的应用程序仪表板。然后点击编辑应用程序。现在在页面的左侧,您将看到权限。点击它。会出现一个新页面。找到用户和好友权限:框。在此处输入publish_actions。现在保存。

现在,从您的Android应用程序中,您可以通过仅登录一次来发布故事到Facebook。我的意思是,只需使用LoginButton登录,然后尝试发布一些内容。它应该可以工作。

让我知道发生了什么。


我的移动应用似乎无法正常工作。我尝试使用我自己的会话管理实现(在没有读取权限的情况下进行openSessionForPublish)以及Facebook SDK提供的工具(com.facebook.widget.LoginButton和设置阅读和发布权限),但两者都会抛出错误,称不能同时请求这两种权限。 - baconcheese113
然后它只会提示读取权限。openSessionForRead("app_id", "permission_list") - baconcheese113
你正在使用Facebook SDK 3.02吗?我已经使用3.02和LoginButton完成了这个。 - Shoshi
我在。他们和上面的页面一样吗? - baconcheese113

0

对于任何想了解我问题的第二部分的人:

要使用Facebook SDK重新打开Facebook会话,请使用以下代码

if(Session.openActiveSession(this) == null) { //Haven't logged in yet
    openSessionForRead(getString(R.string.app_id), Arrays.asList("email"));
}

Facebook 缓存了令牌。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接