2

J'ai développé une application utilisant l'API gmail pour récupérer tous les mails de l'utilisateur. Ensuite, j'ai divisé cette application en un échantillon (presque vide) et un fragment qui fait tout, afin que je puisse intégrer plus tard mon fragment facilement dans les paramètres du projet de mon équipe.Intégration de la connexion gmail dans le projet Firebase

Maintenant que mon fragment est dans l'autre projet, la connexion gmail ne fonctionne pas et me donne ces erreurs:

E/Async Task: com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException 
E/Google log in: failed 

Je pense que cette erreur est parce que le projet utilise firebase et ont déjà un Google- Le fichier services.json et le mien ne sont pas utilisés. Nous avons ajouté l'API GMail dans le portail google developper et généré un nouveau fichier json, mais cela ne semble pas fonctionner.

Pourquoi ma connexion GMail échoue et comment puis-je le résoudre?

Répondre

1

Ok, j'ai réussi à le faire fonctionner.

Il semblerait que lorsque je crée des clés d'identification dans la console Google du gestionnaire d'API, il n'ajoute pas les clés SHA1 dans toutes les applications du projet dans Firebase.

Tout ce que je devais faire (après une semaine de travail) était de copier coller le SHA1 de tha app « liée » à la console API Google dans l'autre application

J'espère que cela peut aider

0

Utilisez ce code pour intégrer la connexion gmail à l'aide de Firebase. Si déjà connecté, il naviguera vers homeScreen et s'il n'est pas déjà connecté, il apparaîtra email pour se connecter une fois connecté cliqué.

Ajouter vous server_client_id à string.xml utilisé ici:

getString (R.string.server_client_id)

code:

MainActivity.java

import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 
import android.widget.ProgressBar; 
import android.widget.Toast; 
import com.google.android.gms.auth.api.Auth; 
import com.google.android.gms.auth.api.signin.GoogleSignInAccount; 
import com.google.android.gms.auth.api.signin.GoogleSignInOptions; 
import com.google.android.gms.auth.api.signin.GoogleSignInResult; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.SignInButton; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.tasks.OnCompleteListener; 
import com.google.android.gms.tasks.Task; 
import com.google.firebase.auth.AuthCredential; 
import com.google.firebase.auth.AuthResult; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 
import com.google.firebase.auth.GoogleAuthProvider; 
import smart.works.android.bharat.com.codeplay.ui.homeScreen.CodePlayActivity; 
import smart.works.android.bharat.com.codeplay.R; 
import smart.works.android.bharat.com.codeplay.Utils.AppConstants; 
import smart.works.android.bharat.com.codeplay.Utils.PreferenceUtils; 

