GoogleApiClient.isConnected() возвращает true после вызова Plus.AccountApi.revokeAccessAndDisconnect()

Итак, в настоящее время я внедряю подключение к 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().


person bdnwang    schedule 20.01.2015    source источник


Ответы (2)


Я думаю, вам не нужно использовать revokeAccessAndDisconnect() вместо disconnect(), так как я утверждаю, что он все еще связан со старыми данными. Простой код выглядит так:

if(mGoogleApiClient.isConnected()) {
    mGoogleApiClient.clearDefaultAccount(); 
    mGoogleApiClient.disconnect();
  }
person Dayton Wang    schedule 21.01.2015
comment
Этот код действительно работает, но это действительно то, что я делаю в своем методе выхода, он отключает текущую учетную запись, но на самом деле он не отменяет доступ, который пользователь предоставил моему приложению. Когда они просто выходят из системы, они могут снова войти в учетную запись без повторной авторизации, тогда как при отмене и отключении они отменяют все разрешения, которые у меня есть, связанные с данными их учетной записи. - person bdnwang; 22.01.2015

Я попытался сделать в AsyncTask, и это РАБОТАЛО.

public  class RevokeAccess extends AsyncTask<String, Void, Void> {
    private  ProgressDialog progressDialog;
    private Context mContext;

    public RevokeAccess(Context context){
        mContext = context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(mContext);
        progressDialog.setMessage("Loading...");
        progressDialog.show();
    }


    protected Void doInBackground(String... urls) {

            Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
            Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient);
            mGoogleApiClient.disconnect();

        return null;
    }

    protected void onPostExecute(Void result) {
        progressDialog.dismiss();
        FragmentDrawer.mDrawerLayout.closeDrawers();
        ConnectActivity connectActivity = new ConnectActivity();
        getSupportFragmentManager().beginTransaction().replace(R.id.container_body, connectActivity).commit();
    }


}
person Khalil Kitar    schedule 10.10.2015