Android Facebook身份验证失败

时间:2014-09-20 09:47:53

标签: android facebook

我试图将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总是显示"登录失败"。有人可以帮我解决这个问题吗?

2 个答案:

答案 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);