私は 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 ?
}