アプリケーションにFacebook
ログインを統合しています。読み取りアクセス許可を取得できますが、FacebookSDKから公開アクセス許可を取得する方法。
これは私が読むための許可を求める方法です:
@Override
public void onClick(View v) {
Session currentSession = Session.getActiveSession();
if (currentSession == null
|| currentSession.getState().isClosed()) {
Session session = new Session.Builder(context).build();
Session.setActiveSession(session);
currentSession = session;
}
if (currentSession.isOpened()) {
// Do whatever u want. User has logged in
} else if (!currentSession.isOpened()) {
// Ask for username and password
OpenRequest op = new Session.OpenRequest((Activity) context);
op.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
op.setCallback(null);
List<String> permissions = new ArrayList<String>();
permissions.add("user_likes");
permissions.add("email");
permissions.add("user_birthday");
permissions.add("user_location");
permissions.add("user_interests");
permissions.add("friends_birthday");
op.setPermissions(permissions);
Session session = new Builder(MainActivity.this).build();
Session.setActiveSession(session);
session.openForRead(op);
}
}
});
ユーザーが権限を付与した場合、私はaccess_token
を取得し、onActivityResult
で自分の作業を行うことができます。これが私がそれでやっていることです:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (Session.getActiveSession() != null)
Session.getActiveSession().onActivityResult(this, requestCode,
resultCode, data);
Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) {
Session session = new Session.Builder(context).build();
Session.setActiveSession(session);
currentSession = session;
}
if (currentSession.isOpened()) {
Session.openActiveSession(this, true, new Session.StatusCallback() {
@Override
public void call(final Session session, SessionState state,
Exception exception) {
if (session.isOpened()) {
Request.executeMeRequestAsync(session,
new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
TextView welcome = (TextView) findViewById(R.id.welcome);
TextView access_token_txt = (TextView) findViewById(R.id.access_token);
TextView email_txt = (TextView) findViewById(R.id.email);
access_token = session.getAccessToken();
firstName = user.getFirstName();
fb_user_id = user.getId();
access_token_txt.setText(access_token);
JSONObject graphResponse = response
.getGraphObject().getInnerJSONObject();
fbEmail = null;
try {
fbEmail = graphResponse.getString("email");
} catch (JSONException e) {
e.printStackTrace();
}
email_txt.setText(fbEmail);
}
}
});
}
}
});
}
}
ここで説明されているようにFacebook Developer
docを読みました 権限-Facebook開発者 、読み取り権限で公開権限を要求することはできません。
最初のユーザーは読み取りを要求する必要があり、ユーザーがそれを自動化すると、公開権限を要求できます。
ユーザーに読み取り権限が付与された後、Facebookログインから公開権限を取得するにはどうすればよいですか。
どんな種類の助けもいただければ幸いです。
私は私の質問に対する答えを持っています。読み取り権限を取得した後でセッションを開き、公開権限を要求するだけです。これが私がしたことです:
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
private boolean pendingPublishReauthorization = false;
これをonActivityResult
に追加します:
Session session = Session.getActiveSession();
if (session != null) {
// Check for publish permissions
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
pendingPublishReauthorization = true;
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
this, PERMISSIONS);
session.requestNewPublishPermissions(newPermissionsRequest);
return;
}
}
また、このメソッドをコードに統合します。
private boolean isSubsetOf(Collection<String> subset,
Collection<String> superset) {
for (String string : subset) {
if (!superset.contains(string)) {
return false;
}
}
return true;
}
これらのことを行うことで、読み取りと公開のアクセス許可を同時に取得できます。
これが他の人に役立つことを願っています。
Facebook sdk 3.0ドキュメントから、読み取りと公開の許可を同時に与えることはできません。ただし、後で読み取りアクセス許可でセッションを開くと、UiLifecycleHelperクラスによって、このセッションを更新してアクセス許可を公開できます。セッション状態がSessionState.OPENED_TOKEN_UPDATEDに変わると、セッションは公開権限で更新されます。これがお役に立てば幸いなサンプルコードです。
public class Example {
private static final int REAUTH_ACTIVITY_CODE = 100;
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions", "publish_stream");
private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_submit_post);
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
publishStory();
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (exception != null) {
new AlertDialog.Builder(SubmitPost.this)
.setMessage(exception.getMessage())
.setPositiveButton("OK", null).show();
} else {
SubmitPost.this.onSessionStateChange(session, state, exception);
}
}
};
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
if (pendingAnnounce && state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
// Session updated with new permissions so try publishing once more.
pendingAnnounce = false;
//call your method here to publish something on facebook
publishStory();
}
}
}
private void requestPublishPermissions(Session session) {
if (session != null) {
pendingAnnounce = true;
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS);
newPermissionsRequest.setRequestCode(REAUTH_ACTIVITY_CODE);
Session mSession = Session.openActiveSessionFromCache(this);
mSession.addCallback(callback);
mSession.requestNewPublishPermissions(newPermissionsRequest);
}
}
private void publishStory() {
// Check for publish permissions
List<String> permissions = this.session.getPermissions();
if (!permissions.containsAll(Arrays.asList(PERMISSIONS ))) {
this.requestPublishPermissions(this.session);
this.is_return = true;
return;
}
Session session = Session.getActiveSession();
if (session != null) {
CreateFBPost();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REAUTH_ACTIVITY_CODE:
Session session = Session.getActiveSession();
if (session != null) {
session.onActivityResult(this, requestCode, resultCode, data);
}
break;
}
}