Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓;使用Facebook登录;我没有被解雇_Android_Facebook_Login_Callback - Fatal编程技术网

Android 安卓;使用Facebook登录;我没有被解雇

Android 安卓;使用Facebook登录;我没有被解雇,android,facebook,login,callback,Android,Facebook,Login,Callback,我正在将“使用Facebook登录”集成到我的Android应用程序中,我面临着一个奇怪的问题,那就是我第一次(,也是唯一第一次)启动我的应用程序(就在安装了一个新的副本之后)。在我按下按钮后,Facebook回调没有被调用(但登录正常)。如果我正常登录(或使用Facebook),然后第二次注销并继续,则回调将正常启动 我需要回调来执行一些用户会话操作,所以我对此很生气,很多天都找不到解决方案,所以我希望任何人都能帮助我。我的facebookCallBackManager()函数是在onCrea

我正在将“使用Facebook登录”集成到我的Android应用程序中,我面临着一个奇怪的问题,那就是我第一次(,也是唯一第一次)启动我的应用程序(就在安装了一个新的副本之后)。在我按下按钮后,Facebook回调没有被调用(但登录正常)。如果我正常登录(或使用Facebook),然后第二次注销并继续,则回调将正常启动

我需要回调来执行一些用户会话操作,所以我对此很生气,很多天都找不到解决方案,所以我希望任何人都能帮助我。我的facebookCallBackManager()函数是在onCreate中调用的

在我下面的示例中,我需要getFacebookUserData()方法来触发,但设置断点和调试即使在UCS上也不会触发

提前谢谢

下面我将回调代码粘贴到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);
                }
            }
        });
}

好吧,我会回答我自己的问题,以防它对任何可能面临相同(或类似)问题的人有所帮助,但首先我必须说@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());
                }
            });
        }
    });