Я ищу свежие идеи о страшной ошибке 5005: «Код состояния означает, что при попытке получить токен OAuth ». когда мой Watch Face пытается подключить Google API, созданный с помощью различных API-интерфейсов Fitness. Это все работает в моем локальном тестировании И когда я загружаю и запускаю свою версию RELEASE (бета). Однако, когда мой первый тестер попробовал это, он получает этот код ошибки при попытке подключить API.Google Исправлены ошибки авторизации (с ошибками 5005, 5000 и 5015) в приложении WatchFace, WatchConfig и сопутствующем приложении
UPDATE2: Я теперь отслеживал, что происходит, поэтому я собираюсь перечислить здесь свой последний рабочий код, а затем поговорить в ответ о том, что я обнаружил.
Существует 3 разных случая, когда я подключаюсь к API Google: Watch Face (рефери таймер: https://play.google.com/store/apps/details?id=com.pipperpublishing.soccerrefpro), связанный с ним Watch Config и приложение-компаньон на мобильном телефоне (телефон).
вахты:
private GoogleApiClient buildGoogleClient() {
final GoogleApiClient googleApiClient;
final GoogleApiClient.Builder googleApiClientBuilder = new GoogleApiClient.Builder(RefWatchFaceService.this);
//Common components of the GoogleClient
googleApiClientBuilder
.addApi(Wearable.API)
.addApi(Fitness.SESSIONS_API) //set Session for each period)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.useDefaultAccount();
if (RefWatchUtil.isRefWatchPro()) {
googleApiClientBuilder
.addApi(Fitness.RECORDING_API) //records low power information
.addApiIfAvailable(Fitness.HISTORY_API
,new Scope(Scopes.FITNESS_ACTIVITY_READ)
,new Scope(Scopes.FITNESS_LOCATION_READ)
)
.addApiIfAvailable(Fitness.SENSORS_API
,new Scope(Scopes.FITNESS_ACTIVITY_READ)
,new Scope(Scopes.FITNESS_LOCATION_READ)
)
;
}
googleApiClient = googleApiClientBuilder.build();
return googleApiClient;
}
Обратите внимание, что я не прошу разрешения WRITE для HISTORY_API. Когда я потом попытаться вставить SPEED и МЕСТОНАХОЖДЕНИЕ пригодности данных в магазине Google Fit, я использую этот код:
private void insertFitnessDataSetBatch(final DataSet batchDataSet) {
final long batchStartTimeMillis = batchDataSet.getDataPoints().get(0).getTimestamp(TimeUnit.MILLISECONDS);
final long batchEndTimeMillis;
long tempEndTimeMillis = batchDataSet.getDataPoints().get(batchDataSet.getDataPoints().size()-1).getTimestamp(TimeUnit.MILLISECONDS);
//It's possible that this is called with one data point, in which case the Fitness insert will choke on same start and end time
if (tempEndTimeMillis > batchStartTimeMillis) {
batchEndTimeMillis = tempEndTimeMillis;
} else {
batchEndTimeMillis = batchStartTimeMillis + 1;
}
try {
Fitness.HistoryApi.insertData(mGoogleApiClient, batchDataSet)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(@NonNull Status status) {
//Sometimes there is an error but the data was inserted anyway
readInsertedFitnessData(batchStartTimeMillis, batchEndTimeMillis, batchDataSet.getDataType());
if (!status.isSuccess()) {
Log.d(TAG, String.format("Inserting data type %s returned status Code %d (%s)",
batchDataSet.getDataType().getName(), status.getStatusCode(), status.getStatusMessage()));
}
}
});
} catch (RuntimeException e) {
Log.e(TAG, String.format("There was a runtime exception inserting the data set batch for type %s: %s",
batchDataSet.getDataType().getName(), e.getLocalizedMessage()));
}
}
Запомнить эти считывание код, потому что я буду ссылаться на результатах в моем ответе.
Часы Config Разница здесь в том, что часы Config расширяет FragmentActivity:
private GoogleApiClient buildGoogleClient() {
final GoogleApiClient googleApiClient;
final GoogleApiClient.Builder googleApiClientBuilder = new GoogleApiClient.Builder(this);
//Common components of the GoogleClient
googleApiClientBuilder
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.useDefaultAccount();
if (RefWatchUtil.isRefWatchPro()) {
googleApiClientBuilder
.addApiIfAvailable(Fitness.HISTORY_API
,new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)
,new Scope(Scopes.FITNESS_LOCATION_READ_WRITE)
);
}
googleApiClient = googleApiClientBuilder.build();
return googleApiClient;
}
Обратите внимание, здесь я прошу read_write областей, хотя в действительности я не ссылаться на HISTORY_API (или любой фитнес Api) в Config. Тем не менее, пользователь должен войти в Watch COnfig, чтобы включить мою настройку (KEY_FITNESS_?
ниже), которая контролирует считывание данных датчиков в Watch Face.
Наконец, Mobile
private GoogleApiClient buildGoogleClient() {
final GoogleApiClient.Builder googleApiClientBuilder;
googleApiClientBuilder = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApiIfAvailable(Wearable.API); //just in case you are using this without a Wear device
if (RefWatchUtil.isRefWatchPro()) {
googleApiClientBuilder
//.addApiIfAvailable(Fitness.SESSIONS_API)
.addApiIfAvailable(Fitness.HISTORY_API, //to read Location and other data per game
new Scope(Scopes.FITNESS_ACTIVITY_READ),
new Scope(Scopes.FITNESS_LOCATION_READ))
.useDefaultAccount();
}
return googleApiClientBuilder.build();
}
Исходя из ошибки: [UNKNOWN_AUTH_ERROR] (https://developers.google.ком/Android/справочник/COM/Google/Android/GMS/фитнес/FitnessStatusCodes). Дважды проверьте, следуете ли вы руководству в [Авторизация на Android] (https://developers.google.com/fit/android/authorization), и вы также можете проверить это руководство для использования [Объединить несколько файлов манифеста] (https://developer.android.com/studio/build/manifest-merge.html). Также вы можете включить код для авторизации вашего приложения. Надеюсь это поможет –