Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在后台使用GoogleAppClient刷新身份验证令牌_Android_Google Oauth_Okhttp - Fatal编程技术网

Android 如何在后台使用GoogleAppClient刷新身份验证令牌

Android 如何在后台使用GoogleAppClient刷新身份验证令牌,android,google-oauth,okhttp,Android,Google Oauth,Okhttp,我正在使用GoogleAppClient来处理OAuth令牌,而不是AccountPicker。在LoginActivity中,它优雅地处理Oauth流,我可以通过调用getAuthToken轻松地获得令牌。但像所有Oauth令牌一样,这个令牌可能会过期,我需要在没有用户干预的情况下续订,因为在登录期间,用户已经授予了应用程序的许可。我正在使用OkHttp验证器更新令牌,但问题是GoogleAppClient需要活动来处理oAuth流,但我需要在不影响令牌的情况下更新令牌 我研究的另一种方法是A

我正在使用
GoogleAppClient
来处理OAuth令牌,而不是
AccountPicker
。在LoginActivity中,它优雅地处理Oauth流,我可以通过调用getAuthToken轻松地获得令牌。但像所有Oauth令牌一样,这个令牌可能会过期,我需要在没有用户干预的情况下续订,因为在登录期间,用户已经授予了应用程序的许可。我正在使用
OkHttp验证器
更新令牌,但问题是GoogleAppClient需要活动来处理oAuth流,但我需要在不影响令牌的情况下更新令牌

我研究的另一种方法是
AccountPicker
,它不需要用户干预就可以处理它

那么,正确的方法应该是什么呢

在首次登录期间使用GoogleAppClient并将电子邮件地址存储在SharedReferences中,以及在后台使用AccountPicker重新验证令牌

FWIW,这是我的后勤工作

package in.jatindhankhar.shorl.ui;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.StringDef;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.Toast;

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.Scopes;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.Scope;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import in.jatindhankhar.shorl.R;
import in.jatindhankhar.shorl.model.AsyncResponse;
import in.jatindhankhar.shorl.network.GetToken;
import in.jatindhankhar.shorl.utils.Constants;
import in.jatindhankhar.shorl.utils.Utils;


public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, AsyncResponse {


    private static final String TAG = LoginActivity.class.getSimpleName();
    private static final int ACCOUNT_CODE = 1601;

    final private Scope URL_SCOPE = new Scope(Constants.URL_API);
    @BindView(R.id.toolbar)
    Toolbar toolbar;
    @BindView(R.id.sign_in_button)
    SignInButton signInButton;
    private GoogleApiClient mGoogleApiClient;
    private Context mContext;
    private AccountManager mAccountManager;
    private String mAuthTokenType;
    public String mAccountName;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);
        setSupportActionBar(toolbar);
        mContext = getApplicationContext();
        // Configure sign-in to request the user's ID, email address, and basic
        // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail().requestScopes(URL_SCOPE).requestId().requestId()
                .build();
        // Build a GoogleApiClient with access to the Google Sign-In API and the
        // options specified by gso.
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this /* Activity */, this /* OnConnectionFailedListener */)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

        // Prepare the account manager
        mAccountManager = AccountManager.get(mContext);
        String accountName = getIntent().getStringExtra(Constants.ARG_ACCOUNT_NAME);
        mAuthTokenType = getIntent().getStringExtra(Constants.ARG_AUTH_TYPE);
        chooseAccount();
        if (mAuthTokenType == null)
             mAuthTokenType ="Full access";
        signInButton.setSize(SignInButton.SIZE_WIDE);

    }

    @Override
    protected void onResume() {
        super.onResume();
        mContext = getApplicationContext();
    }

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

    }


    @OnClick(R.id.sign_in_button)
    public void signIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, Constants.RC_SIGN_IN);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == Constants.RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            handleSignInResult(result);
        }
    }

    private void handleSignInResult(GoogleSignInResult result) {
        Log.d(TAG, "handleSignInResult:" + result.isSuccess());
        if (result.isSuccess()) {
            // Signed in successfully, show authenticated UI.
            GoogleSignInAccount acct = result.getSignInAccount();
            if (acct != null) {
                mAccountName =  acct.getDisplayName();
            }

            new GetToken(this,acct.getAccount(),Constants.URL_SHORTNER_SCOPE,this).execute();
        } else {
            // Signed out, show unauthenticated UI.
            //updateUI(false);
        }
    }

    private void updateUI(boolean loginSuccess) {
        if(loginSuccess)
        {
            Utils.setLoginSession(mContext,mAccountName);
            startActivity(new Intent(mContext,MainActivity.class));
        }
        else
        {
            Utils.clearLoginSuccess(mContext);
        }
    }





    @Override
    public void processFinish(String output) {

        final Account account = new Account(mAccountName, Constants.PACKAGE_NAME);
        if (getIntent().getBooleanExtra(Constants.ARG_IS_ADDING_NEW_ACCOUNT, false)) {

            String authtokenType = mAuthTokenType;
            mAccountManager.addAccountExplicitly(account, "", null);
            mAccountManager.setAuthToken(account, authtokenType, output);
        } else {
            // Just reset the token
            mAccountManager.setAuthToken(account,mAuthTokenType,output);
        }
        Utils.setLoginSession(mContext,mAccountName);
        startActivity(new Intent(this,MainActivity.class));




    }

    private void chooseAccount() {
        // use https://github.com/frakbot/Android-AccountChooser for
        // compatibility with older devices
        Intent intent = AccountManager.newChooseAccountIntent(null, null,
                new String[] { "com.google" }, false, null, null, null, null);
        startActivityForResult(intent, ACCOUNT_CODE);
    }

}
这是我的GetToken任务

