Facebook Login from custom UI in android

对着背影说爱祢 提交于 2019-12-12 04:56:37

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!