0

Facebook 統合アプリケーションを開発していますが、非常に奇妙な問題が発生しています。

通常どおりログインしますが、ログアウトしようとすると、SDK によって再度ログインが強制されます...

package com.machinarius.facebook;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.facebook.Request;
import com.facebook.Request.GraphUserCallback;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.Session.NewPermissionsRequest;
import com.facebook.Session.StatusCallback;
import com.facebook.SessionState;
import com.facebook.model.GraphUser;

public class MainActivity extends Activity implements StatusCallback, GraphUserCallback {
    private TextView statusText;
    private Button loginButton;
    private Boolean loggedIn;
    private Session actualSession;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        loggedIn = false;
        statusText = (TextView)findViewById(R.id.statusText);
        loginButton = (Button)findViewById(R.id.loginButton);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }

    public void toggleFacebookLogin(View source) {
        if(!loggedIn) {
            actualSession = Session.openActiveSession(this, true, this);
        }
        else 
            if(actualSession == null)
                return;
            else {
                actualSession.close();
                statusText.setText("Please login");
                loggedIn = false;
            }
    }

    @Override
    public void call(Session session, SessionState state, Exception exception) {
        if(state.equals(SessionState.OPENED)) {
            loggedIn = true;
            List<String> permissions = getNewPermissions(actualSession.getPermissions(), 
                    new LinkedList<String>(Arrays.asList("user_about_me", "user_birthday", "user_hometown", "user_relationships", "user_location", "user_relationships", "email")));
            Session.NewPermissionsRequest permissionsRequest = new NewPermissionsRequest(this, permissions);
            actualSession.requestNewReadPermissions(permissionsRequest);
            populateInterface();
        } else {
            loggedIn = false;
        }
    }

    private void populateInterface() {
        Request.executeMeRequestAsync(Session.getActiveSession(), this);
    }

    @Override
    public void onCompleted(GraphUser user, Response response) {
        if(response.getError() != null) {
            statusText.setText("There was an error fetching your info");
            Log.e(getClass().getName(), response.getError().toString());
            return;
        }
        if(user != null) {
            statusText.setText("Hello " + user.getName() + "\n"
                    + "Your user ID is " + user.getId() + "\n"
                    + "Your birthday is " + user.getBirthday());
            loginButton.setText("Log out");
        } else {
            statusText.setText("There was an error fetching your info");
        }
    }

    private List<String> getNewPermissions(List<String> actualPermissions, List<String> desiredPermissions) {
        ArrayList<String> permissionsGranted = new ArrayList<String>();
        for(String nPermission : desiredPermissions)
            for(String aPermission : actualPermissions)
                if(nPermission.equals(aPermission))
                    permissionsGranted.add(nPermission);
        for(String gPermission : permissionsGranted)
            desiredPermissions.remove(gPermission);
        return desiredPermissions;
    }
}

toggleFacebookLogin は、loginButton の XML onClick ハンドラによって呼び出されます。

もう 1 つの質問として、アクセス許可要求を session.open 呼び出しに統合して、ユーザーに Facebook ダイアログを 2 回表示する必要がないようにするにはどうすればよいですか?

4

1 に答える 1

4

ここでの問題は、あなたがチェックしているだけだということです

state.equals(SessionState.OPENED)

callではなく、あなたの方法で

state.isOpened()

そのため、追加のアクセス許可を要求すると、状態は実際には OPENED_TOKEN_UPDATED に遷移し、loggedIn 状態は false になります (true である必要があります)。したがって、ボタンをクリックすると、loggedIn 状態が正しくないため、openActiveSession が再度呼び出されます。確認に切り替えるとstate.isOpened()、問題が解決するはずです。

2 番目の質問に答えるには、読み取りアクセス許可のみを要求しているため、セッションを開いたときにそれらを一度にすべて要求できます (一方、publish_stream などの公開アクセス許可も要求したい場合は、要求を分離する必要があります)。 )。一度にすべてを行うには、Session.openActiveSession(this, true, this)次のようなものに置き換える必要があります。

Session actualSession = new Session(this);
Session.setActiveSession(actualSession);
actualSession.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("some", "read", "permissions")).setCallback(this));

注:上記は私の頭の上で書いたので、構文エラーがあるかもしれません.

于 2013-01-17T17:51:47.613 に答える