0

Привет, я новичок в разработке Android. В настоящее время я пытаюсь создать базовое андроидное приложение с Firebase от Google в качестве его бэкэнд-системы.Магазин Facebook пользователя в Firebase

У меня есть кнопка «Войти с Facebook», всякий раз, когда эта кнопка нажата, открывается диалоговое окно, в котором пользователь вводит свои учетные данные на facebook, чтобы получить доступ к приложению. Когда это будет сделано, я хочу сохранить его адрес электронной почты, имя и идентификатор в Firebase, если он впервые зашел в систему, если он не первый раз заходит в систему, я хочу обновить его информацию.

Я создал класс User (POJO), который я буду использовать для представления этих данных. Моя проблема в том, что я, похоже, не знаю, где разместить код, который хранит эту информацию. Вот мой MainActivity класс:

public class MainActivity extends AppCompatActivity { 

    //Declare our view variables 
    private LoginButton mLoginButton; 
    private CallbackManager mCallbackManager; 
    private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthListener; 
    private FirebaseDatabase mDatabase; 
    private DatabaseReference mDatabaseReference; 

    private static final String TAG = "MainActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getApplicationContext()); 
     setContentView(R.layout.activity_main); 

     //Initialize callback manager 
     mCallbackManager = CallbackManager.Factory.create(); 

     //Assign the views to the corresponding variables 
     mLoginButton = (LoginButton) findViewById(R.id.login_button); 

     //Assign the button permissions 
     mLoginButton.setReadPermissions("email", "public_profile"); 

     //Create instance of database 
     mDatabase = FirebaseDatabase.getInstance(); 
     mDatabaseReference = mDatabase.getReference(); 

     //Assign the button a task 
     mLoginButton.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); 
      } 
     }); 

     // Initialize Firebase Auth 
     mAuth = FirebaseAuth.getInstance(); 

     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       //Get currently logged in user 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 

       if (user != null) { 
        // User is signed in 
        Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 

        // Name, email address 
        String name = user.getDisplayName(); 
        String email = user.getEmail(); 

        // The user's ID, unique to the Firebase project. Do NOT use this value to 
        // authenticate with your backend server, if you have one. Use 
        // FirebaseUser.getToken() instead. 
        String uid = user.getUid(); 

        //Create user 
        final User loggedIn = new User(uid, name, email); 

        mDatabaseReference.child("users").child(loggedIn.getId()).setValue(loggedIn); 

        mDatabaseReference.child("users").addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          // This method is called once with the initial value and again 
          // whenever data at this location is updated. 

         } 

         @Override 
         public void onCancelled(DatabaseError error) { 
          // Failed to read value 
          Log.w(TAG, "Failed to read value.", error.toException()); 
         } 
        }); 

       } else { 
        // User is signed out 
        Log.d(TAG, "onAuthStateChanged:signed_out"); 
       } 
      } 
     }; 
    } 

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

    //If user successfully signs in the LoginButton's onSuccess callback method 
    // get an access token for the signed-in user, exchange it for a Firebase credential 
    // and authenticate with Firebase using the Firebase credential 

    private void handleFacebookAccessToken(AccessToken token) { 
     Log.d(TAG, "handleFacebookAccessToken:" + token); 

     AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); 
     mAuth.signInWithCredential(credential) 
       .addOnCompleteListener(this, 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.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }); 
    } 
} 

Вот мой класс User:

public class User { 
    private String id; 
    private String name; 
    private String email; 

    public User(){ 

    } 

    public User(String id, String name, String email) { 
     this.id = id; 
     this.name = name; 
     this.email = email; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

} 

Спасибо за ваше время

+0

Похоже, вы уже поместили код в свой прослушиватель AuthStateChanged. Разве это не работает для вас? –

+0

@ RosárioPereiraFernandes нет, это не – hallaksec

ответ

0

I понизило firebase до 9.6.0, чтобы избежать Google Play Services ошибок, и я спас пользователя после того, как он подписывает с использованием его учетные данные в методе handleFacebookAccessToken.

1

Вы уже сделали большую часть работы, так что я собираюсь создать два методы для вас.

protected void getUserInfo(final LoginResult login_result){ 

    GraphRequest data_request = GraphRequest.newMeRequest(
      login_result.getAccessToken(), 
      new GraphRequest.GraphJSONObjectCallback() { 
       @Override 
       public void onCompleted(
         JSONObject object, 
         GraphResponse response) { 
        try { 
         String facebook_id = object.getString("id"); 
         String f_name = object.getString("name"); 
         String email_id = object.getString("email"); 
         String token = login_result.getAccessToken().getToken(); 
         String picUrl = "https://graph.facebook.com/me/picture?type=normal&method=GET&access_token="+ token; 

saveFacebookCredentialsInFirebase(login_result.getAccessToken()); 

        } catch (JSONException e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
    Bundle permission_param = new Bundle(); 
    permission_param.putString("fields", "id,name,email,picture.width(120).height(120)"); 
    data_request.setParameters(permission_param); 
    data_request.executeAsync(); 
    data_request.executeAsync(); 
} 

Здесь вы сохраните данные в firebase

private void saveFacebookCredentialsInFirebase(AccessToken accessToken){ 
    AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken()); 
    firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) { 
      if(!task.isSuccessful()){ 
       Toast.makeText(getApplicationContext(),"Error logging in", Toast.LENGTH_LONG).show(); 
      }else{ 
       Toast.makeText(getApplicationContext(),"Login in Successful", Toast.LENGTH_LONG).show(); 
      } 
     } 
    });  
} 
+0

в этом решении, как я могу вернуть информацию пользователя, которую я собрал в функции 'getUserInfo'? 'onCompleted' вызывается после оператора return, из-за которого я получаю пустые данные – mrid