12

状態: ネイティブ Facebook apk がインストールされているがログアウトされている Android デバイス。

この条件が満たされ、ユーザーが Facebook のLoginButtonを使用して、または手動でログインしようとするたびに(以下を参照)、ログイン後、Facebook SDK は、ユーザーが既に許可を与えている場合でも、常にユーザー データへのアクセス許可を求めます。 .

アプリケーションに実装しているコードは次のとおりです。

バージョン 1 - ログイン ボタン:

XML:

<com.facebook.widget.LoginButton
    android:id="@+id/login_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

ジャワ:

private static final List<String> PERMISSIONS = Arrays.asList("email", "user_groups");
private UiLifecycleHelper uiHelper;

@Override
protected void onCreate(Bundle savedInstanceState){
    uiHelper = new UiLifecycleHelper(this, callback);
    uiHelper.onCreate(savedInstanceState);
    loginButton = (LoginButton) findViewById(R.id.login_button);
    loginButton.setReadPermissions(PERMISSIONS);
}

private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        //modify interface or something
    }
};

バージョン 2 - 手動

XML:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/button"
    android:onClick="buttonOnClick"
    android:text="Login" />

ジャワ:

private static final List<String> PERMISSIONS = Arrays.asList("email", "user_groups");

public void buttonOnClick(View v) {
    System.out.println("botaoOnClick");
    Session session = Session.getActiveSession();
    if (!session.isOpened() && !session.isClosed()) {
        System.out.println("session: " + session);
        session.openForRead(new Session.OpenRequest(this).setPermissions(PERMISSIONS).setCallback(callback));
    }
    else {
        Session.openActiveSession(this, true, callback);
    }
}

private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        //modify interface or something
    }
};

SDK に付属のサンプル アプリでさえこのように動作しますが、他のアプリ (Foursquare など) が自然な動作だと思う方法で動作しているのを既に見ています (ユーザーがまだアクセス許可を与えていない場合にのみアクセス許可を要求します)。

それで、誰もが望ましい結果を達成する方法を知っていますか? できれば Facebook SDK 自体を編集しないでください。

前もって感謝します!

編集 1 : 追加情報: コールバック メソッドでセッション変数をチェックすると、上記の条件が満たされると、アクセス許可は常に空になります。ユーザーが許可を与えることを拒否し (初めてではない)、再度ログインしようとすると、予想どおり、ユーザーが過去にすでに与えた許可がセッションに適用されます。

編集 2 (2013 年 6 月 28 日) : この問題を再現したビデオをアップロードすることにしました。

リンクはこちら: http://www.youtube.com/watch?v=w4qJfoiVSsU

4

4 に答える 4

2

これはおそらく、アプリ (デバッグ モードであると想定) と appID に関連付けられた Facebook アプリの間で署名の不一致が発生したためです。

基本的に、次のことを確認する必要があります。

  1. Facebook SDK を使用する Android アプリの署名がFacebook アプリ ダッシュボード Facebook アプリ ダッシュボードに追加され ます。keytool を使用するか、アクティビティの onCreate メソッドに次のコードを追加することで、アプリの署名を簡単に取得できます。

    @Override
    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                getPackageName(), 
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("TAG", "Hash to copy ==> "+ Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
    } catch (NameNotFoundException e) {
    
    } 
    catch (NoSuchAlgorithmException e) {
    
    }
    }
    
  2. Facebookログインチェックボックスが有効になっています

  3. サンドボックス モードを有効にしていない場合は、アプリの詳細ページからカテゴリを選択する必要があります

  4. デフォルトでは、loginbutton は SingleSignOn loginbehavior を使用します。これは基本的に Facebook アプリの所有者としてログインします。Facebook アプリに代わってすべてのユーザーがログインできるようにするものを使用することをお勧めします。これを行うには、ログイン ボタンに権限を設定した後、次の行を追加します。

    loginButton.setReadPermissions(PERMISSIONS);
    loginButton.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
    

それでも問題が解決しない場合は、このドキュメントの facebook ログインのトラブルシューティングを読むことをお勧めします。

PS: 参考までに、UiLifecycleHelper を使用する場合は、メインのアクティビティ/フラグメント ライフサイクル メソッドをオーバーライドし、Javadoc に記載されているように呼び出しを UiLifecycleHelper に転送することを忘れないでください。

このクラスを使用する場合、クライアントは * アクティビティまたはフラグメントのそれぞれのメソッドからすべてのパブリック メソッドを呼び出さなければなりません。すべての * メソッドを呼び出さないと、セッションが不適切に初期化されたり、初期化されなかったりする可能性があります。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
protected void onResume() {
    super.onResume();
    uiHelper.onResume();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);
}

@Override
protected void onPause() {
    super.onPause();
    uiHelper.onPause();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    uiHelper.onActivityResult(requestCode, resultCode, data);
}
于 2013-06-24T19:04:44.407 に答える
0

Facebook アプリがデバイスにインストールされていない場合、読み取りアクセス許可は毎回要求される (または、既に許可されていることを示すポップアップが表示される) と思います。

前回の Android SDK での動作のはずです。

アプリもインストールされていることに気づきましたか?

于 2013-06-24T19:17:12.067 に答える
0

buttonOnClick 関数の if ステートメントに少しひねりを加えた手動バージョンを使用します。

Session session = Session.getActiveSession();
boolean isReadAllowed = checkPermissions(Arrays.asList(PERMISSIONS), session.getPermissions());
if (!session.isOpened() && !session.isClosed()) {
    session.openForRead(new Session.OpenRequest(this).setPermissions(PERMISSIONS).setCallback(callback));
} else {
    if (isReadAllowed) {
        Session.openActiveSession(this, true, callback);
    } else {                                    
        session.requestNewReadPermissions(new Session.NewPermissionsRequest(this, Arrays.asList(PERMISSIONS)).setCallback(callback));
    }
}

そして私のcheckPermissions関数:

public static boolean checkPermissions(List<String> needed, List<String> available) {
    boolean ret = true;
    for (String s : needed) {
        if (!available.contains(s)) {
            ret = false;
            break;
        }
    }
    return ret;
}

私のフローは機能し、権限が付与されていない場合にのみ権限を要求します。コールバック コードをもっと貼り付けてもらえますか? そこで何か違うことをしているかどうかを確認できます。

編集: ビデオをありがとう。最初は問題がわかりませんでした。以前にこの動作を見たことがありますが、これは Facebook SDK のバグです。私は彼らのトラッカー (リンク) に 1 か月前にバグを報告しましたが、彼らがそれを修正しようとしているようには見えません。

于 2013-06-26T06:16:17.733 に答える