Интеграция подключения Gmail в проект Firebase

Я разработал приложение, которое использует gmail api для получения всех писем от пользователя. Затем я разделил это приложение на образец (почти пустой) и фрагмент, который делает все, чтобы позже я мог легко интегрировать свой фрагмент в настройки проекта моей команды.

Теперь, когда мой фрагмент находится в другом проекте, соединение с gmail не работает и выдает следующие ошибки:

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

Я думаю, что эта ошибка связана с тем, что проект использует firebase и уже имеет файл google-services.json, а мой не используется. Мы добавили GMail API на портал разработчика Google и создали новый файл json, но, похоже, он не работает.

Почему не удается подключиться к GMail и как решить эту проблему?


person Diiscord    schedule 17.07.2017    source источник


Ответы (2)


Хорошо, мне удалось заставить его работать.

Похоже, когда я создаю ключи учетных данных в консоли Google диспетчера API, ключи SHA1 не добавляются во все приложения проекта в Firebase.

Все, что мне нужно было сделать (после недели напряженной работы), это скопировать и вставить SHA1 из приложения, «связанного» с консолью Google API в другом приложении.

Я надеюсь, что это может помочь

person Diiscord    schedule 25.07.2017

Используйте этот код для интеграции входа в gmail с помощью firebase. Если вы уже вошли в систему, он перейдет на домашний экран, а если вы не вошли в систему ранее, появится всплывающее окно электронной почты для входа после нажатия кнопки входа.

Добавьте свой server_client_id в string.xml, используемый здесь:

getString(R.string.server_client_id)

Код :

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();
  }
}

action_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>
person Elysian Apps    schedule 17.07.2017
comment
Это на самом деле не отвечает на мой вопрос. Значит, весь код, который я сделал в своем первом приложении, нельзя использовать в приложении Firebase? И мой фрагмент должен работать в обоих приложениях, поэтому я должен переключить весь свой код аутентификации на аутентификацию firebase, а затем интегрировать firebase в свое приложение? - person Diiscord; 18.07.2017
comment
Вам не нужно менять свой предыдущий код аутентификации, если он работает нормально. В вашем методе handleSignInResult(), когда вы получите успешный результат, перейдите к методу firebaseAuthWithGoogle(GoogleSignInAccount acct). смотри мой код. Используйте последний файл google_services.json . Включите Gmail API в консоли API. Также добавьте свой отладочный и выпущенный SHA1 в API. Только отладочный SHA1 также работает во время разработки - person Elysian Apps; 18.07.2017
comment
Спасибо за ваши ответы, проблема в том, что у меня нет метода handleSignInResult и GoogleSignInAccount. Я использовал это краткое руководство developers.google.com/gmail/api/quickstart/android поэтому у меня есть GoogleAccountCredential - person Diiscord; 19.07.2017