Android Firebase Oauth Facebook无法在碎片中工作
使用Firebase Facebook进行身份验证不起作用,以下是我的片段代码:Android Firebase Oauth Facebook无法在碎片中工作,android,facebook,android-fragments,firebase,firebase-authentication,Android,Facebook,Android Fragments,Firebase,Firebase Authentication,使用Firebase Facebook进行身份验证不起作用,以下是我的片段代码: public class LoginFragment extends Fragment { private View mView; private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; private CallbackManager mCallbackManager; public LoginFrag
public class LoginFragment extends Fragment {
private View mView;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private CallbackManager mCallbackManager;
public LoginFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
mView = inflater.inflate(R.layout.fragment_login, container, false);
loginFacebook();
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
//Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
} else {
// User is signed out
//Log.d(TAG, "onAuthStateChanged:signed_out");
}
// ...
}
};
return mView;
}
private void loginFacebook() {
// Initialize Facebook Login button
mCallbackManager = CallbackManager.Factory.create();
LoginButton loginButton = (LoginButton) mView.findViewById(R.id.login_button);
loginButton.setReadPermissions("email", "public_profile");
loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
//Log.d(TAG, "facebook:onSuccess:" + loginResult);
handleFacebookAccessToken(loginResult.getAccessToken());
}
@Override
public void onCancel() {
//Log.d(TAG, "facebook:onCancel");
// ...
}
@Override
public void onError(FacebookException error) {
//Log.d(TAG, "facebook:onError", error);
// ...
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Pass the activity result back to the Facebook SDK
mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
private void handleFacebookAccessToken(AccessToken token) {
//Log.d(TAG, "handleFacebookAccessToken:" + token);
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener((MainActivity)getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
//Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
//Log.w(TAG, "signInWithCredential", task.getException());
Toast.makeText((MainActivity)getActivity(), "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
}
});
}
}
公共类LoginFragment扩展了片段{
私有视图;
私人消防队;
私有FirebaseAuth.AuthStateListener mAuthListener;
私有CallbackManager-mCallbackManager;
公共登录片段(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
mView=充气机。充气(R.layout.fragment\u登录,容器,false);
loginFacebook();
mAuth=FirebaseAuth.getInstance();
mAuthListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
//用户已登录
//Log.d(标记为“+user.getUid()”);
}否则{
//用户已注销
//Log.d(标记“onAuthStateChanged:signed_out”);
}
// ...
}
};
返回mView;
}
私有void loginFacebook(){
//初始化Facebook登录按钮
mCallbackManager=CallbackManager.Factory.create();
LoginButton LoginButton=(LoginButton)mView.findViewById(R.id.login_按钮);
setReadPermissions(“电子邮件”、“公共档案”);
registerCallback(mCallbackManager,newfacebookcallback()){
@凌驾
成功时公共无效(LoginResult LoginResult){
//Log.d(标签“facebook:onSuccess:+loginResult”);
handleFacebookAccessToken(loginResult.getAccessToken());
}
@凌驾
公开作废{
//Log.d(标签“facebook:onCancel”);
// ...
}
@凌驾
public void onError(facebook异常错误){
//Log.d(标签“facebook:onError”,错误);
// ...
}
});
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
//将活动结果传回Facebook SDK
onActivityResult(请求代码、结果代码、数据);
}
@凌驾
public void onStart(){
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@凌驾
公共void onStop(){
super.onStop();
if(mAuthListener!=null){
removeAuthStateListener(mAuthListener);
}
}
私有无效handleFacebookAccessToken(AccessToken令牌){
//Log.d(标记“handleFacebookAccessToken:”+token);
AuthCredential credential=FacebookAuthProvider.getCredential(token.getToken());
mAuth.SIGNWITH凭证(凭证)
.addOnCompleteListener((MainActivity)getActivity(),新OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
//Log.d(标记“signInWithCredential:onComplete:+task.isSuccessful()”);
//如果登录失败,则向用户显示消息。如果登录成功
//将通知身份验证状态侦听器,并使用逻辑来处理
//可以在侦听器中处理已登录用户。
如果(!task.issusccessful()){
//w(标记“signInWithCredential”,task.getException());
Toast.makeText((MainActivity)getActivity(),“身份验证失败。”,
吐司。长度(短)。show();
}
}
});
}
}
Facebook弹出窗口出现后,我输入用户名和密码,在调试模式下,代码中没有任何内容会触发
Firebase用户总是null。我做错了什么?
登录后,它会记录Log.d(“LOGGER”,“onAuthStateChanged:signed_out”)
PS:当插入到MainActivity中时,完全相同的代码可以工作。您可以尝试将片段链接到登录按钮
loginButton.setFragment(this);
所以经过一些研究,我现在知道我应该使用一个活动来进行登录操作,而不是一个片段 然而,我在MainActivity中使用代码时遇到了问题,实际上一切都“起作用”。我已登录,但我的FirebaseAuth.AuthStateListener没有从FirebaseAuth.getCurrentUser()返回任何用户 所以,经过几个小时的测试,我发现在登录方法中启用电子邮件/密码使其工作。奇怪的 至少我认为这是个问题,不过我确实做了一个新的Android项目。并使用:工具->firebase生成firebase项目。但正如我所记得的,这并没有解决问题,至少没有立即解决 也可能是因为模拟器
我只是从我的自定义按钮中调用facebook默认按钮,并将每一行代码都保留在文档中,然后它成功地工作了
private FirebaseAuth FirebaseAuth;
私有CallbackManager-mCallBackManager;
私人登录按钮登录按钮;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u sign\u in,container,false);
facebook=view.findviewbyd(R.id.facebook按钮);
loginButton=view.findviewbyd(R.id.facebookBtn);
firebaseAuth=firebaseAuth.getInstance();
facebook.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
callOnClick();
}
});
loginButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mCallBackManager=CallbackManager.Factory.create();
public class SignInFragment extends Fragment implements
> FragmentChangeListener{
> private Button facebook;
private FirebaseAuth firebaseAuth;
private CallbackManager mCallBackManager;
private LoginButton loginButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_sign_in, container, false);
facebook = view.findViewById(R.id.facebookButton);
loginButton = view.findViewById(R.id.facebookBtn);
firebaseAuth = FirebaseAuth.getInstance();
facebook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginButton.callOnClick();
}
});
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallBackManager = CallbackManager.Factory.create();
loginButton.setFragment(SignInFragment.this);
loginButton.setPermissions("email","public_profile");
loginButton.registerCallback(mCallBackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
handleFacebookAccessToken(loginResult.getAccessToken());
}
@Override
public void onCancel() {
Toast.makeText(getContext(),"Is Cancelled",Toast.LENGTH_LONG).show();
}
@Override
public void onError(FacebookException error) {
Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
});
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mCallBackManager.onActivityResult(requestCode, resultCode, data);
}
private void handleFacebookAccessToken(AccessToken token) {
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
firebaseAuth.signInWithCredential(credential)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
FirebaseUser user = firebaseAuth.getCurrentUser();
startActivity(new Intent(getContext(),MainActivity.class));
} else {
// If sign in fails, display a message to the user.
Toast.makeText(getContext(), task.getException().getMessage(),
Toast.LENGTH_SHORT).show();
}
}
});
}