【问题标题】:how can i get two permissions sequentially?我怎样才能顺序获得两个权限?
【发布时间】:2012-12-26 08:11:42
【问题描述】:

我正在使用新的 facebook SDK 3.0 开发 android 应用程序。 我知道 facebook 的政策是我不能同时请求两个权限,也不能在登录按钮上请求写入权限(publish_stream、publish_acition..etc)。

所以,我的问题是,如何在用户单击日志按钮后自动请求“publish_stream”权限?

在我下面的源代码中,

private void onSessionStateChange(Session session, SessionState state, Exception exception) {

    if (state.isOpened()) {

        if (pendingPublishReauthorization &&   state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
            pendingPublishReauthorization = false;
            publishFeed(userName);
        }

        m_pd.show();
        Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

            @Override
            public void onCompleted(GraphUser user, Response response) {
                if (user != null) {

                    String username=buildUserInfoDisplay(user);
                    userName=username;
                    saveAccount(username, "facebook");

                    Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "login success");
                    publishFeed(userName);
                    m_pd.dismiss();

                    //Activity GetActivity=getActivity();
                    //if(GetActivity != null) GetActivity.finish();


                }
            }
        });

    } else if (state.isClosed()) {
        Log.i(com.dress.folio.Constants.FACEBOOK_TAG, "Logged out..." + exception);
    }
}

当用户单击登录按钮时,会调用 onSessionStateChange()。所以我尝试在 Request.executeMeRequestAsync(session, new Request.GraphUserCallback() 之后使用 'publishFeed()' 请求 'publish_stream'。

Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
            @Override
            public void onCompleted(GraphUser user, Response response) {
                if (user != null) {

                    String username=buildUserInfoDisplay(user);
                    userName=username;
                    saveAccount(username, "facebook");

                    Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "login success");
                    publishFeed(userName);
                    m_pd.dismiss();

                    //Activity GetActivity=getActivity();
                    //if(GetActivity != null) GetActivity.finish();

                }
            }
        });

publishFeed() 就像:

private void publishFeed(String username) {
    Session session = Session.getActiveSession();
    SessionState state= session.getState();

    if (session != null){
        Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "in publishstory(): "+ state);
        // Check for publish permissions    
        List<String> permissions = session.getPermissions();
        if (!isSubsetOf(PERMISSIONS, permissions) ) {

            pendingPublishReauthorization = true;
            if(state == SessionState.OPENED_TOKEN_UPDATED) {
                Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "in publishstory() if : OPENED_TOKEN_UPDATED" );
                Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS);
                session.requestNewPublishPermissions(newPermissionsRequest);
            }

            return;
        }

        Bundle postParams = new Bundle();
        postParams.putString("name", username + " is logged in");
        // postParams.putString("caption", "Build great social apps and get more installs.");
        postParams.putString("description", "get the dress!!");
        postParams.putString("link", "https://www.facebook.com/pages/Dressfolio/183665935091337"); //dressfolio facebook page address
        postParams.putString("picture", "https://MY_APPLICATION.com/asset/facebook/app1/thumb2.png"); //thumbnail


        Request.Callback callback= new Request.Callback() {
            public void onCompleted(Response response) {
                Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "callback()" );

                FacebookRequestError error = response.getError();
                if (error != null) {
                    Log.d(com.dress.folio.Constants.FACEBOOK_TAG,"news feed error!" + error.toString());    
                } 
                else {
                    Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "News Feed Posting success()" );
                }
            }
        };

        Request request = new Request(session, "me/feed", postParams, 
                HttpMethod.POST, callback);

        RequestAsyncTask task = new RequestAsyncTask(request);
        task.execute(); 


    }


}

但这总是不起作用,因为 Sessionstate 不处于“OPENED_TOKEN_UPDATED”状态。 我该怎么做?

【问题讨论】:

    标签: android facebook permissions


    【解决方案1】:

    您一次可以请求多个权限,只是不能在同一个请求中混合 READ 和 PUBLISH 权限。

    对于您的具体问题,这是因为您正在检查 SessionState.OPENED_TOKEN_UPDATED,而当会话首次打开时,它处于 SessionState.OPENED 状态。只有当您请求额外的权限时,它才会转换到 OPENED_TOKEN_UPDATED 状态。

    【讨论】:

    • 基本上,我注意到只有“opened”和“opened_token_updated”状态被调用。第一次授权时调用“opened”,而第二次授权或“使用不同的权限列表重新授权”时,调用“opened_token_updated”。是的,不要混合读写权限。他们是分开的
    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多