Google Fit - соединение с сервисами Google Play потеряно - PullRequest
0 голосов
/ 11 мая 2018

Я получаю эту ошибку от Google Fit API. Это не происходит каждый раз, но если я получаю эту ошибку, то я не могу получить свои данные шага, пока я не удалю приложение. Я правильно настроил аутентификацию клиента OAuth 2.0 для своего приложения. Но иногда все равно я получаю эту ошибку

"com.google.android.gms.common.api.ApiException: 8: соединение с сервисами Google Play потеряно"

когда я исследую его из документа Google, он говорит мне, что:

https://developers.google.com/android/reference/com/google/android/gms/common/api/CommonStatusCodes public static final int INTERNAL_ERROR

Как сказано в документе, когда я пытаюсь подключить googlefit по методу onfailure, тогда ничего не происходит и все еще сталкивается с этой проблемой.

Произошла внутренняя ошибка. Повторная попытка должна решить проблему. Постоянное значение: 8

здесь блок кода и иногда запускается метод onfailure

  DataReadRequest readRequest = new DataReadRequest.Builder()
                    .aggregate(DataType.TYPE_DISTANCE_DELTA, DataType.AGGREGATE_DISTANCE_DELTA)
                    .bucketByTime(1, TimeUnit.DAYS)
                    .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                    .build();

            Fitness.getHistoryClient(MainActivity.activity, GoogleSignIn.getLastSignedInAccount(MainActivity.activity))
                    .readData(readRequest)
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Crashlytics.log(Log.ASSERT, "fail  :", e.toString());
                        }
                    })
                    .addOnSuccessListener(new OnSuccessListener<DataReadResponse>()
                    {
                        @Override
                        public void onSuccess(DataReadResponse dataReadResponse)
                        {
                            for (Bucket bucket : dataReadResponse.getBuckets())
                            {

                                for (DataSet dataSet : bucket.getDataSets())
                                {
                                    for (DataPoint dataPoint : dataSet.getDataPoints())
                                    {

                                        User.current().userFitnessData.totalDistance = dataPoint.getValue(dataPoint.getDataType().getFields().get(0)).asFloat();
                                    }
                                }
                            }

                            Crashlytics.log(Log.ASSERT, "Todays Steps", User.current().userFitnessData.getTodaysSteps() + "");
                            if (callBack != null)
                                callBack.onDistanceDataReceived();
                        }
                    });

1 Ответ

0 голосов
/ 16 мая 2018

Я не уверен, поможет ли это, но я всегда проверяю эту функцию перед вызовом каждого Fitness Api.

public boolean isGoogleAccountSignIn(int requestCode){
    // permission you need
    FitnessOptions fitnessOptions = FitnessOptions.builder()
            .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
            .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_WRITE)
            .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
            .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_WRITE)
            .addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_READ)
            .addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_WRITE)
            .build();

    if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(context), fitnessOptions)) {
        GoogleSignIn.requestPermissions((Activity) context, requestCode, GoogleSignIn.getLastSignedInAccount(context), fitnessOptions);
        return false;
    } else {
        return true;
    }
}

В MainActivity я делаю вот так каждое действие:

if (fitnessManager.isGoogleAccountSignIn(FitnessManager.REQUEST_CODE_ASK_ACCOUNT)) {
    // use Fitness Api you need
    fitnessManager.getDailyDataFromMobileInSegment(getLastWeekTime(), getTodayEndTime(), false);
}

Версии play-services-fitness и play-services-auth, которые я использую, более 11.6.0.

...