沉默的谷歌登录android后台服务

sar*_*pta 7 android android-service google-api-client google-signin

我在我的Android应用程序中运行后台服务.我使用从登录活动中获取的IdToken在后端服务器上进行身份验证.该服务正在START_STICKY模式下运行,因此即使应用程序关闭,该服务仍会在后台运行以从后端服务器获取任何通知.我面临的问题是当IdToken过期时,我无法在服务中更新它.如果令牌已过期,则回调函数不会收到任何结果.如果令牌尚未过期,它会立即获得结果.

这是signIn函数和handleSignIn函数的代码.

private void signIn() {
        new Thread(new Runnable() { public void run() {
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .requestIdToken("<My server_client_id>")
                .build();
        GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

        OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn
                (mGoogleApiClient);
        if (opr.isDone()) {
            // If the user's cached credentials are valid, the OptionalPendingResult will be "done"

            // and the GoogleSignInResult will be available instantly.
            Log.d(TAG, "Got cached sign-in");
            GoogleSignInResult result = opr.get();
            handleSignInResult(result);
        } else {
            // If the user has not previously signed in on this device or the sign-in has
            // expired,
            // this asynchronous branch will attempt to sign in the user silently.  Cross-device
            // single sign-on will occur in this branch.
            Log.d(TAG, "had to sign in again");
            opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
                @Override
                public void onResult(GoogleSignInResult googleSignInResult) {
                    Log.d(TAG, "got result");
                    handleSignInResult(googleSignInResult);
                }
            });
        }}}).start();
    }
Run Code Online (Sandbox Code Playgroud)

Ell*_*ott 1

尝试移动

opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
            @Override
            public void onResult(GoogleSignInResult googleSignInResult) {
                Log.d(TAG, "got result");
                handleSignInResult(googleSignInResult);
            }
        });
Run Code Online (Sandbox Code Playgroud)

到其 if 语句之前。我知道谷歌文档说要按照你的方式去做,我也做了同样的事情,直到我意识到如果 ResultCallback 只在 else 块中初始化,在opr已经运行之后,它永远不会被调用。

遵循我的建议后,您的代码应该如下所示:

private void signIn() {
    new Thread(new Runnable() { public void run() {
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken("<My server_client_id>")
            .build();
    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();

    OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn
            (mGoogleApiClient);
    opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
            @Override
            public void onResult(GoogleSignInResult googleSignInResult) {
                Log.d(TAG, "got result");
                handleSignInResult(googleSignInResult);
            }
        });}}).start();
}
Run Code Online (Sandbox Code Playgroud)