撤销单独的权限之后更新会话 [英] Updating Session after revoking individual permissions

查看:112
本文介绍了撤销单独的权限之后更新会话的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想给用户一个选项来设置/通过复选框(Facebook的SDK为Android)撤销出版许可。 code如下。一切正常,除了撤销code负责检查发布权限失败后草草收场。

据我了解,会议还没有办法知道用户是否已撤销的任何权限loggin后的,什么是正确的方式来处理这种情况?我一定要手动查询可用权限,或者是有没有办法实现无缝重建会话基本权限?

 公开查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
    ...
    publishCheckbox =(复选框)view.findViewById(R.id.publishCheckbox);
        publishCheckbox.setOnClickListener(新View.OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                复选框CHB =(复选框)V;
                如果(chb.isChecked()&安培;&安培; checkForPublishPermission()==假){
                    requestPublishPermissions();
                }
                其他{
                    removePublishPermissions();
                }

            }

        });
    ...
}

私人无效requestPublishPermissions(){
    会话会话= Session.getActiveSession();
    如果(会话= NULL和放大器;!&安培; session.isOpened()){
        Session.NewPermissionsRequest newPermissionsRequest =新Session.NewPermissionsRequest(本,权限).setRequest code(REAUTH_ACTIVITY_ code);
        newPermissionsRequest.setCallback(回调);
        session.requestNewPublishPermissions(newPermissionsRequest);
    }
}

私人无效removePublishPermissions(){
    请求R =新的请求(Session.getActiveSession(),PUBLISH_ACTIONS_PERMISSION_PATH,空,HttpMethod.DELETE);
    r.setCallback(新Request.Callback(){

        @覆盖
        公共无效onCompleted(响应响应){
            publishCheckbox.setEnabled(真正的);
        }
    });
    r.executeAsync();
    publishCheckbox.setEnabled(假);
}

私人布尔checkForPublishPermission(){
    布尔结果= FALSE;

    会话会话= Session.getActiveSession();

    如果(会话== NULL ||!session.isOpened()){
        结果= FALSE;
    }
    其他{
        名单<字符串>权限= session.getPermissions();
        如果(permissions.containsAll(权限)){
            结果=真;
        }
    }

    返回(结果);
}

私人无效onSessionStateChange(会话的会话,SessionState会状态,例外的例外){
    如果(state.isOpened()){
        ...
        publishCheckbox.setChecked(checkForPublishPermission());
        ...
    }否则如果(state.isClosed()){
        ...
    }
}
 

解决方案

嗯,我结束了我需要这样的检查每次请求的用户权限,沿着这些路线的东西:

 私人无效checkForPublishPermission(){
    mPublishCheckbox.setEnabled(假);
    请求R =新的请求(Session.getActiveSession(),PUBLISH_ACTIONS_PERMISSION_PATH,空,HttpMethod.GET);
    r.setCallback(新Request.Callback(){

        @覆盖
        公共无效onCompleted(响应响应){
            如果(响应!= NULL){
                GraphObject O = response.getGraphObject();
                    如果(O!= NULL){
                        JSONArray数据= o.getInnerJSONObject()optJSONArray(数据)。
                        mCanPublish =(data.optJSONObject(0)。先后(publish_actions))真的?假的;
                        mPublishCheckbox.setChecked(mCanPublish);
                    }
            }
            mPublishCheckbox.setEnabled(真正的);
        }
    });
    r.executeAsync();
}
 

I'm trying to give users an option to set/revoke publishing permission via checkbox (Facebook SDK for Android). Code is provided below. Everything works fine except that after revoking the code responsible for checking publishing permissions fails miserably.

I understand that Session has no way of knowing if user has revoked any permissions after loggin in. What is the correct way to handle this kind of situation? Do I have to query available permissions manually, or is there a way to seamlessly recreate session with basic permissions?

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ...
    publishCheckbox = (CheckBox) view.findViewById(R.id.publishCheckbox);
        publishCheckbox.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                CheckBox chb = (CheckBox) v;
                if (chb.isChecked() && checkForPublishPermission() == false){
                    requestPublishPermissions();                            
                }
                else{
                    removePublishPermissions();
                }   

            }

        });
    ...
}

private void requestPublishPermissions() {
    Session session = Session.getActiveSession();
    if ( session!= null && session.isOpened()){
        Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS).setRequestCode(REAUTH_ACTIVITY_CODE);
        newPermissionsRequest.setCallback(callback);
        session.requestNewPublishPermissions(newPermissionsRequest);
    }               
}   

private void removePublishPermissions() {       
    Request r = new Request(Session.getActiveSession(), PUBLISH_ACTIONS_PERMISSION_PATH, null, HttpMethod.DELETE);
    r.setCallback(new Request.Callback() {

        @Override
        public void onCompleted(Response response) {
            publishCheckbox.setEnabled(true);                               
        }
    });
    r.executeAsync();
    publishCheckbox.setEnabled(false);
}

private boolean checkForPublishPermission(){
    boolean result = false;

    Session session = Session.getActiveSession();

    if (session == null || !session.isOpened()) {
        result = false;
    }
    else{
        List<String> permissions = session.getPermissions();
        if (permissions.containsAll(PERMISSIONS)) {
            result = true;
        }
    }       

    return(result);
}   

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) { 
        ...
        publishCheckbox.setChecked(checkForPublishPermission());
        ...
    } else if (state.isClosed()) {          
        ...                             
    }       
}

解决方案

Well I ended up requesting user permissions each time I needed such a check, something along these lines:

private void checkForPublishPermission(){
    mPublishCheckbox.setEnabled(false);
    Request r = new Request(Session.getActiveSession(), PUBLISH_ACTIONS_PERMISSION_PATH, null, HttpMethod.GET);
    r.setCallback(new Request.Callback() {

        @Override
        public void onCompleted(Response response) {
            if (response != null) {
                GraphObject o = response.getGraphObject();              
                    if ( o != null){
                        JSONArray data = o.getInnerJSONObject().optJSONArray("data");                       
                        mCanPublish = (data.optJSONObject(0).has("publish_actions"))?true:false;                            
                        mPublishCheckbox.setChecked(mCanPublish);                                                       
                    }
            }
            mPublishCheckbox.setEnabled(true);
        }
    });
    r.executeAsync();
}

这篇关于撤销单独的权限之后更新会话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