2016-03-26 7 views
0

Я успешно интегрировал Войти с помощью функции Google в приложение. Мой вопрос заключается в том, как хранить эту информацию, чтобы пользователь мог пропустить экран входа в следующий раз и перейти прямо в приложение без необходимости входа в систему снова?Войти автоматически после входа в систему Google Войти

Это код до сих пор:

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

я не нашел ничего о сохраняющиеся Google Войти, когда пользователь закрывает приложение и открывает его в любое время позже. Большинство руководств в основном касаются части интеграции, в которой я уже работал. Куча вопросов на SO тоже совершенно разные. Ничего в этом контексте.

Должен ли я хранить данные учетной записи, например, SharedPreferences? Или SDK обрабатывает эту часть сам по себе.

Я ценю любую помощь, которую вы можете предложить.

P.S .: Этот вопрос отличается от моего предыдущего вопроса о создании записи в моей базе данных MySQL.

+0

использовать общие предпочтения; и сохраните некоторые логические и позже, когда вы заходите на экран входа в систему, вы можете проверить флаг в pref; и выполнить соответствующее действие :) – DJphy

ответ

1

На самом деле, оказалось, это было проще, чем было предложено в двух ответах. Поскольку оба ответа действительно не предлагали ничего существенного, кроме предложений рода, я искал еще несколько. Это привело к нахождению этого Google+ Developers Live YouTube video. И в описании этого видео была ссылка на Quick Start ссылка, которая привела к этому https://github.com/googlesamples/google-services.git.

Образец быстрого запуска на странице GitHub продемонстрировал именно то, что я искал.

Я отправляю обновленную версию кода, отправленного в OP для других пользователей, которые могут наткнуться на этот вопрос и сэкономить некоторое время, надеюсь.

Помимо незначительных структурных изменений, наиболее важным дополнением является onStart(), который использует OptionalPendingResult<GoogleSignInResult>, который молча определяет, существует ли активная сессия ранее подписанного счета, и он будет автоматически входить в систему. Если сеанс истек, он в основном создает новый сеанс без какого-либо дополнительного кода. Блок if...else в onStart() является ключом к двум возможностям.

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

Использование SharedPreferences для хранения данных, как имя профиля, изображение профиля URL и т.д. Когда пользователь нажимает на кнопку Выход, удалить эти данные из SharedPreferences, а также выход из системы пользователя от Google. Используйте этот код для выхода из Google.

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

     } 
    } 
); 
0

лучше, чем при использовании SharedPreferences я бы рекомендовал использовать комплексную систему счетов. Проверьте документацию на AccountManager

Реализация этого способа немного сложнее, чем просто использовать SharedPreferences, но как только вы поймете, что это довольно просто. Вы можете найти несколько обучающих программ онлайн like this one

SharedPreferences предназначено для хранения информации о предпочтениях относительно настроек приложения (например, даты или времени). Что вы хотите сделать, так это сохранить информацию об учетной записи

Смежные вопросы