问题
I am trying to implement Facebook login feature through my custom UI.
I use following code that is given on facebook developer page
private Session.StatusCallback statusCallback =
new SessionStatusCallback();
private static final String TAG = "MainFragment";
private void onClickLogin() {
Session session = Session.getActiveSession();
if (session != null) {
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("public_profile")).setCallback(statusCallback));
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
Log.i(TAG, "Logged in...");
} else if (state.isClosed()) {
Log.i(TAG, "Logged out...");
}
// Respond to session state changes, ex: updating the view
}
}
I am calling the OnClickLogin() method through click of button. Problem is nothing happens. the variable session is null.
Point me if I am wrong anywhere or this is not the correct way to implement the concept.
Reason to implement the custom UI is mainly that I want user to login on one button but logout from another button from action bar. Let me know if there is any other way to implement that.
EDIT-
Remaining code is
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
onClickLogin();
}
});
}
回答1:
Use this class
import android.app.Activity;
import android.content.Intent;
import com.facebook.Session;
import com.facebook.SessionDefaultAudience;
import com.facebook.SessionLoginBehavior;
import com.facebook.SessionState;
import java.util.Arrays;
/**
* Created by Maks on 18.03.15.
*/
public abstract class FacebookActivity extends Activity {
public static final String APP_ID = "Facebook app id";
private MyLoginListener lst;
public void setFacebookLoginListener(MyLoginListener lst){
this.lst = lst;
}
public void startFacebookLogin(MyLoginListener lst){
if(hasReadPermission()){
lst.onSuccess();
} else {
this.lst = lst;
requestReadPermission();
}
}
private void requestReadPermission(){
Session session = Session.getActiveSession();
if(session!=null){
session.closeAndClearTokenInformation();
Session.setActiveSession(null);
}
session = new Session.Builder(this).setApplicationId(APP_ID).build();
session.closeAndClearTokenInformation();
session = new Session.Builder(this).setApplicationId(APP_ID).build();
Session.setActiveSession(session);
session.removeCallback(ReadListener);
Session.OpenRequest openRequest = new Session.OpenRequest(this);
openRequest.setDefaultAudience(SessionDefaultAudience.EVERYONE);
openRequest.setPermissions(Arrays.asList("email"));
openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
openRequest.setCallback(ReadListener);
session.openForRead(openRequest);
}
private Session.StatusCallback ReadListener = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (state == SessionState.OPENED || state == SessionState.OPENED_TOKEN_UPDATED) {
if (hasReadPermission()) {
if(lst!=null) lst.onSuccess();
} else {
if(lst!=null) lst.onError("!hasReadPermissions");
}
} else if (state == SessionState.CLOSED_LOGIN_FAILED) {
session.closeAndClearTokenInformation();
Session.setActiveSession(null);
if(lst!=null) lst.onError("user canceled");
} else if (state == SessionState.CLOSED) {
session.close();
}
}
};
private boolean hasReadPermission() {
return hasReadPermission(Session.getActiveSession());
}
private boolean hasReadPermission(Session session) {
return session != null && session.isOpened() && session.getPermissions().contains("email");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session session = Session.getActiveSession();
if(session!=null){
session.onActivityResult(this, requestCode, resultCode, data);
}
}
public interface MyLoginListener{
public void onError(String error);
public void onSuccess();
}
}
Then create your own class extends FacebookActivity:
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
/**
* Created by Maks on 18.03.15.
*/
public class MyActivity extends FacebookActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
onClickLogin();
}
});
}
private void onClickLogin(){
startFacebookLogin(lst);
}
private MyLoginListener lst = new MyLoginListener() {
@Override
public void onError(String error) {
// failed login in print error
// add your code here
}
@Override
public void onSuccess() {
// success logined in
// add your code here
}
};
}
Logout method:
private void logOut(){
Session session = Session.getActiveSession();
if(session!=null){
session.closeAndClearTokenInformation();
Session.setActiveSession(null);
}
}
来源:https://stackoverflow.com/questions/29128858/facebook-login-from-custom-ui-in-android