2016-03-26 35 views
0

Bir uygulamada Google ile oturum açma özelliğini başarıyla girdim. Sorum şu: Bu bilgiyi nasıl saklarım, böylece kullanıcı bir dahaki sefere giriş ekranını atlayabilir ve tekrar Oturum açmaya gerek duymadan doğrudan uygulamaya geçebilir? Kullanıcının uygulamayı kapatır ve her zaman daha sonra onu açtığında yaklaşık tarihinde Girişi ısrarlıGoogle Giriş ile oturum açtıktan sonra otomatik giriş yapın

public class Login extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener { 

    @Bind(R.id.googleSignIn)SignInButton googleSignIn; 
    GoogleSignInOptions options; 
    GoogleApiClient client; 

    private static final int GOOGLE_SIGN_IN = 101; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login); 
     ButterKnife.bind(this); 

     /** CONFIGURE THE GOOGLE SIGN IN OPTIONS **/ 
     options = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestEmail() 
       .requestProfile().build(); 
     client = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this, this) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, options) 
       .addApi(Plus.API) 
       .build(); 

     /** CONFIGURE THE SIGN IN BUTTON **/ 
     googleSignIn.setSize(SignInButton.SIZE_WIDE); 
     googleSignIn.setScopes(options.getScopeArray()); 
     googleSignIn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent signIn = Auth.GoogleSignInApi.getSignInIntent(client); 
       startActivityForResult(signIn, GOOGLE_SIGN_IN); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == GOOGLE_SIGN_IN && resultCode == RESULT_OK) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      GoogleSignInAccount account = result.getSignInAccount(); 
      String name = account.getDisplayName(); 
      Log.e("DISPLAY NAME", name); 
      String email = account.getEmail(); 
      Log.e("USER EMAIL", email); 
      String profile = String.valueOf(account.getPhotoUrl()); 
      Log.e("USER PROFILE", profile); 
     } else { 
      Toast.makeText(getApplicationContext(), "Login failed!!", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    @Override 
    protected void attachBaseContext(Context newBase) { 
     super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); 
    } 
} 

bulamadım şey:

Bu şimdiye kadar kodudur. Çoğu öğretici çoğunlukla zaten çalıştığım entegrasyon bölümü ile ilgilenir. SO hakkında bir sürü soru da tamamen farklı. Bu bağlamda hiçbir şey yok.

Hesap verilerini SharedPreferences? Ya da SDK bu parçayı kendi başına halleder.

Size önerebileceğiniz yardımlardan dolayı minnettarım.

Not: Bu soru MySQL veritabanımda bir kayıt oluşturma hakkındaki önceki sorumdan farklıdır. Çıkış butonuna kullanıcı tıklama, SharedPreferences bu verileri kaldırmak ve aynı zamanda Google'dan kullanıcı çıkış yaparken

+0

kullanımı paylaşılan tercih; ve bazı boolean depolamak ve daha sonra giriş ekranına giriş yaptıktan sonra bayrak ön kontrol edebilirsiniz; ve uygun eylemi gerçekleştirin :) – DJphy

cevap

1

Aslında, iki yanıtta önerilenden daha basit çıktı. Her iki cevap da çeşit önerileri dışında önemli bir şey sunmadığı için, biraz daha araştırdım. Bu, bu Google+ Developers Live YouTube video bulmaya yol açtı. Ve bu videonun açıklamasında, bu https://github.com/googlesamples/google-services.git'a daha fazla yol açan Quick Start bağlantısına bir bağlantı vardı.

GitHub sayfasındaki Hızlı Başlangıç ​​örneği tam olarak aradığım şeyi gösterdi.

Bu soruda yanıltıcı olabilecek ve umarım bir süre sonra onları saklayabilecek diğer kullanıcılar için OP'de yayınlanan kodun güncel bir sürümünü gönderiyorum.

