只要 StackOverflow 中有几个答案,我就会按照他们的教程和文档在我的 Android 应用程序使用 facebook SDK 中实现登录流程。
我有一个带有按钮的 UserRegistrationActivity(不是“LoginButton”)。我想我要求正确的权限(基本信息,电子邮件)。我收到一个询问权限的 Facebook 对话框,但其中未列出电子邮件,因此当我获得 access_token 时,我无法访问用户电子邮件服务器端。
我的代码:
package com.test.user;
import java.util.Arrays;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
import com.facebook.Session;
import com.facebook.SessionState;
import com.test.user.domain.User;
import com.test.user.services.UserLoginService;
public class UserRegistrationActivity extends SherlockActivity implements OnClickListener,ConnectionCallbacks,
OnConnectionFailedListener {
private static final String TAG = "UserRegistrationActivity";
private static final int REQUEST_CODE_RESOLVE_ERR = 9000;
private ProgressDialog mConnectionProgressDialog;
private PlusClient mPlusClient;
private ConnectionResult mConnectionResult;
private Session session;
private Session.StatusCallback statusCallback =
new SessionStatusCallback();
SharedPreferences settings;
UserRegistrationActivity _activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_user_registration);
settings = getSharedPreferences(TestApplication.PREFS_NAME, 0);
setupActionBar();
_activity = this;
}
public void onClickLogin(View v) {
getSherlock().setProgressBarIndeterminateVisibility(true);
Session session = Session.getActiveSession();
if (session != null && !session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this)
.setPermissions(Arrays.asList("basic_info","email"))
.setCallback(statusCallback));
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
@Override
protected void onResume() {
super.onResume();
}
private void setupActionBar() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.user_registration, (com.actionbarsherlock.view.Menu) menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public void onDisconnected() {
Log.d(TAG, "disconnected");
}
@Override
protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
if(requestCode == 2){
if(responseCode ==RESULT_OK){
if(intent.getExtras().containsKey("user_id")){
String userId = intent.getExtras().getString("user_id");
Intent returnIntent = new Intent();
returnIntent.putExtra("user_id", userId);
setResult(RESULT_OK,returnIntent);
getSherlock().setProgressBarIndeterminateVisibility(true);
finish();
}else{
getSherlock().setProgressBarIndeterminateVisibility(true);
}
}
}else{
Session.getActiveSession().onActivityResult(this, requestCode, responseCode, intent);
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
if(!TextUtils.isEmpty(session.getAccessToken())){
SharedPreferences.Editor editor = settings.edit();
editor.putString("user_token","@FB@:"+session.getAccessToken());
editor.putString("user_token_type","FACEBOOK");
// Commit the edits!
editor.commit();
new UserLoginService(_activity).execute("@FB@:"+session.getAccessToken());
}
}
}
public void onResultFromAsyncTask(User result) {
if(result!=null){
Intent returnIntent = new Intent();
returnIntent.putExtra("user_id", result.getId());
setResult(RESULT_OK,returnIntent);
getSherlock().setProgressBarIndeterminateVisibility(true);
finish();
}
}
}