2015-11-10 19 views
16

Play hizmetleri 8.3.0'ın bir parçası olarak duyurulan new Google Sign-in için destek eklemeye çalışıyorum. başarıyla projeyi yapılandırılmış ve ben GoogleApiClient bir belirteç alıyorum ama ref.authWithOAuthToken("google", token)Android'de Firebase ve yeni Google Sign-In

Google+ oturum açma çalışıyor çağrılırken Firebase bir Invalid Credentials error dönüyor ama bu bir ağrı olduğunda ayrı bir izin gerektirir Marshmallow için gelişiyor. Firebase android tutorial bir Google+ oturum açma örneğine sahip ve benim düşüncem, henüz yeni Google Sign-In için destek olmaları gerekliliğidir.

Herkes yeni Google Sign-In'i Firebase ile bağlantılı olarak denedi ve işe aldı mı?

+0

burada şüphe yoktur. – Kato

+0

http://stackoverflow.com/questions/36247959/google-play-games-firebase-and-the-new-google-sign-in/41499987#41499987 –

cevap

28

Add Sign-In to Android ve Authorizing with Google for REST APIs'daki adımların bir karışımı.

Bir kez bir GoogleSignInResult o hesap adını almak ve sonra asgari kapsamları ile belirteci isteyebilirsiniz:

protected String doInBackground(String... params) { 
    String scopes = "oauth2:profile email"; 
    String token = GoogleAuthUtil.getToken(getApplicationContext(), email, scopes); 
    // exception handling removed for brevity 
    return token; 
} 
:

@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) { 
     GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
     GoogleSignInAccount acct = result.getSignInAccount(); 

     String email = acct.getEmail(); 

     // TODO: run an async task to get an OAuth2 token for the account 
    } 
} 

zaman uyumsuz görev şu kapsamları istekte bulunmanız gerekir

Şimdi her zamanki gibi Firebase oturum açmak için belirteci kullanabilirsiniz:

