带有导航组件的 Android 片段中的 Facebook 身份验证

问题描述 投票:0回答:1

我正在尝试使用自定义界面登录 Facebook,它在 Activity 类中运行良好。我也必须在 Fragment 中做同样的事情。但它没有正确登录 当我点击 facebook 按钮时,我看到这个屏幕1
当我单击“继续”按钮时,我没有收到打印的 Log.i() 消息
这是我的片段代码

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
binding = FragmentLoginBinding.inflate(inflater, container, false);
// facebook callback
        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        // App code
                        loginWithFacebook(loginResult);
                    }

                    @Override
                    public void onCancel() {
                        // App code
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        // App code
                        Log.e("Login With facebook", "onError: ", exception);
                    }
                });
binding.btnRegisterFacebook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginManager.getInstance().logInWithReadPermissions(requireActivity(), Arrays.asList("public_profile"));
            }
        });
return binding.getRoot();
}
@Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }

private void loginWithFacebook(LoginResult loginResult) {
        // here we will get access token and save data to server
        AccessToken accessToken = loginResult.getAccessToken();
        GraphRequest request = GraphRequest.newMeRequest(
                accessToken,
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject object,
                            GraphResponse response) {
                        try {
                            String name = object.getString("name");
                            String id = object.getString("id");
                            // save to server
                            Log.i("Facebook auth",id);
                            Log.i("Facebook auth",name);
                        } catch (JSONException e) {
                            Log.e("Login With facebook", "onCompleted: ", e);
                            throw new RuntimeException(e);
                        }
                        // Application code
                    }
                });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,link");
        request.setParameters(parameters);
        request.executeAsync();
    }

我在我的主机活动中添加了此代码

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
   Fragment navhost = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
   navhost.onActivityResult(requestCode,resultCode,data);
   super.onActivityResult(requestCode, resultCode, data);
}

我在我的应用程序中使用导航组件,并且当我在活动中使用它时相同的代码运行良好

android android-fragments facebook-graph-api facebook-login
1个回答
0
投票

当我从片段到主机活动中删除回调和 LoginManager 代码时,我终于解决了问题,代码变成这样
Fragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    binding = FragmentLoginBinding.inflate(inflater, container, false);
    binding.btnRegisterFacebook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginManager.getInstance().logInWithReadPermissions(requireActivity(), Arrays.asList("public_profile"));
            }
        });
    return binding.getRoot();
}

我将剩余的代码添加到我的主机活动中

© www.soinside.com 2019 - 2024. All rights reserved.