Facebook SDK 3.8:未返回权限 publish_actions

Posted

技术标签:

【中文标题】Facebook SDK 3.8:未返回权限 publish_actions【英文标题】:Facebook SDK 3.8 : permission publish_actions not returned 【发布时间】:2014-06-03 03:47:25 【问题描述】:

我正在关注 facebook (https://developers.facebook.com/docs/android/share) 的 facebook android 分享教程。该应用程序运行良好,我可以使用 facebook 登录并单击演示共享按钮。所以这是我的应用程序的过程:

    用脸书登录 facebook 会话对象得到更新,以下权限保存在会话对象中:user_likes, user_friends, user_status, basic_info 现在,我想分享一些东西。因此,用户单击共享按钮并请求额外的权限,称为publish_actions

以下代码执行此请求:

public class MainActivity extends Activity 

    private Button shareButton;
    private UiLifecycleHelper uiHelper;
    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
    private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
    private boolean pendingPublishReauthorization = false;

...
    private void publishStory() 
        Session session = Session.getActiveSession();
        if( session != null) 
            List<String> permissions = session.getPermissions();
            if(!isSubsetOf(PERMISSIONS, permissions)) 
                pendingPublishReauthorization = true;
                Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS);
//Request the new permission here. The answer is processed in onSessionStateChange() method
                session.requestNewPublishPermissions(newPermissionsRequest);
                return;
            

...

    private void onSessionStateChange(Session session, SessionState state, Exception exception) 
//since the session is already open we enter this if branch
        if (state.isOpened()) 
            shareButton.setVisibility(View.VISIBLE);
//The result of state.equals(SessionState.OPENED_TOKEN_UPDATED) is false which indicates that the session object has not been updated (as far as I understand the fb api)
            Log.e(TAG, "state.equals(SessionState.OPENED_TOKEN_UPDATED) = " + state.equals(SessionState.OPENED_TOKEN_UPDATED));
//Output all the current permission the session has (publish_actions is not included here)
            List<String> permissions = session.getPermissions();
            Iterator<String> it = permissions.iterator();
            Log.e(TAG, "Content of list:");
            while(it.hasNext())
                Log.e(TAG, "permission = " + it.next());
//Since the OPENED_TOKEN_UPDATED has not been updated nothing further happens here              
            if (pendingPublishReauthorization && state.equals(SessionState.OPENED_TOKEN_UPDATED)) 
                pendingPublishReauthorization = false;
                publishStory();
            
         else if (state.isClosed()) 
            shareButton.setVisibility(View.INVISIBLE);
        
    

因此,尽管这似乎是正确的,但肯定还有一些错误。未授予 publish_actions 权限,但我不明白为什么。只保留现有权限publish_actions

进一步说明:我读过一些问题,说应该出现一个额外的弹出窗口,要求用户授予权限。但是,在我的情况下不会发生这种情况。也许这就是问题所在?如果是这样,我必须做什么才能获得弹出窗口?

更新:我还尝试了来自 github 的以下要点:https://gist.github.com/vishalpawale/5556996 由于完全相同的原因,此示例代码失败。它没有获得任何 publish_action 权限。似乎是 Facebook SDK 中的实际错误?

【问题讨论】:

我不确定,但我现在正在尝试解决这个问题。显然 facebook 取消了通过 API 发布帖子的能力。你找到解决办法了吗? 我按照developers.facebook.com/docs/android/share 示例发布到用户墙。如果我使用应用程序开发人员电子邮件登录 Facebook,它工作正常。对于非开发人员,我没有获得权限......你也会发生同样的情况吗? 同样的问题,未授予 publish_action 权限。 同样的问题,现在有什么解决办法吗? 您好,检查我遇到的同一个问题并发布了问题***.com/q/23679083/1140237 【参考方案1】:

对于发布权限,您应该在应用设置中发送请求并发送以供审核,请参阅https://developers.facebook.com/docs/apps/review/

【讨论】:

【参考方案2】:

如果您在 4 月 30 日之后使用 Facebook sdk 3.14.x+,则 facebook 已更改应用程序测试和提交流程。发布有关权限相关的答案。检查this链接

【讨论】:

【参考方案3】:

我们在这里遇到了同样的问题。

尝试使用:

Session.getActiveSession().refreshPermissions();

这将刷新可用权限列表

List<String> permissions = session.getPermissions();

它仅适用于 Facebook 注册开发者用户或通过 Facebook 应用仪表板注册的测试用户。

这对我们有用。

【讨论】:

【参考方案4】:

它只返回读权限,不返回写权限。试试下面的sn-p

    final Bundle permBundle = new Bundle();
    permBundle.putCharSequence("permission", "publish_actions");
    GraphRequest request = new GraphRequest(
            AccessToken.getCurrentAccessToken(),
            "/me/permissions", permBundle, HttpMethod.GET,
            new GraphRequest.Callback() 
                @Override
                public void onCompleted(GraphResponse graphResponse) 
                    Log.d(TAG, "response2: " + graphResponse.getJSONObject());
                    try 
                        JSONArray permList = (JSONArray) graphResponse.getJSONObject().get("data");
                        if(permList.length() == 0)
                            // no data for perms, hence asking permission
                            askForFBPublishPerm();
                        else
                            JSONObject permData = (JSONObject) permList.get(0);
                            String permVal = (String) permData.get("status");
                            if(permVal.equals("granted"))
                                postToFB();
                            else
                                askForFBPublishPerm();
                            
                        
                     catch (JSONException e) 
                        Log.d(TAG, "exception while parsing fb check perm data" + e.toString());
                    

                
            
    );
    request.executeAsync();

【讨论】:

以上是关于Facebook SDK 3.8:未返回权限 publish_actions的主要内容,如果未能解决你的问题,请参考以下文章

IOS Facebook SDK:尽管授予权限,但登录不返回电子邮件

php sdk 的 Facebook 'redirect_uri' 参数未重定向到传递的 uri(仅重定向返回主页)

Facebook C# SDK 不返回所有信息

Facebook SDK 原生登录错误

Facebook SDK错误'必需'app_id“密钥未在配置中提供

更新 iOS 版 Facebook SDK