Android 取消个人权限后更新会话

Android 取消个人权限后更新会话,android,session,facebook-android-sdk,Android,Session,Facebook Android Sdk,我试图给用户一个通过复选框(Facebook SDK for Android)设置/撤销发布权限的选项。代码如下所示。一切正常,只是在撤销负责检查发布权限的代码后失败得很惨 我知道会话无法知道用户在登录后是否已撤销任何权限。处理这种情况的正确方法是什么?我是否必须手动查询可用的权限,或者是否有方法使用基本权限无缝地重新创建会话 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedIn

我试图给用户一个通过复选框(Facebook SDK for Android)设置/撤销发布权限的选项。代码如下所示。一切正常,只是在撤销负责检查发布权限的代码后失败得很惨

我知道会话无法知道用户在登录后是否已撤销任何权限。处理这种情况的正确方法是什么?我是否必须手动查询可用的权限,或者是否有方法使用基本权限无缝地重新创建会话

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()) {          
        ...                             
    }       
}
创建视图时的公共视图(布局、充气机、视图组容器、捆绑包保存状态){ ... publishCheckbox=(复选框)view.findViewById(R.id.publishCheckbox); publishCheckbox.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ 复选框chb=(复选框)v; if(chb.isChecked()&&checkForPublishPermission()==false){ requestPublishPermissions(); } 否则{ removePublishPermissions(); } } }); ... } 私有void requestPublishPermissions(){ Session=Session.getActiveSession(); if(session!=null&&session.isOpened()){ Session.NewPermissionsRequest NewPermissionsRequest=newsession.NewPermissionsRequest(这个,PERMISSIONS.setRequestCode)(重新授权活动代码); newPermissionsRequest.setCallback(回调); session.requestNewPublishPermissions(newPermissionsRequest); } } 私有void removePublishPermissions(){ 请求r=新请求(Session.getActiveSession(),发布\操作\权限\路径,null,HttpMethod.DELETE); r、 setCallback(newrequest.Callback(){ @凌驾 未完成公共无效(响应){ publishCheckbox.setEnabled(true); } }); r、 executeAsync(); publishCheckbox.setEnabled(false); } 私有布尔值checkForPublishPermission(){ 布尔结果=假; Session=Session.getActiveSession(); if(session==null | |!session.isOpened()){ 结果=假; } 否则{ List permissions=session.getPermissions(); if(权限.containsAll(权限)){ 结果=真; } } 返回(结果); } private void OnSessionState更改(会话、会话状态、异常){ 如果(state.isOpened()){ ... setChecked(checkForPublishPermission()); ... }如果(state.isClosed()){ ... } }
每次需要这样的检查时,我都会请求用户权限,大致如下:

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();
}

我也在等待答复。如果用户从其在线帐户会话中删除整个应用程序,请识别它,然后您将注销。但是如果用户只是删除了一个权限,会话将不会更新他的权限。