【问题标题】:Integrating gmail connection in Firebase project在 Firebase 项目中集成 gmail 连接
【发布时间】:2017-12-22 04:09:00
【问题描述】:

我开发了一个应用程序,它使用 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 文件,而我的没有使用。 我们在 google 开发者门户中添加了 GMail API 并生成了一个新的 json 文件,但它似乎不起作用。

为什么我的 GMail 连接失败,我该如何解决?

【问题讨论】:

    标签: android firebase gmail gmail-api google-developers-console


    【解决方案1】:

    好的,我设法让它工作了。

    看起来当我在 API 管理器 Google 控制台中创建凭据密钥时,它不会在 Firebase 中项目的所有应用程序中添加 SHA1 密钥。

    我所要做的(经过一周的努力)就是将 SHA1 从“链接”的应用中复制粘贴到另一个应用中的 Google API 控制台

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      使用此代码通过 firebase 集成 gmail 登录。如果已经登录,它将导航到 homeScreen,如果之前没有登录,一旦点击登录,它将弹出电子邮件登录。

      在 string.xml 中添加你的 server_client_id 在这里使用:

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

      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>
      

      【讨论】:

      • 这并不能真正回答我的问题。所以我在第一个应用程序中编写的所有代码都不能在 Firebase 应用程序中使用?而且我的片段应该在两个应用程序中都可以工作,所以我应该将所有身份验证代码切换到 firebase 身份验证,然后将 firebase 集成到我的应用程序中吗?
      • 如果它工作正常,您不需要更改您以前的身份验证代码。当您获得结果成功时,在您的 handleSignInResult() 方法中使用 firebaseAuthWithGoogle(GoogleSignInAccount acct) 方法。看我的代码。使用您最新的 google_services.json 。在 Api 控制台中启用 Gmail API。还要在 API 中添加您的调试和发布的 SHA1。只有调试 SHA1 在开发过程中也有效
      • 感谢您的回答,问题是我没有 handleSignInResult 方法和 GoogleSignInAccount。我使用了这个快速入门 developers.google.com/gmail/api/quickstart/android,所以我有一个 GoogleAccountCredential
      • 我认为如果您获得身份验证令牌,那么您可以使用 firebaseAuthWithGoogle(..) 。您应该能够在 GoogleAccountCredential 对象上调用方法 getToken() 并使用该令牌创建 AuthCredential 对象并执行mAuth.signInWithCredential(凭据) 。请参阅此 SO,您将获得更详细的见解。 stackoverflow.com/a/22335286/8321236
      猜你喜欢
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      相关资源
      最近更新 更多