2016-08-29 2 views
1

В моем приложении, я реализовал GoogleSignInApi, с этим кодом:Android | Google Api для входа в аккаунт иногда не работает

в OnCreate:

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(getString(R.string.server_client_id)) 
       .requestEmail() 
       .build(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this /* FragmentActivity */, null /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 

в AsyncTask

 if (mGoogleApiClient != null) 
      mGoogleApiClient.connect(); 
     if (mGoogleApiClient != null) { 
      ConnectionResult result = mGoogleApiClient.blockingConnect(); 
      if(result.isSuccess()){ 
       GoogleSignInResult googleSignInResult = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient).await(); 
       GoogleSignInAccount account = googleSignInResult.getSignInAccount(); 
       authToken = account.getIdToken(); 
      }else { 
       return null; 
      } 
     }else{ 
      return null; 
     } 

The приложение сбой «При попытке вызвать виртуальный метод» java.lang.String com.google.android.gms.auth.api.signin.GoogleSignInAccount.getIdToken() для ссылки на нулевой объект »(учетная запись null!)
Теперь я Объявление ded if (account! = null) {get error}, но почему учетная запись может быть нулевой, если «result.isSuccess()»?

ответ

4

result - это только переменная, содержащая результат , соединяющий с API. Это еще не означает аутентификации. Только после подключения вы можете войти. Однако учетные данные могут быть неверными, поэтому вы получаете результат null.

+0

Хорошо, спасибо ... Но пользователь скажет мне, что он аутентифицирован, а приложение сбой 'на account.getIdToken()'. С моим устройством или эмулятором у меня нет этой проблемы. Я понятия не имею, что делать. –

3
You can use the following code for Google login: 

    protected void onActivityResult(int requestCode, int responseCode, Intent intent) { 
      if (requestCode == RC_SIGN_IN) { 
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(intent); 
        if (result.isSuccess()) { 
        GoogleSignInAccount acct = result.getSignInAccount(); 
        } 
      } 
     } 

GoogleSignInAccount предоставит вам все данные учетной записи.

+0

Я делаю это в первый раз, чтобы запросить доступ к пользователю. Затем я использую 'Auth.GoogleSignInApi.silentSignIn (mGoogleApiClient) .await()', чтобы получить IdToken и иногда не работает. –

+2

Итак, в первый раз введите idToken form googleSignInAccount .getIdToken(); и хранить его где-нибудь. –

+0

Mh ... И маркер всегда действует? –

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