使用Google登录登录后自动登录

时间:2016-03-26 12:41:47

标签: android google-plus google-login

我已成功将使用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数据库中创建记录的问题不同。

3 个答案:

答案 0 :(得分:1)

实际上,事实证明,它比两个答案中的建议更简单。由于这两个答案并没有提供任何实质性的东西,除了各种建议之外,我还搜索了一些。这导致找到了这个Google+ Developers Live YouTube video。在此视频的说明中,链接指向 Quick Start 链接,该链接进一步导致此https://github.com/googlesamples/google-services.git

GitHub页面上的“快速入门”示例正好展示了我的目标。

我发布了OP中发布的代码的更新版本,供其他可能偶然发现这个问题的用户使用,希望能节省一些时间。

除了轻微的结构更改之外,最重要的添加是使用onStart()的{​​{1}},它会静默地确定以前签名的帐户的活动会话是否存在,在这种情况下,它会登录自动。如果会话已过期,它基本上会创建一个没有任何其他代码的新会话。 OptionalPendingResult<GoogleSignInResult>中的if...else块是两种可能性的关键。

onStart()

答案 1 :(得分:0)

使用SharedPreferences存储个人资料名称,个人资料图片网址等数据。 当用户单击“注销”按钮时,从SharedPreferences中删除这些数据,并从Google注销用户。 使用此代码从Google退出。

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

         }
     }
);

答案 2 :(得分:0)

比使用SharedPreferences更好,我建议使用综合帐户系统。查看AccountManager

的文档

以这种方式实现它比使用SharedPreferences要困难一些,但一旦你理解它就很简单了。您可以在线找到几个教程like this one

select * from [publicdata:samples.__TABLES__] 用于存储关于应用程序的偏好(如日期或时间格式)。您要做的是存储帐户信息