0

私は Android 用の Facebook SDK (3.0.1) の初心者であり、公式ドキュメントで見つけることができなかった多くの質問を疑問に思っています。

Facebook の例では、新しい権限を要求するために、ログイン アクティビティと同じアクティビティで UILifeCyclerHelper を使用しています。私の場合は少し違います。

私の場合、最初のアクティビティでユーザーにログインし、その後、そのウォールに公開する許可を求めています。

1) セッションが null の場合、閉じている場合、またはこれらのアクセス許可を要求できないその他の状態の場合にどうすればよいか疑問に思っています。

2) ウォールへの公開はサーバーによって後で行われるため、ユーザー アクセス トークンを送信する必要があります。ここでも、このトークンが null / invalid の場合はどうすればよいですか?

3) 現在、次のような許可を求めています。ユーザーの回答をコールバックするにはどうすればよいですか? これは onActivityResult で起こっていますか? どのような回答が返ってきますか?

あらかじめご了承ください。ご協力ありがとうございます。

Session session = Session.getActiveSession();

if (session != null){

// Check for publish permissions    
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
    Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS);
                session.requestNewPublishPermissions(newPermissionsRequest);
}

else{
     launchPublishWallTask();
}

private static final List<String> PERMISSIONS = Arrays.asList("publish_stream");
private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
    for (String string : subset) {
        if (!superset.contains(string)) {
            return false;
        }
    }
    return true;
}

編集(Ming Liの回答に回答するため):

ご回答ありがとうございます。

1) 私のセッションが null の場合、単純にそうするように言いますか?

if (session == null){
    session = new Session(this.getSherlockActivity());
    Session.setActiveSession(session);
}

そうすることで、ユーザーは再度ログインする必要があります。ユーザーが以前に許可した場合でも、この新しいセッション オブジェクトからアクセス許可が消えますね。

2) ユーザー アクセス トークンは 2 時間のみ有効であり、たとえばユーザー リセット パスワードなどの場合には無効になることを読みました。したがって、セッション オブジェクトを再作成することにより (上記の質問 1)、セッション オブジェクトとアクセス許可を持っていても、有効なユーザー アクセス トークンも確実に取得できますか?

3) わかりました、ありがとう

私の質問を再開するには、私の場合は「のみ」を行うのが良い方法ですか(ここでは onActivityResult メソッドをコピーしていませんが、それで問題ありません):

public void onClick(View v){

        // Retrieve Facebook session object
        Session session = Session.getActiveSession();
        if (session == null){
            session = new Session(this.getSherlockActivity());
            Session.setActiveSession(session);
        }
        session.addCallback(this);

        if (session != null){

            // Check for publish permissions    
            List<String> permissions = session.getPermissions();
            if (!isSubsetOf(PERMISSIONS, permissions)) {
                Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
                    this, PERMISSIONS
                );
                session.requestNewPublishPermissions(newPermissionsRequest);
            }

            else{
                launchPublishWallTask();
            }

        }

}

@Override
public void call(Session session, SessionState state, Exception exception) {

    if (session != null && isSubsetOf(PERMISSIONS, session.getPermissions())){
        launchPublishWallTask();
    }
    else{
        Toast.makeText(getSherlockActivity(), "you have to accept !", Toast.LENGTH_LONG).show();
    }

}


   private void launchPublishWallTask(){
         // Here, I'm sure that I will have a valid Session.getActiveSession().getAccessToken() .. or not ?
   }
4

1 に答える 1

3

必要なアクティビティで UiLifecycleHelper を使用できます。新しいアクティビティを作成するだけです (アクティブなセッションを使用して自動的に開始されます)。アクティブなセッションを使用している場合、それはすべての Activity インスタンスにわたって保持される静的であるため、Session.getActiveSession() を呼び出すだけで、任意のアクティビティからアクセスできます。アクティビティの 1 つがセッションを開いている限り、それを別のアクティビティで使用できます。

  1. セッションが null の場合は、新しいセッションを作成し、それをアクティブ セッションとして設定します (または openActiveSession() メソッドの 1 つを呼び出します)。ユーザーが既にアプリを承認している場合、アプリはすぐに開いた状態**になり、使用できるようになります。閉めていても同じです。ユーザーがまだアプリを承認していない場合、session.isOpened と session.isClosed の両方が false を返すため、おそらくそれらをログイン アクティビティにリダイレクトする必要があります。

  2. この質問にどう答えたらいいのかよくわかりません。アクセス トークンがない場合は、セッションを開いて公開アクセス許可を取得する必要があります。これで、実際にそれを回避することができます。

  3. はい、セッションを開くか、アクティビティまたはフラグメントから新しいアクセス許可を要求するときはいつでも、onActivityResult をオーバーライドし、操作対象のセッションまですべてを渡す必要があります。セッションは、登録した StatusCallback (または UiLifecycleHelper) を呼び出します。

** 注: キャッシュされたデータ (SDK が自動的に保存する) がある場合にのみ、自動的に開きます。ただし、session.closeAndClearTokenInformation を呼び出すと、キャッシュがクリアされ、ユーザーに再度認証を求めるプロンプトが表示されます。

編集 - さらに質問に答えるには:

  1. はい、使用できます。ユーザーが以前にログインしたことがある場合、セッションはキャッシュされたデータを使用して自動入力され、すぐに OPENED 状態になります (過去に closeAndClearTokenInformation を呼び出していない場合)。すべてのアクセス許可/アクセス トークンが保持されます。また、 Session.openActiveSessionFromCacheメソッドを使用することもできます。それが null を返す場合は、(さまざまな理由で) キャッシュから開いているセッションを作成できないことを意味し、ユーザーに再ログインを促す必要があります。

  2. デフォルトでは、ユーザー アクセス トークンは 60 日間有効であり (私は信じています)、SDK が提供する Request クラスを使用してグラフ リクエストを行うと、トークンが期限切れになった場合にトークンを自動延長します。ユーザーがパスワードを変更したり、アプリ (またはその他の多くのもの) を削除したりすると、アクセス トークンが無効になり、アプリに再ログインして再承認する必要があります。一般的なエラーの処理方法については、このページを参照してください。

  3. それはうまく見えます。requestNewPublishPermissions を呼び出す前に、作成したセッションが最初に開いた状態であることを確認する必要があります。

于 2013-06-12T16:37:15.827 に答える