我试图将facebook登录集成到我的应用中。我在facebook开发者网站上阅读了该文档,但它并没有与我合作。这是我的源代码:
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.model.GraphUser;
import com.superteam.altt.R;
import com.superteam.altt.common.Constants;
import com.superteam.altt.utils.ToastUtil;
public class LoginActivity extends BaseActivity implements View.OnClickListener {
private Button btnFblogin;
private Button btnGoogleLogin;
/**
* Facebook instances
*/
private Session.StatusCallback statusCallback = new OnSessionStatusChangedCallback();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
findViews();
}
private void findViews() {
btnFblogin = (Button) findViewById(R.id.btn_login_facebook);
btnGoogleLogin = (Button) findViewById(R.id.btn_login_google);
btnFblogin.setOnClickListener(this);
btnFblogin.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.login, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_login_facebook:
logInViaFacebook();
break;
case R.id.btn_login_google:
break;
default:
}
}
private void logInViaFacebook() {
startFacebookSession();
}
private void startFacebookSession() {
Session session = Session.getActiveSession();
if (session != null && !session.isOpened() && !session.isClosed()) {
openSession(session);
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
private void openSession(Session session) {
Session.OpenRequest openRequest = new Session.OpenRequest(this);
openRequest.setPermissions(Constants.FACEBOOK_PERMISSIONS);
session.openForRead(openRequest);
}
private class OnSessionStatusChangedCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session != null && session.isOpened() && !TextUtils.isEmpty(session.getAccessToken())) {
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
Intent intent = new Intent(getApplicationContext(),HomeActivity.class);
startActivity(intent);
Toast.makeText(getApplicationContext(),"Hello" + user.getUsername(),Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(),"Login failed",Toast.LENGTH_SHORT).show();
}
}
});
}
}
}
}
toast总是显示"登录失败"。有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
private Session.StatusCallback statusCallback = new FBSessionStatus();
public void setupFacebookConnect(Bundle savedInstanceState) {
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
Session session = Session.getActiveSession();
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(this, null, statusCallback,
savedInstanceState);
}
if (session == null) {
session = new Session(this);
}
Session.setActiveSession(session);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this)
.setCallback(statusCallback));
}
}
}
public boolean isFacebookConnected() {
Session session = Session.getActiveSession();
return (session.isOpened()) ? true : false;
}
public void connectFacebook() {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this)
.setCallback(statusCallback));
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
/* @Override
public void onStart() {
super.onStart();
Session.getActiveSession().addCallback(statusCallback);
}
@Override
public void onStop() {
super.onStop();
Session.getActiveSession().removeCallback(statusCallback);
}*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode,
resultCode, data);
}
/*
* private String buildUserInfoDisplay(GraphUser user) { StringBuilder
* userInfo = new StringBuilder("");
*
* // Example: typed access (name) // - no special permissions required
* userInfo.append(String.format("Name: %s\n\n", user.getName()));
*
*
*
*
* // Example: typed access (birthday) // - requires user_birthday
* permission
*
* userInfo.append(String.format("Birthday: %s\n\n", user.getBirthday()));
*
* userInfo.append(String.format("PHone: : %s\n\n",
* user.getProperty("phone")));
*
* // Example: partially typed access, to location field, // name key
* (location) // - requires user_location permission
* userInfo.append(String.format("Location: %s\n\n", user.getLocation()
* .getProperty("name")));
*
* userInfo.append(String.format("Email: : %s\n\n",
* user.getProperty("email")));
*
* // Example: access via property name (locale) // - no special permissions
* required userInfo.append(String.format("Locale: %s\n\n",
* user.getProperty("locale")));
*
* // Example: access via key for array (languages) // - requires user_likes
* permission JSONArray languages = (JSONArray)
* user.getProperty("languages"); if (languages.length() > 0) {
* ArrayList<String> languageNames = new ArrayList<String>(); for (int i =
* 0; i < languages.length(); i++) { JSONObject language =
* languages.optJSONObject(i); // Add the language name to a list. Use JSON
* // methods to get access to the name field.
* languageNames.add(language.optString("name")); }
* userInfo.append(String.format("Languages: %s\n\n",
* languageNames.toString())); }
*
* return userInfo.toString(); }
*/
public class FBSessionStatus implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state,
Exception exception) {
if (state.isOpened()) {
Request.executeMeRequestAsync(session,
new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
// Display the parsed user info
fb_username = user.getName();
fb_email = (String) user
.getProperty("email");
new FB_Login().execute();
// buildUserInfoDisplay(user);
}
}
});
} else if (state.isClosed()) {
}
}
}
public void disConnectFacebook() {
Session session = Session.getActiveSession();
if (!session.isClosed()) {
session.closeAndClearTokenInformation();
}
}
如果对您有用,请投票
答案 1 :(得分:0)
我真的建议你使用SimpleFacebook库。我开始使用Facebook SDK,但我意识到它的软件设计很差/很复杂。
如果你想正确使用它,你必须先花好时间学习奇怪的概念。
SimpleFacebook这就是Facebook应该做的事情。
只是想了解一个关于如何执行登录任务的示例:
//初始化回调侦听器:
OnLoginListener onLoginListener = new OnLoginListener() {
@Override
public void onLogin() {
// change the state of the button or do whatever you want
Log.i(TAG, "Logged in");
}
@Override
public void onNotAcceptingPermissions(Permission.Type type) {
// user didn't accept READ or WRITE permission
Log.w(TAG, String.format("You didn't accept %s permissions", type.name()));
}
/*
* You can override other methods here:
* onThinking(), onFail(String reason), onException(Throwable throwable)
*/
};
mSimpleFacebook.login(onLoginListener);