2

Ich entwickelte eine Anwendung, die Gmail API verwendet, um alle E-Mails vom Benutzer zu erhalten. Dann habe ich diese App in ein Sample (fast leer) und ein Fragment aufgeteilt, das alles erledigt, damit ich später mein Fragment problemlos in die Projekteinstellungen meines Teams integrieren kann.Integration von Gmail-Verbindung in Firebase-Projekt

Jetzt, wo mein Fragment ist in dem anderen Projekt, die gmail Verbindung funktioniert nicht und gibt mir diese Fehler:

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

Ich denke, dieser Fehler ist, weil das Projekt verwendet und Feuerbasis hat bereits eine Google- services.json Datei und meins wird nicht verwendet. Wir haben die Google API im google developer Portal hinzugefügt und eine neue JSON-Datei generiert, aber es scheint nicht zu funktionieren.

Warum schlägt meine GMail-Verbindung fehl und wie kann ich sie lösen?

Antwort

1

Ok, schaffte ich es zum Laufen zu bringen.

Sieht so aus, als wenn ich Credentials-Schlüssel in der Google-Konsole des API-Managers erstelle, fügt die SHA1-Schlüssel nicht in allen Apps des Projekts in Firebase hinzu.

Alles, was ich (nach einer Woche harter Arbeit) zu tun hatte, war die SHA1 von tha app „verknüpft“, um die Google API-Konsole in der anderen App

ich es

helfen kann hoffen, kopieren und einfügen
0

Verwenden Sie diesen Code, um die Google Mail-Anmeldung mit Firebase zu integrieren. Wenn sie sich bereits einloggen, wird sie zu homeScreen navigieren und wenn sie nicht vorher angemeldet wurde, erscheint eine E-Mail, um sich anzumelden sobald sie sich angemeldet hat.

Fügen Sie hier in string.xml verwendet server_client_id:

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

Das beantwortet meine Frage nicht wirklich. Also kann der gesamte Code, den ich in meiner ersten App gemacht habe, nicht in einer Firebase App verwendet werden? Und mein Fragment soll in beiden Apps funktionieren, also sollte ich meinen gesamten Authentifizierungscode auf die Firebase-Authentifizierung umschalten und Firebase dann in meine Anwendung integrieren? – Diiscord

+0

Sie müssen Ihren vorherigen Authentifizierungscode nicht ändern, wenn er ordnungsgemäß funktioniert. Wenn Sie in der Methode handleSignInResult() Ergebnisse erzielen, wählen Sie die Methode firebaseAuthWithGoogle (GoogleSignInAccount acct). Siehe meinen Code. Verwenden Sie Ihre neueste google_services.json. Aktivieren Sie die Google Mail-API in der API-Konsole. Fügen Sie auch Ihr Debug und veröffentlichte SHA1 in API hinzu. Nur Debug SHA1 funktioniert auch während der Entwicklung –

+0

Vielen Dank für Ihre Antworten, das Problem ist, dass ich keine HandleSignInResult-Methode und ein GoogleSignInAccount. Ich habe diesen Quickstart https://developers.google.com/gmail/api/quickstart/android verwendet, sodass ich ein GoogleAccountCredential-Konto habe. – Diiscord

Verwandte Themen