Итак, в настоящее время я внедряю подключение к API Google Диска в своем приложении, и в результате пользователь входит в систему через свою учетную запись Google Plus. Моя проблема в том, что GoogleApiClient.isConnected()
не всегда кажется точным. Проблема в том, что если я войду в систему (используя процедуру, определенную в документации Android Google Plus здесь , а затем я пытаюсь отозвать доступ приложения к учетной записи Google Play пользователя, вызвав этот метод:
/**
* Revokes the user access given to application and disconnects from their account
*/
public void onGoogleRevokeAndDisconnect()
{
if(mGoogleApiClient.isConnected()) {
//clear account
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
//revoke and disconnect
Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status arg0) {
Toast.makeText(MainActivity.this, "Account disconnected succesfully!",Toast.LENGTH_LONG).show();
mGoogleApiClient.isConnected();
//mGoogleApiClient.disconnect();//TODO: Find out why this is necessary to make this not break
//reconnect
mGoogleApiClient.connect();
//Update button states in SettingsFragment
mSettingsFragment.updateGoogleButtonVisibility();//no longer signed in
}
});
}
else
Toast.makeText(this, "You must be signed in to revoke access!", Toast.LENGTH_SHORT).show();
}
Затем, когда я проверяю значение GoogleApiClient.isConnected()
, метод возвращает true
. Очевидно, что это должно вернуть false, поскольку учетная запись была отозвана и отключена. Интересно, что когда я затем пытаюсь выйти, не входя снова, я получаю исключение, говорящее:
01-19 23:14:37.738: E/AndroidRuntime(17503):java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called.
Это вызывается при вызове этого метода (clearDefaultAccount()
) во время процесса выхода, когда учетная запись по умолчанию очищается (документация здесь, где ничего не говорится о генерации исключений) Возможно, GoogleApiClient.isConnected()
и этот метод проверяет по-разному?
Я также знаю, что привилегии учетной записи действительно БЫЛИ отозваны, поскольку, когда я закрываю приложение и снова открываю его, мне снова предлагается авторизовать мою учетную запись. А когда выхожу нормально, без отзыва доступа, все работает как надо.
Возможное исправление: я нашел исправление, которое до сих пор работает, а именно: вручную отключиться от googleApiClient с помощью mGoogleApiClient.disconnect();
в методе onResult()
revokeAccessAndDisconnect()
.