Hafif yapısal değişikliklerin yanı sıra, daha önce eklenen hesabın etkin oturumunun otomatik olarak oturum açıp açmayacağını sessizce belirleyen OptionalPendingResult<GoogleSignInResult>'u kullanan onStart()'un en önemli ekleme yapıldı. Oturumun süresi dolduysa, temel olarak ek kod olmaksızın yeni bir oturum oluşturur. onStart()'daki if...else bloğu, iki olasılık için anahtardır.

public class NewLogin extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener { 

    @OnClick(R.id.googleSignIn) public void GoogleLogin() { 
     Intent signIn = Auth.GoogleSignInApi.getSignInIntent(client); 
     startActivityForResult(signIn, GOOGLE_SIGN_IN); 
    } 
    GoogleSignInOptions options; 
    GoogleApiClient client; 

    private ProgressDialog mProgressDialog; 

    private static final int GOOGLE_SIGN_IN = 101; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login); 
     ButterKnife.bind(this); 

     /** CONFIGURE THE GOOGLE SIGN IN OPTIONS **/ 
     options = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestEmail() 
       .requestProfile().build(); 
     client = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this, this) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, options) 
       .addApi(Plus.API) 
       .build(); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == GOOGLE_SIGN_IN) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      handleSignInResult(result); 
     } 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(client); 
     if (opr.isDone()) { 
      GoogleSignInResult result = opr.get(); 
      handleSignInResult(result); 
      Log.e("CACHE STATUS", "Got cached sign-in"); 
     } else { 
      showProgressDialog(); 
      opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
       @Override 
       public void onResult(GoogleSignInResult googleSignInResult) { 
        hideProgressDialog(); 
        handleSignInResult(googleSignInResult); 
       } 
      }); 
     } 
    } 

    // [START handleSignInResult] 
    private void handleSignInResult(GoogleSignInResult result) { 
     Log.d("handleSignInResult:", String.valueOf(result.isSuccess())); 
     if (result.isSuccess()) { 
      GoogleSignInAccount acct = result.getSignInAccount(); 
      Toast.makeText(getApplicationContext(), acct.getDisplayName(), Toast.LENGTH_SHORT).show(); 
      String name = acct.getDisplayName(); 
      Log.e("DISPLAY NAME", name); 
      String email = acct.getEmail(); 
      Log.e("USER EMAIL", email); 
      String profile = String.valueOf(acct.getPhotoUrl()); 
      Log.e("USER PROFILE", profile); 
      Log.e("ID", acct.getId()); 
     } 
    } 

    private void showProgressDialog() { 
     if (mProgressDialog == null) { 
      mProgressDialog = new ProgressDialog(this); 
      mProgressDialog.setMessage("Loading...."); 
      mProgressDialog.setIndeterminate(true); 
     } 

     mProgressDialog.show(); 
    } 

    private void hideProgressDialog() { 
     if (mProgressDialog != null && mProgressDialog.isShowing()) { 
      mProgressDialog.hide(); 
     } 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    @Override 
    protected void attachBaseContext(Context newBase) { 
     super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); 
    } 
} 
0

Kullanım SharedPreferences profil adı, profil resmini url vb gibi verileri saklamak için. Google'dan çıkış yapmak için bu kodu kullanın. Daha iyi

Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
    new ResultCallback<Status>() { 
     @Override 
     public void onResult(Status status) { 

     } 
    } 
); 
0

SharedPreferences kullanmaktan daha ben entegre hesapları sistemini kullanarak öneriyoruz. Bu yöntemin uygulanması, SharedPreferences'u kullanmaktan biraz daha zordur, ancak anladıktan sonra oldukça basittir. Çevrim içi eğitmenler için, like this one

SharedPreferences, uygulama hakkındaki tercihlerin (tarih veya saat formatı gibi) bulunduğu bir önekliği saklamak içindir. Ne yapmak istediğiniz hesap bilgilerini depolamaktır.