Facebook 登录未返回用户 access_token
Facebook Login Not Returning User access_token
这是我的第一个 post,所以如果我不遵守社区规则,请告诉我。
现在进入正题!我一直在尝试为应用程序设置 Facebook 登录过程,并且我已经添加了一个 GUI 元素(内置的 Facebook 登录按钮),并让按钮继续并请求 user/pass,授予应用程序访问用户帐户的权限。我面临的问题是,当使用以下代码从应用程序获取回调值时,我什么也没收到(没有打印值)。现在我正在打印到 LogCat 任意值,但是一旦打印工作,我希望访问用户 access_token 和其他信息(最初不起作用)。任何帮助表示赞赏!
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_connect_accounts);
Log.i("fromMe", "test1");
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
LoginButton loginButton = (LoginButton)findViewById(R.id.login_button);
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>(){
public void onSuccess(LoginResult loginResult) {
Log.i("fromMe", "1");
}
public void onCancel() {
Log.i("fromMe", "2");
}
public void onError(FacebookException exception) {
Log.i("fromMe", "3");
}
});
}
我从来没有使用过内置的 facebook 按钮,而是使用带有点击监听器的普通按钮。我在 onClick()
.
中调用了这个方法
myButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//Starting facebook signIN
startFbSignIn();
}
});
startFbSignIn();
private void startFbSignIn() {
List<String> permissions = new ArrayList<>();
permissions.add("email");
Session.openActiveSession(this, true, permissions, new Session.StatusCallback() {
@Override
public void call(final Session session, SessionState sessionState, Exception e) {
Log.d("X", "Call Called");
if (session.isOpened()) {
Log.d("X", "SessionOpened" + session.getAccessToken());
//Showing some loading
Request.newMeRequest(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser graphUser, Response response) {
//FACEBOOOK SIGNIN SUCCESS
Log.i("X", "Facebook Login Success");
//Log
Log.d("X", "GRAPH USER:" + graphUser.toString());
String name = graphUser.getName();
//.....
}
}).executeAsync();
} else {
Log.d("X", "SessioNOTopened");
}
}
});
}
以上方法对我很有效,你的onActivityResult()
一定是这个样子
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//Facebook Session Manager
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
如果Log.i("fromMe", "1");
有效,那么您可以致电:
AccessToken accessToken = loginResult.getAccessToken();
在你的 onSuccess()
.
并且在onActivityResult(int requestCode, int resultCode, Intent data)
添加:
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
可能是facebook SDK的bug导致无法直接获取accessToken。我们需要创建一个accessToken tracker,然后获取accessToken
private AccessTokenTracker accessTokenTracker;
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
try {
if (newAccessToken.getToken() != null) {
facebookAccessToken = newAccessToken.getToken();
//this is your accessToken here
}
else if (oldAccessToken.getToken() != null) {
facebookAccessToken = oldAccessToken.getToken();
//this is your accessToken here
}else {
Toast.makeText(getBaseContext(), "Facebook Login Failed", Toast.LENGTH_LONG).show();
}
if(oldAccessToken.getToken()!=null)
Log.e("old", oldAccessToken.getToken());
}catch (Exception e){
e.printStackTrace();
}
}
};
一旦成功完成,覆盖 activity 的 onStop 方法并确保停止跟踪那里的 accessToken。
accessTokenTracker.stopTracking();
这是我的第一个 post,所以如果我不遵守社区规则,请告诉我。
现在进入正题!我一直在尝试为应用程序设置 Facebook 登录过程,并且我已经添加了一个 GUI 元素(内置的 Facebook 登录按钮),并让按钮继续并请求 user/pass,授予应用程序访问用户帐户的权限。我面临的问题是,当使用以下代码从应用程序获取回调值时,我什么也没收到(没有打印值)。现在我正在打印到 LogCat 任意值,但是一旦打印工作,我希望访问用户 access_token 和其他信息(最初不起作用)。任何帮助表示赞赏!
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_connect_accounts);
Log.i("fromMe", "test1");
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
LoginButton loginButton = (LoginButton)findViewById(R.id.login_button);
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>(){
public void onSuccess(LoginResult loginResult) {
Log.i("fromMe", "1");
}
public void onCancel() {
Log.i("fromMe", "2");
}
public void onError(FacebookException exception) {
Log.i("fromMe", "3");
}
});
}
我从来没有使用过内置的 facebook 按钮,而是使用带有点击监听器的普通按钮。我在 onClick()
.
myButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//Starting facebook signIN
startFbSignIn();
}
});
startFbSignIn();
private void startFbSignIn() {
List<String> permissions = new ArrayList<>();
permissions.add("email");
Session.openActiveSession(this, true, permissions, new Session.StatusCallback() {
@Override
public void call(final Session session, SessionState sessionState, Exception e) {
Log.d("X", "Call Called");
if (session.isOpened()) {
Log.d("X", "SessionOpened" + session.getAccessToken());
//Showing some loading
Request.newMeRequest(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser graphUser, Response response) {
//FACEBOOOK SIGNIN SUCCESS
Log.i("X", "Facebook Login Success");
//Log
Log.d("X", "GRAPH USER:" + graphUser.toString());
String name = graphUser.getName();
//.....
}
}).executeAsync();
} else {
Log.d("X", "SessioNOTopened");
}
}
});
}
以上方法对我很有效,你的onActivityResult()
一定是这个样子
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//Facebook Session Manager
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
如果Log.i("fromMe", "1");
有效,那么您可以致电:
AccessToken accessToken = loginResult.getAccessToken();
在你的 onSuccess()
.
并且在onActivityResult(int requestCode, int resultCode, Intent data)
添加:
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
可能是facebook SDK的bug导致无法直接获取accessToken。我们需要创建一个accessToken tracker,然后获取accessToken
private AccessTokenTracker accessTokenTracker;
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
try {
if (newAccessToken.getToken() != null) {
facebookAccessToken = newAccessToken.getToken();
//this is your accessToken here
}
else if (oldAccessToken.getToken() != null) {
facebookAccessToken = oldAccessToken.getToken();
//this is your accessToken here
}else {
Toast.makeText(getBaseContext(), "Facebook Login Failed", Toast.LENGTH_LONG).show();
}
if(oldAccessToken.getToken()!=null)
Log.e("old", oldAccessToken.getToken());
}catch (Exception e){
e.printStackTrace();
}
}
};
一旦成功完成,覆盖 activity 的 onStop 方法并确保停止跟踪那里的 accessToken。
accessTokenTracker.stopTracking();