Android 在Firebase项目中集成gmail连接
我开发了一个应用程序,使用gmail api获取用户的所有邮件。然后我将这个应用程序分为一个示例(几乎是空的)和一个执行所有操作的片段,这样以后我就可以在团队的项目设置中轻松地集成我的片段 现在我的片段在另一个项目中,gmail连接不起作用,给了我以下错误:Android 在Firebase项目中集成gmail连接,android,firebase,gmail,gmail-api,google-developers-console,Android,Firebase,Gmail,Gmail Api,Google Developers Console,我开发了一个应用程序,使用gmail api获取用户的所有邮件。然后我将这个应用程序分为一个示例(几乎是空的)和一个执行所有操作的片段,这样以后我就可以在团队的项目设置中轻松地集成我的片段 现在我的片段在另一个项目中,gmail连接不起作用,给了我以下错误: E/Async Task: com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException E/Google log in: failed
E/Async Task: com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException
E/Google log in: failed
我认为这个错误是因为该项目使用firebase,并且已经有一个google-services.json文件,而我的文件没有被使用。
我们在GoogleDeveloper门户中添加了GMail API,并生成了一个新的json文件,但它似乎不起作用
为什么我的GMail连接失败,我如何解决它?使用此代码使用firebase集成GMail登录。如果已经登录,它将导航到主屏幕,如果之前未登录,它将在单击登录后弹出电子邮件进行登录 在string.xml中添加服务器\客户端\ id 此处使用: getString(R.string.server\u client\u id) 代码: MainActivity.java
导入android.content.Intent;
导入android.os.Bundle;
导入android.support.annotation.NonNull;
导入android.support.v7.app.AppActivity;
导入android.support.v7.widget.Toolbar;
导入android.util.Log;
导入android.view.view;
导入android.widget.ProgressBar;
导入android.widget.Toast;
导入com.google.android.gms.auth.api.auth;
导入com.google.android.gms.auth.api.signin.GoogleSignInAccount;
导入com.google.android.gms.auth.api.signin.GoogleSignInOptions;
导入com.google.android.gms.auth.api.signin.GoogleSignInResult;
导入com.google.android.gms.common.ConnectionResult;
导入com.google.android.gms.common.SignInButton;
导入com.google.android.gms.common.api.GoogleAppClient;
导入com.google.android.gms.tasks.OnCompleteListener;
导入com.google.android.gms.tasks.Task;
导入com.google.firebase.auth.AuthCredential;
导入com.google.firebase.auth.AuthResult;
导入com.google.firebase.auth.FirebaseAuth;
导入com.google.firebase.auth.FirebaseUser;
导入com.google.firebase.auth.GoogleAuthProvider;
导入smart.works.android.bharat.com.codeplay.ui.homeScreen.CodePlayActivity;
导入smart.works.android.bharat.com.codeplay.R;
导入smart.works.android.bharat.com.codeplay.Utils.AppConstants;
导入smart.works.android.bharat.com.codeplay.Utils.PreferenceUtils;
公共类MainActivity扩展了AppCompatActivity
实现GoogleAppClient.OnConnectionFailedListener、View.OnClickListener{
专用静态最终int RC_SIGN_IN=124;
私有静态最终字符串TAG=“MainActivity”;
私人GoogleapClient MGoogleapClient;
私人消防队;
私人ProgressBar mProgressBar;
私人登录按钮mSignInButton;
@在创建时覆盖受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
initUi();
setupUi();
}
私有void setupUi(){
谷歌签名gso=
新建GoogleSignenOptions.Builder(GoogleSignenOptions.DEFAULT\u SIGN\u IN).requestIdToken(
getString(R.string.server_client_id)).requestEmail().build();
mGoogleApiClient=
新的GoogleAppClient.Builder(this.enableautomanager)(this/*FragmentActivity*/,this/*OnConnectionFailedListener*/)
.addApi(Auth.GOOGLE\u SIGN\u IN\u API,gso)
.build();
//设置“登录”按钮的尺寸。
mSignInButton=(SignInButton)findViewById(R.id.sign_in_按钮);
mSignInButton.setSize(SignInButton.SIZE_标准);
findviewbyd(R.id.sign_in_按钮);
mAuth=FirebaseAuth.getInstance();
}
私有void initUi(){
mProgressBar=(ProgressBar)findViewById(R.id.sign\u in\u progress);
mSignInButton=(SignInButton)findViewById(R.id.sign_in_按钮);
}
@重写OnConnection失败的公共void(@NonNull ConnectionResult ConnectionResult){
}
@覆盖公共void onClick(视图v){
开关(v.getId()){
案例R.id.登录按钮:
签名();
打破
}
}
私人无效签名(){
意向符号=Auth.googlesignianpi.getsignient(mgoogleapclient);
startActivityForResult(签名、注册);
}
私有void showProgress(){
mProgressBar.setVisibility(View.VISIBLE);
mSignInButton.setEnabled(false);
}
私有进程(){
mProgressBar.setVisibility(View.GONE);
mSignInButton.setEnabled(true);
}
@重写ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
//从GoogleSignInApi.getsigninent(…)启动Intent返回的结果;
if(requestCode==RC\u登录){
showProgress();
GoogleSignInResult结果=Auth.GoogleSignInApi.getSignInResultFromIntent(数据);
handleSignInResult(结果);
}
}
私有无效handleSignInResult(Google SignInResult结果){
Log.d(标记为“handleSignInResult:+result.issucess());
if(result.issucess()){
//Google登录成功,通过Firebase验证
GoogleSignInAccount account=result.getSignInAccount();
firebaseAuthWithGoogle(账户);
//更新(真);
}否则{
取消进度();
Toast.makeText(MainActivity.this,“登录失败!重试”,Toast.LENGTH_SHORT.show();
//已注销,显示未经验证的用户界面。
//更新(假);
}
}
@重写公共void onStart(){
super.onStart();
//检查用户是否已登录(非空),并相应地更新用户界面。
FirebaseUser currentUser=mAuth.getCurrentUser();
如果(currentUser!=null){
forwardToHomeScreen(当前用户);
}
//updateUI(当前用户);
}
私有void firebaseAuthWithGoogle(谷歌签名帐户){
Log.d(标记为“firebaseAuthWithGoogle:+acct.getId());
作者
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();
}
}
<?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>