ref.authWithOAuthToken("google", token, new Firebase.AuthResultHandler() {... 
+0

Bir çekicilik gibi çalıştık, teşekkürler! –

+1

Bunu başardığın için teşekkürler! Firebase giriş tanıtımını Google + 'yı çalışmak üzere güncellemek için bir istek isteği oluşturdum: https://github.com/firebase/firebase-login-demo-android/pull/21 – carloshwa

+0

Bir "BadParcelableException" alıyorum: Parcelable protokolü gerektirir com.google.android.gms.auth.TokenDat'da CREATOR adlı bir Parcelable.Creator nesnesi, "GoogleAuthUtil.getToken (...)". Ne yanlış olabilir? – Steffen

0

Kaynak kodunu buradan indirebilirsiniz (Firebase Google Login Android). Bu blogda ekran görüntüsünü de yardımınıza sundum.

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 


    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:orientation="vertical"> 


     <ImageView 
      android:layout_width="150dp" 
      android:id="@+id/iv_image" 
      android:src="@drawable/profileimage" 
      android:layout_gravity="center" 
      android:layout_height="150dp" /> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_marginTop="5dp" 
      android:layout_height="40dp"> 

      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_vertical" 
       android:layout_marginLeft="10dp" 
       android:text="Name" 
       android:textColor="#000000" 
       android:textSize="15dp" /> 


      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_vertical" 
       android:layout_marginLeft="10dp" 
       android:text="Name" 
       android:id="@+id/tv_name" 
       android:textColor="#000000" 
       android:textSize="15dp" /> 

     </LinearLayout> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:background="#000000"></View> 


     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="40dp"> 

      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_vertical" 
       android:layout_marginLeft="10dp" 
       android:text="Email" 
       android:textColor="#000000" 
       android:textSize="15dp" /> 


      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_vertical" 
       android:layout_marginLeft="10dp" 
       android:text="Email" 
       android:id="@+id/tv_email" 
       android:textColor="#000000" 
       android:textSize="15dp" /> 

     </LinearLayout> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:background="#000000"></View> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:layout_alignParentBottom="true" 
     android:layout_margin="10dp" 
     android:background="#E02F2F" 
     android:orientation="horizontal"> 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/iv_google" 
      android:src="@drawable/google_plus" /> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="center" 
      android:id="@+id/tv_google" 
      android:gravity="center_vertical" 
      android:text="Sign in with Google" 
      android:textColor="#FFFFFF" 
      android:textSize="20dp" /> 

    </LinearLayout> 
</RelativeLayout> 

MainActivity.java

package com.deepshikha.googlepluslogin; 

import android.app.ProgressDialog; 
import android.content.Intent; 
import android.support.annotation.NonNull; 
import android.support.v4.app.FragmentActivity; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.bumptech.glide.Glide; 
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.api.GoogleApiClient; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.common.api.Status; 
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; 

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

    private static final int RC_SIGN_IN = 9001; 
    private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthListener; 
    private GoogleApiClient mGoogleApiClient; 
    ImageView iv_google; 
    ProgressDialog dialog; 
    ImageView iv_image; 

    boolean boolean_google; 
    TextView tv_name, tv_email, tv_google; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     init(); 
     listener(); 

    } 

    private void init() { 

     tv_name = (TextView) findViewById(R.id.tv_name); 
     tv_email = (TextView) findViewById(R.id.tv_email); 
     tv_google = (TextView) findViewById(R.id.tv_google); 
     iv_google = (ImageView) findViewById(R.id.iv_google); 
     iv_image = (ImageView)findViewById(R.id.iv_image); 

     dialog = new ProgressDialog(MainActivity.this); 
     dialog.setMessage("Loading.."); 
     dialog.setTitle("Please Wait"); 
     dialog.setCancelable(false); 

     mAuth = FirebaseAuth.getInstance(); 
     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if (user != null) { 
        // User is signed in 
        Log.d("LoginActivity", "onAuthStateChanged:signed_in:" + user.getUid()); 
       } else { 
        // User is signed out 
        Log.d("LoginActivity", "onAuthStateChanged:signed_out"); 
       } 
       // [START_EXCLUDE] 
       updateUI(user); 
       // [END_EXCLUDE] 
      } 
     }; 


     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(getString(R.string.default_web_client_id)) 
       .requestEmail() 
       .build(); 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(MainActivity.this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 
    } 

    private void listener() { 
     iv_google.setOnClickListener(this); 
     tv_google.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 

     switch (view.getId()) { 
      case R.id.iv_google: 
       break; 
      case R.id.tv_google: 
       if (boolean_google){ 
        signOut(); 
        tv_name.setText(""); 
        tv_email.setText(""); 
        boolean_google=false; 
        Glide.with(MainActivity.this).load(R.drawable.profileimage).into(iv_image); 
       }else { 
        signIn(); 
       } 
       break; 
     } 

    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     mAuth.addAuthStateListener(mAuthListener); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     if (mAuthListener != null) { 
      mAuth.removeAuthStateListener(mAuthListener); 
     } 
    } 

    @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) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if (result.isSuccess()) { 
       // Google Sign In was successful, authenticate with Firebase 
       GoogleSignInAccount account = result.getSignInAccount(); 
       firebaseAuthWithGoogle(account); 
      } else { 
       // Google Sign In failed, update UI appropriately 
       // [START_EXCLUDE] 
       updateUI(null); 
       // [END_EXCLUDE] 
      } 
     } 

    } 

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
     Log.d("LoginActivity", "firebaseAuthWithGoogle:" + acct.getId()); 
     // [START_EXCLUDE silent] 
     try { 

      dialog.show(); 
     } catch (Exception e) { 

     } 
     // [END_EXCLUDE] 

     AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
     mAuth.signInWithCredential(credential) 
       .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         Log.d("LoginActivity", "signInWithCredential:onComplete:" + task.isSuccessful()); 

         // If sign in fails, display a message to the user. If sign in succeeds 
         // the auth state listener will be notified and logic to handle the 
         // signed in user can be handled in the listener. 
         if (!task.isSuccessful()) { 
          Log.w("LoginActivity", "signInWithCredential", task.getException()); 
          Toast.makeText(MainActivity.this, "Authentication failed.", 
            Toast.LENGTH_SHORT).show(); 
         } 
         // [START_EXCLUDE] 

         try { 

          dialog.dismiss(); 
         } catch (Exception e) { 

         } 
         // [END_EXCLUDE] 
        } 
       }); 
    } 

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

    private void signOut() { 
     // Firebase sign out 
     try { 
      mAuth.signOut(); 

      // Google sign out 
      Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
        new ResultCallback<Status>() { 
         @Override 
         public void onResult(@NonNull Status status) { 
          updateUI(null); 
         } 
        }); 
     } catch (Exception e) { 

     } 
    } 

    private void updateUI(FirebaseUser user) { 
     try { 
      dialog.dismiss(); 
     } catch (Exception e) { 

     } 

     if (user != null) { 
      String str_emailgoogle = user.getEmail(); 
      Log.e("Email", str_emailgoogle); 
      tv_email.setText(str_emailgoogle); 
      tv_name.setText(user.getDisplayName()); 
      boolean_google=true; 
      tv_google.setText("Sign out from Google"); 

      Glide.with(MainActivity.this).load(user.getPhotoUrl()).into(iv_image); 


      Log.e("Profile", user.getPhotoUrl() + ""); 

     } else { 

     } 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     // An unresolvable error has occurred and Google APIs (including Sign-In) will not 
     // be available. 
     Log.d("LoginActivity", "onConnectionFailed:" + connectionResult); 
     Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show(); 
    } 
} 
İlgili konular