Android 安卓;使用Facebook登录;我没有被解雇
我正在将“使用Facebook登录”集成到我的Android应用程序中,我面临着一个奇怪的问题,那就是我第一次(,也是唯一第一次)启动我的应用程序(就在安装了一个新的副本之后)。在我按下按钮后,Facebook回调没有被调用(但登录正常)。如果我正常登录(或使用Facebook),然后第二次注销并继续,则回调将正常启动 我需要回调来执行一些用户会话操作,所以我对此很生气,很多天都找不到解决方案,所以我希望任何人都能帮助我。我的facebookCallBackManager()函数是在onCreate中调用的 在我下面的示例中,我需要getFacebookUserData()方法来触发,但设置断点和调试即使在UCS上也不会触发 提前谢谢 下面我将回调代码粘贴到ActivityLogin类中:Android 安卓;使用Facebook登录;我没有被解雇,android,facebook,login,callback,Android,Facebook,Login,Callback,我正在将“使用Facebook登录”集成到我的Android应用程序中,我面临着一个奇怪的问题,那就是我第一次(,也是唯一第一次)启动我的应用程序(就在安装了一个新的副本之后)。在我按下按钮后,Facebook回调没有被调用(但登录正常)。如果我正常登录(或使用Facebook),然后第二次注销并继续,则回调将正常启动 我需要回调来执行一些用户会话操作,所以我对此很生气,很多天都找不到解决方案,所以我希望任何人都能帮助我。我的facebookCallBackManager()函数是在onCrea
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
private void facebookCallBackManager() {
callbackManager = CallbackManager.Factory.create();
LoginButton btnFacebookLogin = (LoginButton) findViewById(R.id.btnFacebookLogin);
btnFacebookLogin.setReadPermissions("public_profile", "email", "user_friends");
btnFacebookLogin.registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
GraphRequest.newMeRequest(
loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject json, GraphResponse response) {
if (response.getError() != null) {
// handle error
} else {
getFacebookUserData(json);
}
}
}
).executeAsync();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
if (!GeneralUtils.isOnline(oContext)){
GeneralUtils.showNoInternet(strTheme, oContext, ActivityLogin.this);
}else{
String strMessage=exception.getMessage();
GeneralUtils.showToast(strMessage, Toast.LENGTH_LONG, strTheme, ActivityLogin.this);
}
}
});
}
好吧,我会回答我自己的问题,以防它对任何可能面临相同(或类似)问题的人有所帮助,但首先我必须说@Michal_196让我走上了正确的方向,所以我首先要感谢他 第一次启动应用程序时没有触发回调的问题与我调用ActivityLogin活动的方式有关,具体来说是:setFlags(Intent.FLAG\u activity\u NO\u HISTORY) 我的流程是调用ActivityMain并检查已登录的用户,如果不是,我将重定向到ActivityLogin,并避免在“后退”按钮后登录,未登录的用户可以回击并访问我添加的应用程序“FLAG\u ACTIVITY\u NO\u HISTORY”从历史中清除main,但我不知道为什么这是callback没有被解雇的罪魁祸首 删除该行后,不仅回调可以正常工作,而且如果用户启动应用程序,并被重定向到从主应用程序登录,并在不记录日志的情况下单击“后退”按钮,则应用程序将按预期退出,但工作正常 编辑1: 现在我想得更清楚了,我知道发生了什么,标记“活动”而不是从堆栈中清除“主要活动”,这表明登录活动不应该放在堆栈上,因此在调用facebook后回调不会被触发,我现在明白了,我已经解决了我的问题。再次感谢@Michal_196。findViewById(R.id.btn\u facebook\u登录)。setOnClickListener(new View.OnClickListener(){ @凌驾 公共void onClick(视图v){
LoginManager.getInstance().logInWithReadPermissions(LoginScreen.this、Arrays.asList(“public\u profile”、“email”、“user\u friends”);
LoginManager.getInstance().registerCallback(callbackManager,new FacebookCallback()){
@凌驾
成功时公共无效(LoginResult LoginResult){
GraphRequest request=GraphRequest.NewMereRequest(loginResult.getAccessToken(),new GraphRequest.GraphJSONObjectCallback()){
@凌驾
未完成公共无效(JSONObject对象,GraphResponse响应){
//TODO自动生成的方法存根
试一试{
字符串fb_id=“”;
字符串email_Id=“”;
字符串名称=”;
字符串性别=”;
if(response.getJSONObject()具有(“id”)){
fb_id=response.getJSONObject().getString(“id”);
}
email_Id=response.getJSONObject().getString(“电子邮件”);
name=response.getJSONObject().getString(“名称”);
gender=response.getJSONObject().getString(“gender”);
字符串url=”https://graph.facebook.com/“+fb_id+”/picture?type=large”;//小,大
}捕获(JSONException e){
e、 printStackTrace();
}
}
});
Bundle参数=新Bundle();
参数.putString(“字段”、“id、姓名、电子邮件、性别、生日”);
请求。设置参数(参数);
request.executeAsync();
}
@凌驾
公开作废{
Log.d(“标记”、“FB_登录响应==>取消”);
}
@凌驾
public void onError(facebook异常){
Log.d(“TAG”、“Exception\u FB\u LoginResponse==>”+Exception.getMessage());
}
});
}
});
========================================================================
将此添加到oncreate方法中
FacebookSdk.sdk初始化(此)
setApplicationId(“这是您的facebook应用程序id”)
callbackManager=callbackManager.Factory.create() 当您初始化Facebook SDK时?您的活动是“SingleTask”| |“SingleTop”吗?您好@Michal_196,谢谢您的回复。我忘了提到我使用SDK 4.23.0,最新的SDK是自动初始化的,所以FacebookSdn.Initialize不再需要了,关于它是什么类型的活动,我不确定,不知道什么是“SingleTask”或“SingleTop”:)我一直在读关于“SingleTask”和“SingleTop”的文章“我还没有在清单文件中定义它们,事实上我的活动声明如下:请检查我的编辑@Michal_196。感谢您的回复和您的努力@Kaidjohar Mithawala。我已经按照我在上面的帖子中描述的方式解决了这个问题。我无法将我自己的答案设置为已解决,因为上面说我必须等待2天,但最终问题与调用我的登录活动时的活动\标志\否\历史记录有关:)没有问题。我也跑了
private void doLogin(){
Intent i = new Intent(getApplicationContext(), ActivityLogin.class);
i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
this.startActivity(i);
}
LoginManager.getInstance().logInWithReadPermissions(LoginScreen.this, Arrays.asList("public_profile", "email", "user_friends"));
LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
// TODO Auto-generated method stub
try {
String fb_id = "";
String email_Id = "";
String name = "";
String gender = "";
if (response.getJSONObject().has("id")) {
fb_id = response.getJSONObject().getString("id");
}
email_Id = response.getJSONObject().getString("email");
name = response.getJSONObject().getString("name");
gender = response.getJSONObject().getString("gender");
String url = "https://graph.facebook.com/" + fb_id + "/picture?type=large"; //small , large
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email,gender, birthday");
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
Log.d("TAG", "FB_LoginResponse==> Cancel");
}
@Override
public void onError(FacebookException exception) {
Log.d("TAG", "Exception_FB_LoginResponse==>" + exception.getMessage());
}
});
}
});