6

チェックボックス(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()) {          
        ...                             
    }       
}
4

1 に答える 1

1

このようなチェックが必要になるたびに、ユーザーのアクセス許可を要求することになりました。

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();
}
于 2014-06-11T22:42:19.773 に答える