Facebook的登录在Android的定制UI [英] Facebook Login from custom UI in android

查看:339
本文介绍了Facebook的登录在Android的定制UI的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过我的自定义用户界面来实现Facebook的登录功能。

我用下面的code是Facebook开发页

给出

 私人Session.StatusCallback statusCallback =
        新SessionStatusCallback();
私有静态最后弦乐TAG =MainFragment; 私人无效onClickLogin(){
    会话的会话= Session.getActiveSession();
    如果(会话!= NULL){
      如果(session.isOpened()及!&放大器;!session.isClosed()){
        session.openForRead(新Session.OpenRequest(this).setPermissions(Arrays.asList(\"public_profile\")).setCallback(statusCallback));
      }其他{
        Session.openActiveSession(这一点,真的,statusCallback);
      }
    }
  }私有类SessionStatusCallback实现Session.StatusCallback {
    @覆盖
    公共无效呼叫(会话的会话,SessionState会状态,异常除外){
        如果(state.isOpened()){
            Log.i(TAG,已登录...);
        }否则如果(state.isClosed()){
        Log.i(TAG注销...);
      }
                //响应会话状态的变化,例如:更新视图
      }
}

我呼吁在 OnClickLogin()通过点击按钮的方法。问题是,什么也没有发生。变量会议为null。

指向我,如果我错了,或任何地方,这是不实现的观念的正确方法。

理性来实现自定义UI,主要是我想用户登录上的一个按钮,但是从操作栏中的另一个按钮退出。让我知道是否有实现的任何其他方式。

修改 -

剩余code是

  @覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    按钮=(按钮)findViewById(R.id.button1);    button.setOnClickListener(新View.OnClickListener(){        @覆盖
        公共无效的onClick(查看为arg0){
            onClickLogin();
        }
    });}


解决方案

使用这个类

 进口android.app.Activity;
进口android.content.Intent;进口com.facebook.Session;
进口com.facebook.SessionDefaultAudience;
进口com.facebook.SessionLoginBehavior;
进口com.facebook.SessionState;进口java.util.Arrays中;/ **
 *创建者玛克斯在15年3月18日。
 * /
公共抽象类FacebookActivity延伸活动{公共静态最后弦乐APP_ID =Facebook应用程序ID;私人MyLoginListener善堂;公共无效setFacebookLoginListener(MyLoginListener LST){
    this.lst =善堂;
}公共无效startFacebookLogin(MyLoginListener LST){
    如果(hasReadPermission()){
        lst.onSuccess();
    }其他{
        this.lst =善堂;
        requestReadPermission();
    }
}私人无效requestReadPermission(){
    会话的会话= Session.getActiveSession();    如果(会话!= NULL){
        session.closeAndClearTokenInformation();
        Session.setActiveSession(NULL);
    }
    会话=新Session.Builder(本).setApplicationId(APP_ID).build();
    session.closeAndClearTokenInformation();    会话=新Session.Builder(本).setApplicationId(APP_ID).build();
    Session.setActiveSession(会话);
    session.removeCallback(ReadListener);    Session.OpenRequest openRequest =新Session.OpenRequest(本);    openRequest.setDefaultAudience(SessionDefaultAudience.EVERYONE);
    openRequest.setPermissions(Arrays.asList(电子邮件));
    openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);    openRequest.setCallback(ReadListener);    session.openForRead(openRequest);
}私人Session.StatusCallback ReadListener =新Session.StatusCallback(){    @覆盖
    公共无效呼叫(会话的会话,SessionState会状态,异常除外){
        如果(状态== || SessionState.OPENED状态== SessionState.OPENED_TOKEN_UPDATED){
            如果(hasReadPermission()){
                如果(LST!= NULL)lst.onSuccess();
            }其他{
                如果(LST!= NULL)lst.onError(hasReadPermissions!);
            }
        }否则如果(状态== SessionState.CLOSED_LOGIN_FAILED){
            session.closeAndClearTokenInformation();
            Session.setActiveSession(NULL);            如果(!LST = NULL)lst.onError(用户取消);
        }否则如果(状态== SessionState.CLOSED){
            session.close();
        }
    }
};私人布尔hasReadPermission(){
    返回hasReadPermission(Session.getActiveSession());
}私人布尔hasReadPermission(会话的会话){
    返回会话= NULL&放大器;!&安培; session.isOpened()及&放大器; 。session.getPermissions()包含(电子邮件);
}@覆盖
公共无效的onActivityResult(INT申请code,INT结果code,意图数据){
    super.onActivityResult(要求code,结果code,数据);    会话的会话= Session.getActiveSession();
    如果(会话!= NULL){
        session.onActivityResult(这一点,要求code,结果code,数据);
    }
}公共接口MyLoginListener {
    公共无效onerror的(字符串错误);
    公共无效的onSuccess();
}
}

然后创建自己的类扩展FacebookActivity:

 进口android.os.Bundle;
进口android.view.View;
进口android.widget.Button;/ **
 *创建者玛克斯在15年3月18日。
 * /
公共类MyActivity扩展FacebookActivity {
私人Button按钮;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    按钮=(按钮)findViewById(R.id.button1);    button.setOnClickListener(新View.OnClickListener(){        @覆盖
        公共无效的onClick(查看为arg0){
            onClickLogin();
        }
    });}私人无效onClickLogin(){
    startFacebookLogin(LST);
}私人MyLoginListener LST =新MyLoginListener(){
    @覆盖
    公共无效onerror的(字符串错误){
        //打印错误登录失败
        //此处添加您的code
    }    @覆盖
    公共无效的onSuccess(){
        在成功// logined
        //此处添加您的code
    }
};
}

注销方式:

 私人无效退出(){
    会话的会话= Session.getActiveSession();    如果(会话!= NULL){
        session.closeAndClearTokenInformation();
        Session.setActiveSession(NULL);
    }
}

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();
        }
    });

}

解决方案

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);
    }
}

这篇关于Facebook的登录在Android的定制UI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