Как отключить Google Fit и отозвать разрешения у самого приложения

Я настроил приложение, которое подключается к Google Fit, считывает и записывает некоторые данные о теле пользователя. Когда пользователь отключает Google Fit в настройках приложений, я пытаюсь отозвать разрешения для своих приложений, позвонив:

public void disableGoogleFit(){
    if(!mClient.isConnected()){
        Log.e(TAG, "Google Fit wasn't connected");
        return;
    }
    PendingResult<Status> pendingResult = Fitness.ConfigApi.disableFit(mClient);

    pendingResult.setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(Status status) {
            if(status.isSuccess()) {
                Log.i(TAG, "Google Fit disabled");
            }else{
                Log.e(TAG, "Google Fit wasn't disabled " + status);
            }
        }
    });
}

Несмотря на то, что я мог успешно читать/записывать данные, отключение Fit возвращает мне ошибку:

Google Fit wasn't disabled Status
{statusCode=unknown status code: 5010, resolution=null}

Edit1: Добавлен целый метод, в котором видно, что клиент подключен в тот момент, когда я пытаюсь отключить Fit.


person Jaroslav    schedule 25.11.2014    source источник
comment
был ли ваш клиент подключен во время вызова, чтобы отключить?   -  person SimpleGuy    schedule 25.11.2014
comment
Когда вы авторизованы для доступа к Fit, видите ли вы свое приложение в приложении «Настройки Google» в разделе Google Fit › Подключенные приложения и устройства? Если нет, попробуйте выполнить шаги по включению фитнес-API на странице developers.google. com/fit/android/   -  person saxman    schedule 15.01.2015
comment
Столкнулся с той же проблемой с неопубликованным приложением, которое я тестирую через USB. Он работает, как и ожидалось, и сначала меня попросили разрешить ему доступ, но этот грант не отображается в ваш аккаунт. Так что интересно, судя по комментариям, отображается ли авторизованное приложение Google Fit только после публикации и общедоступности. Если это так, то, возможно, ошибка будет сохраняться до тех пор, пока она не станет общедоступной опубликованной версией.   -  person arober11    schedule 11.02.2015


Ответы (6)


В настоящее время с библиотекой 15.0.1 это легко сделать:

fun disconnect(context: Context) {
    val fitnessOptions = FitnessOptions.builder()
            .addDataType(DataType.TYPE_WORKOUT_EXERCISE, FitnessOptions.ACCESS_READ)
            .build()
    val signInOptions = GoogleSignInOptions.Builder().addExtension(fitnessOptions).build()
    val client = GoogleSignIn.getClient(context, signInOptions)
    client.revokeAccess()
}
person a.ch.    schedule 11.05.2018
comment
Я пробовал это, но продолжаю получать NullPointerException: Attempt to invoke interface method 'int com.google.android.gms.auth.api.signin.GoogleSignInOptionsExtension.getExtensionType()' on a null object reference - person JHowzer; 20.06.2019
comment
Спасибо, приятель, это помогло мне отозвать диалоговое окно разрешения - person Rajesh Naddy; 27.02.2020

Я столкнулся с этой проблемой, если отменил доступ на стороне операции Google Fit, а не вызывал метод disableFit(). При использовании метода disableFit() все отключалось очень хорошо, а повторное подключение было легкой прогулкой. Но когда Google Fit отозвал доступ, он не устранил существующий OAuth, поэтому вы застряли в подвешенном состоянии. Limbo, когда вы отключены, но вызов OAuth не выдается, поэтому вы продолжаете получать ошибку 5010.

Единственное решение, которое я придумал, — это бросить вызов OAuth, подключившись к другой учетной записи. Тогда ты был в порядке. Однако это похоже на проблему в Google Fit, а не на стороне клиента.

person astryk    schedule 17.02.2015

Я также столкнулся с подобной проблемой.

Эта проблема возникает, если приложение не зарегистрировано должным образом в консоли разработчика Google.

Я думаю, вы зарегистрировали приложение в консоли разработчика Google, используя отпечаток сертификата производственного хранилища ключей (SHA1), где вы тестируете его в приложении с хранилищем ключей отладки.

Выполните следующие шаги:

  1. Создайте еще один идентификатор клиента, используя отпечаток сертификата хранилища ключей отладки (SHA1).
  2. Удалите существующее приложение.
  3. Установите приложение и подключитесь к Google Fit.
  4. Проверьте приложение Google Fit и убедитесь, что ваше приложение указано как связанное приложение (... > Настройки > Связанные приложения > Связанные приложения и устройства).
  5. Теперь запустите приведенный выше код, и он будет работать !!!
person Sumoanand    schedule 08.02.2015

Использовать это

Fitness.getConfigClient(это, GoogleSignIn.getLastSignedInAccount(это)).disableFit()

Проверьте здесь

person manoj kiran    schedule 26.02.2020

Согласно форуму разработчиков Android

https://developer.android.com/reference/com/google/android/gms/fitness/ConfigApi.html

открытый статический окончательный int APP_NOT_FIT_ENABLED

Код состояния означает, что приложение не найдено в списке подключенных приложений в Google Fit. Означает, что либо доступ к приложению уже отозван, либо приложение не зарегистрировано в консоли разработчика.

Постоянное значение: 5010 (0x00001392)

и для вызова disableFit клиент должен быть подключен во время вызова

public abstract PendingResult<Status> disableFit (GoogleApiClient client)

Отключает Google Fit для приложения. Может использоваться для отзыва всех предоставленных разрешений доступа OAuth для приложения и последующего удаления всех существующих подписок и регистраций приложения.

Параметры

client существующий GoogleApiClient. Должен быть подключен во время этого звонка.

person SimpleGuy    schedule 25.11.2014
comment
Как я уже писал в своем вопросе - клиент подключается, когда я пытаюсь отключиться. - person Jaroslav; 25.11.2014
comment
Для отладки можете попробовать это if(mClient.isConnected()) --> try disableFIT only then else print 'Client not connected' - person SimpleGuy; 25.11.2014

После отключения звонка

mClient.disconnect();

Что работает для меня

person Vaisakh N    schedule 27.10.2015