我正在尝试使用自定义界面登录 Facebook,它在 Activity 类中运行良好。我也必须在 Fragment 中做同样的事情。但它没有正确登录 当我点击 facebook 按钮时,我看到这个屏幕
当我单击“继续”按钮时,我没有收到打印的 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);
}
我在我的应用程序中使用导航组件,并且当我在活动中使用它时相同的代码运行良好
当我从片段到主机活动中删除回调和 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();
}
我将剩余的代码添加到我的主机活动中