2017-06-14 73 views
0

我正在将“使用Facebook登录”集成到我的Android应用程序中,而且我正面临一个奇怪的问题,这是我第一次启动(,仅第一个)我的应用程序(刚刚安装新的新副本之后)我按下按钮后(但正常登录)Facebook回调没有被调用。如果我正常登录(或使用Facebook),然后再次登出,则回调会正常启动。Android“使用Facebook登录”回调没有被解雇

我需要回调做一些用户会话操作,所以我很生气,很多天都没有找到解决方案,所以我希望任何人都可以帮助我。我的facebookCallBackManager()函数在onCreate中调用。

在我的例子中,我需要getFacebookUserData()方法才能被解雇,但是设置断点和调试,甚至连onSucces都被解雇了。

提前致谢!

下面我贴我的回调代码在我ActivityLogin类:

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

编辑1:

我忘了提我使用的SDK 4.23.0,所以SDK初始化不再需要。

编辑2:

更多可能有用的信息。

我ActivityMain是主要和默认之一,启动时,如果用户没有那么重定向到登录与下一行进行登录:

private void doLogin(){ 

    Intent i = new Intent(getApplicationContext(), ActivityLogin.class); 
    i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 

    this.startActivity(i); 
} 
+0

当您初始化Facebook SDK时?你的活动是“SingleTask”|| “SingleTop”? –

+0

你好@ Michal_196,谢谢你的回复。我忘了提及我使用的SDK 4.23.0和最新的SDK自动初始化,所以FacebookSdn.Initialize不再需要,关于它是什么样的活动,我不知道,不知道什么是“SingleTask或” SingleTop“:) –

+0

我一直在阅读有关”SingleTask“和”SingleTop“,我没有在我的清单文件中定义它们,实际上我的活动声明如下:

回答

0

嗯,我会回答我的问题,以防万一它可以帮助任何可能面临相同(或类似)问题的人,但首先我必须说@ Michal_196让我走向了正确的方向,所以我首先要感谢他。

第一次启动应用程序时未回调的回调问题与我调用ActivityLogin活动的方式有关:setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

我的流程是调用ActivityMain并检查记录的用户,如果它不是我重定向到ActivityLogin,并且避免在登录后登录后面没有登录的用户能够反击并且只是访问应用程序我已经添加了“FLAG_ACTIVITY_NO_HISTORY”来清除主历史记录,但我不知道为什么这是回调的罪魁祸首没有被解雇。

删除该行不仅回调正常工作后,还当用户启动应用程序并被重定向从主登录并点击后退按钮,而无需登录应用程序只是退出符合市场预期,但怪异的作品!

编辑1:

思考更好现在我才明白发生了什么事,而不是FLAG_ACTIVITY_NO_HISTORY扫清从栈的主要活动是表明登录活动不应该被放在栈等回调的Facebook是后没有被解雇叫,现在我很清楚,我已经解决了我的问题。再次感谢@ Michal_196。

+0

没问题,我也碰到过类似的情况,同样的回调问题不会被解雇,在我的情况下,罪魁祸首是“SingleTask”。 –

0

findViewById(R.id.btn_facebook_login).setOnClickListener(新景观。OnClickListener(){@Override 公共 无效的onClick(视图v){

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

=========================== ============================================= 将此添加到您的oncreate方法

FacebookSdk.sdkInitialize(this);

FacebookSdk.setApplicationId(“这里是你的Facebook应用程序ID”);

callbackManager = CallbackManager.Factory.create();

+0

感谢您的回复和您的努力@Kaidjohar Mithawala。我已经按照我在上面的帖子中描述的方式解决了它。我无法将自己的答案设置为已解决,因为它说我必须等待2天,但最终在调用我的登录活动时问题与ACTIVITY_FLAG_NO_HISTORY相关:) –