Facebook的登录在Android的定制UI [英] Facebook Login from custom UI in android
问题描述
我想通过我的自定义用户界面来实现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屋!