public class MainActivity extends AppCompatActivity 
    implements GoogleApiClient.OnConnectionFailedListener, View.OnClickListener { 

    private static final int RC_SIGN_IN = 124; 
    private static final String TAG = "MainActivity"; 
    private GoogleApiClient mGoogleApiClient; 
    private FirebaseAuth mAuth; 
    private ProgressBar mProgressBar; 
    private SignInButton mSignInButton; 

    @Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    initUi(); 
    setupUi(); 
    } 

    private void setupUi() { 
    GoogleSignInOptions gso = 
     new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(
      getString(R.string.server_client_id)).requestEmail().build(); 
    mGoogleApiClient = 
     new GoogleApiClient.Builder(this).enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 
    // Set the dimensions of the sign-in button. 
    mSignInButton = (SignInButton) findViewById(R.id.sign_in_button); 
    mSignInButton.setSize(SignInButton.SIZE_STANDARD); 
    findViewById(R.id.sign_in_button).setOnClickListener(this); 
    mAuth = FirebaseAuth.getInstance(); 
    } 

    private void initUi() { 
    mProgressBar = (ProgressBar) findViewById(R.id.sign_in_progress); 
    mSignInButton = (SignInButton) findViewById(R.id.sign_in_button); 
    } 

    @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    @Override public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.sign_in_button: 
     signIn(); 
     break; 
    } 
    } 

    private void signIn() { 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
    } 

    private void showProgress() { 
    mProgressBar.setVisibility(View.VISIBLE); 
    mSignInButton.setEnabled(false); 
    } 

    private void cancelProgress() { 
    mProgressBar.setVisibility(View.GONE); 
    mSignInButton.setEnabled(true); 
    } 

    @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
    if (requestCode == RC_SIGN_IN) { 
     showProgress(); 
     GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
     handleSignInResult(result); 
    } 
    } 

    private void handleSignInResult(GoogleSignInResult result) { 
    Log.d(TAG, "handleSignInResult:" + result.isSuccess()); 
    if (result.isSuccess()) { 
     // Google Sign In was successful, authenticate with Firebase 
     GoogleSignInAccount account = result.getSignInAccount(); 
     firebaseAuthWithGoogle(account); 

     //updateUI(true); 
    } else { 
     cancelProgress(); 
     Toast.makeText(MainActivity.this, "sign in failed ! Try Again ", Toast.LENGTH_SHORT).show(); 
     // Signed out, show unauthenticated UI. 
     //updateUI(false); 
    } 
    } 

    @Override public void onStart() { 
    super.onStart(); 
    // Check if user is signed in (non-null) and update UI accordingly. 
    FirebaseUser currentUser = mAuth.getCurrentUser(); 
    if (currentUser != null) { 
     forwardToHomeScreen(currentUser); 
    } 

    //updateUI(currentUser); 

    } 


    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId()); 

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    mAuth.signInWithCredential(credential) 
     .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
      @Override public void onComplete(@NonNull Task<AuthResult> task) { 
      cancelProgress(); 
      if (task.isSuccessful()) { 
       // Sign in success, update UI with the signed-in user's information 
       Log.d(TAG, "signInWithCredential:success"); 
       FirebaseUser user = mAuth.getCurrentUser(); 
       forwardToHomeScreen(user); 
      } else { 
       // If sign in fails, display a message to the user. 
       Log.w(TAG, "signInWithCredential:failure", task.getException()); 
       Toast.makeText(MainActivity.this, "Authentication failed.", Toast.LENGTH_SHORT) 
        .show(); 
       //updateUI(null); 
      } 

      // ... 
      } 
     }); 
    } 

    private void forwardToHomeScreen(FirebaseUser user) { 
    PreferenceUtils preferenceUtils = new PreferenceUtils(this); 
    preferenceUtils.getPrefEditor().putString(AppConstants.USER_ID, user.getUid()).apply(); 
    Intent i = new Intent(this, CodePlayActivity.class); 
    i.putExtra(AppConstants.USER_NAME, user.getDisplayName()); 
    i.putExtra(AppConstants.USER_EMAIL, user.getEmail()); 
    i.setData(user.getPhotoUrl()); 
    startActivity(i); 
    finish(); 
    } 
} 

actvity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/nav_bg" 
    android:orientation="vertical" 
    > 

    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_alignParentTop="true" 
     android:layout_centerInParent="true" 
     android:layout_marginTop="100dp" 
     android:contentDescription="@string/app_icon" 
     android:src="@mipmap/ic_launcher" 
     /> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/icon" 
     android:layout_centerInParent="true" 
     android:layout_marginBottom="60dp" 
     android:text="@string/app_name" 
     android:textColor="#FFFFFF" 
     android:textSize="16sp" 
     android:textStyle="bold" 
     /> 
    <ProgressBar 
     android:id="@+id/sign_in_progress" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:indeterminate="true" 
     android:visibility="gone" 
     /> 
    <com.google.android.gms.common.SignInButton 
     android:id="@+id/sign_in_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerInParent="true" 
     android:layout_marginBottom="100dp" 
     /> 


</RelativeLayout> 
+0

Cela ne répond pas vraiment à ma question. Donc, tout le code que j'ai créé dans ma première application ne peut pas être utilisé dans une application Firebase? Et mon fragment est censé fonctionner dans les deux applications, alors devrais-je passer tout mon code d'authentification à l'authentification firebase, puis intégrer Firebase dans mon application? – Diiscord

+0

Vous n'avez pas besoin de modifier votre code d'authentification précédent si cela fonctionne correctement. Dans votre méthode handleSignInResult() lorsque vous obtenez un résultat réussi, optez pour la méthode firebaseAuthWithGoogle (GoogleSignInAccount acct). voir mon code. Utilisez votre dernière version de google_services.json. Activer l'API Gmail dans la console Api. Ajoutez également votre débogage et libéré SHA1 dans l'API. Seul le débogage SHA1 fonctionne également pendant le développement –

+0

Merci pour vos réponses, le problème est que je n'ai pas la méthode handleSignInResult et un compte GoogleSignInAccount. J'ai utilisé ce quickstart https://developers.google.com/gmail/api/quickstart/android pour avoir un compte GoogleAccountCredential – Diiscord