5

新しい Facebook SDK 3.0 を Android アプリに実装しようとしていますが、問題が発生しました。私が抱えている問題は、ユーザーが既にログインしており、読み取り権限がある場合でも、発行 (「post_to_wall」) 権限を与えるために再度ログインするように求められることです。これは、ユーザーが FB アプリケーションをインストールしていない場合にのみ発生します。彼が FB アプリケーションをインストールしている場合、権限を付与するよう求められるだけです。

これがログインの実装方法です。

public void login(Activity activity) {
    Session session = Session.getActiveSession();

    if (session == null || !session.isOpened()) {
        openActiveSession(activity, true, sessionStatusCallback);
    }
}

private Session openActiveSession(final Activity activity, final boolean allowLoginUI, final StatusCallback callback) {
    return openActiveSession(activity, allowLoginUI, new OpenRequest(activity).setCallback(callback));
}

private Session openActiveSession(final Context context, final boolean allowLoginUI, final OpenRequest openRequest) {
    Session session = new Builder(context).setApplicationId(FACEBOOK_APPLICATION_ID).build();
    if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) {
        Session.setActiveSession(session);
        session.openForRead(openRequest);
        return session;
    }
    return null;
}

これは、コールバックの呼び出しメソッドです。

public void call(final Session session, final SessionState state, final Exception exception) {
    if (session.isOpened()) {
        if (state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
            // code if new permissions have been granted
        } else {
            // code for login
        }
    } else if (session.isClosed()) {
            // code for user canceled login
        } else if (exception != null) {
            // code if there were errors during login 
        }
    }
}

これは、ログインを呼び出すアクティビティの onActivityResult メソッドに追加したコードです。

Session.getActiveSession().onActivityResult(activity, requestCode, resultCode, data);

そして、これが私が新しい許可を求める方法です:

Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {    
    if (DONT_HAVE_PERMISSIONS) {
        Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity,
                            FACEBOOK_PERMISSIONS).setRequestCode(FACEBOOK_AUTHORIZE_ACTIVITY_CODE);
        session.requestNewPublishPermissions(newPermissionsRequest);
    }
}

私はこの問題についてもっと調べようとしましたが、これが意図されたものであるといういくつかのヒントしか見つけられませんでしたが、具体的なものは何も見つかりませんでした.

これはデフォルトの動作ですか? もしそうなら、それを回避する方法はありますか?それとも、何か間違ったことをしたのでしょうか?

助けてくれてありがとう。

4

2 に答える 2

0

Facebookのソースコードを見ると、ログインクラスとアクセス許可クラスの両方が同じAuthorizationRequestクラスから派生しているため、アクセス許可を直接取得しようとすることが可能であると思います.AuthorizationRequestクラスは、実際にすべての作業と同様にすべての作業を行います. Session.NewPermissionsRequest クラスは、いくつかのプライベート メソッドを作成し、AuthorizationRequest クラスでパブリックにするだけです。AuthorizationRequest に直接アクセスできるようにすることもできます。新しい facebook API には "OnFailed/OnSuccess" コールバックの形式がないように見えるため、最終的に facebook を起動するという目標 (ログイン、アクセス許可、友達リストの取得など) を記憶するステート マシンが必要になります。私がいるステップ。

私が言ったことを試していません。もしそうなら、私は答えを更新します。ログインせずに Session.NewPermissionsRequest を直接起動するだけでうまくいく場合は、お知らせください。

アップデート

上記で説明したように、資格情報を一度だけ要求するだけで機能しました。

  1. src/com/facebook/Sessions.java に移動
  2. 862行目で見つけることができます

    private static Session openActiveSession(Context context, boolean allowLoginUI, OpenRequest openRequest)
    
  3. それをパブリック関数にして保存します。

Session.NewPermissionsRequest オブジェクトを作成する代わりに。セッションを作成します。

        permisions = new ArrayList<String>();
        permisions.add("user_photos");
        permisions.add("friends_photos");
        Session.NewPermissionsRequest request = new Session.NewPermissionsRequest(
                activity, permisions);
        request.setCallback(helper);

        if (Session.getActiveSession() != null)
            Session.getActiveSession().requestNewReadPermissions(request);
        else {
            Session.OpenRequest orequest = new Session.OpenRequest(activity);
            orequest.setPermissions(permisions);
            orequest.setCallback(helper);
                            // its now public so you can call it
            Session.openActiveSession(act, true, request);
        }

1 つの重要な理由から、コールバックを必ず設定してください。

@Override
public void call(Session session, SessionState state, Exception exception) {
    if (state.isClosed()) {
                    // we are doing unofficial stuff so we loose guarantees.
                    // Set the active session to null if we logout or user cancels
                    // logging in. If you don't do this, the second time it will result
                    // in a crash.
        Session.setActiveSession(null);
    }
}

これで、すべての権限を直接要求し、一度にログインできるようになります。

于 2013-02-06T23:24:12.650 に答える