package in.jatindhankhar.shorl.network;

import android.accounts.Account;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;

import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;

import java.io.IOException;

import in.jatindhankhar.shorl.model.AsyncResponse;

/**
 * Created by jatin on 12/12/16.
 */

public class GetToken extends AsyncTask<Void,Void,String> {

    private static final String TAG =  GetToken.class.getSimpleName();
    private Context mAppContext;
    private Account mAccountName;
    private String AUTH_TOKEN_TYPE;
    public AsyncResponse delegate  = null;

    public GetToken(Context mAppContext,Account mAccountName,String AUTH_TOKEN_TYPE,AsyncResponse delegate)
    {
        this.mAppContext = mAppContext;
        this.mAccountName = mAccountName;
        this.AUTH_TOKEN_TYPE = AUTH_TOKEN_TYPE;
        this.delegate = delegate;
    }
    @Override
    protected String doInBackground(Void... params) {
     try {
            if(isCancelled())
            {
                Log.d(TAG,"doInBackground: task cancelled, so giving up on auth.");
                return null;
            }
         final String token = GoogleAuthUtil.getToken(mAppContext, mAccountName, AUTH_TOKEN_TYPE);
         Log.d(TAG,"So token is " + token);
         return token;
     } catch (UserRecoverableAuthException e) {
         e.printStackTrace();
     } catch (GoogleAuthException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        //super.onPostExecute(s);
        delegate.processFinish(s);

    }
}
package in.jatindhankhar.shorl.network;
导入android.accounts.Account;
导入android.content.Context;
导入android.os.AsyncTask;
导入android.util.Log;
导入com.google.android.gms.auth.GoogleAuthException;
导入com.google.android.gms.auth.GoogleAuthUtil;
导入com.google.android.gms.auth.UserRecoverableAuthException;
导入java.io.IOException;
导入in.jatindhankhar.shorl.model.AsyncResponse;
/**
*由jatin于2016年12月12日创建。
*/
公共类GetToken扩展异步任务{
私有静态最终字符串标记=GetToken.class.getSimpleName();
私有上下文映射上下文;
私人帐户名称;
私有字符串身份验证令牌类型;
公共异步响应委托=null;
公共GetToken(上下文映射上下文、帐户mAccountName、字符串身份验证\u令牌\u类型、异步响应委托)
{
this.mAppContext=mAppContext;
this.mAccountName=mAccountName;
this.AUTH\u TOKEN\u TYPE=AUTH\u TOKEN\u TYPE;
this.delegate=委托;
}
@凌驾
受保护字符串doInBackground(无效…参数){
试一试{
如果(isCancelled())
{
d(标记“doInBackground:任务已取消,因此放弃身份验证”);
返回null;
}
最终字符串标记=GoogleAuthUtil.getToken(mAppContext、mAccountName、AUTH_标记类型);
Log.d(标记“So token是”+token);
返回令牌;
}捕获(UserRecoverableAuthe异常){
e、 printStackTrace();
}捕获(googleauthe异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串s){
//super.onPostExecute(s);
代表。进程完成;
}
}