#android #api #google-fit #google-fit-sdk
#Android #API #google-fit #google-fit-sdk
Вопрос:
Простите за грубость, я совершенно новичок в Android и API Google. У меня есть следующий код, который подключается к GoogleFit. У меня также есть ключ API и Oauth.
Где / как мне использовать ключ API и Oauth? Множество руководств о том, как их получить, но никакой информации о том, куда их поместить / как использовать в приложении.
И как мне на самом деле использовать возвращенные шаги. Я настроил глобальную:
private int steps;
а затем попробуйте установить его через:
steps = (int)total;
но это ничего не дает.
Вот остальная часть функции. Как мне на самом деле получить из этого количество шагов.
private void accessGoogleFit() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
long endtime = cal.getTimeInMillis();
cal.add(Calendar.YEAR, -1);
long starttime = cal.getTimeInMillis();
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(starttime, endtime, TimeUnit.MILLISECONDS)
.build();
Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
.readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA)
.addOnSuccessListener(new OnSuccessListener<DataSet>() {
@Override
public void onSuccess(DataSet dataSet) {
Log.d("Status", "Success");
long total = dataSet.isEmpty()
? 0
: dataSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
Log.d("Steps ", String.valueOf(total));
steps = (int)total; //Trying to get steps here
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("Status", "Failure", e);
}
})
.addOnCompleteListener(new OnCompleteListener<DataSet>() {
@Override
public void onComplete(@NonNull Task<DataSet> task) {
Log.d("Status", "Complete");
}
});
}
Я прошелся по официальной документации и StackOverflow. Но, похоже, Google внес большие изменения в API в прошлом году, и поэтому большинство вещей устарели, включая собственные руководства Google (опубликованные в 2015 году). И несколько мест, в которых есть обновленная документация, предоставляют фрагменты кода, и я понятия не имею, как их использовать или куда их поместить.
Комментарии:
1. вы проверили, есть ли в fit api какие-либо данные?
2. Я не знаю, как это сделать. Как мне это проверить?
3. если вы попробуете это на реальном устройстве, установите приложение Google fit и откройте его. если он показывает некоторые данные
4. Теперь я смог проверить ваш запрос в своем приложении, он работает, и покажите мне это
dataReadResponse.getBuckets().get(0));
: мой журналBucket{startTime=1551260296979, endTime=1551865096979, activity=0, dataSets=[DataSet{d:step_count.delta:gms:aggregated [RawDataPoint{[21648]@[1551260985001540984, 1551864350023920959](0,1)}]}], bucketType=time, serverHasMoreData=false}
5. мой обратный вызов —
.addOnSuccessListener(new OnSuccessListener<DataReadResponse>()
Ответ №1:
Вот как я создаю свой запрос Google Fit API: запрос с FitnessOptions, такими как
FitnessOptions fitnessOptions = FitnessOptions.builder()
.addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
.addDataType(DataType.TYPE_DISTANCE_DELTA, FitnessOptions.ACCESS_READ)
.addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
.build();
вам нужно будет запросить GoogleSignIn.requestPermissions
И моя функция запроса
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
long endTime = cal.getTimeInMillis();
cal.add(Calendar.WEEK_OF_YEAR, -1);
long startTime = cal.getTimeInMillis();
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
// .read(DataType.TYPE_STEP_COUNT_DELTA)
.bucketByTime(8, TimeUnit.DAYS)
.enableServerQueries()
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
Fitness.getHistoryClient(
this,
GoogleSignIn.getLastSignedInAccount(this))
.readData(readRequest)
.addOnSuccessListener(new OnSuccessListener<DataReadResponse>() {
@Override
public void onSuccess(DataReadResponse dataReadResponse) {
Log.d("TAG_F", "onSuccess: 1 " dataReadResponse.toString());
Log.d("TAG_F", "onSuccess: 1 " dataReadResponse.getStatus());
Log.d("TAG_F", "onSuccess: 1 " dataReadResponse.getDataSet(DataType.TYPE_STEP_COUNT_DELTA));
Log.d("TAG_F", "onSuccess: 1 " dataReadResponse.getBuckets().get(0));
Log.d("TAG_F", "onSuccess: 1 " dataReadResponse.getBuckets().get(0).getDataSets().size());
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("TAG_F", "onFailure: 1 " e.getMessage());
}
})
.addOnCompleteListener(new OnCompleteListener<DataReadResponse>() {
@Override
public void onComplete(@NonNull Task<DataReadResponse> task) {
Log.d("TAG_F", "onComplete: 1 ");
}
});
Комментарии:
1. Я думаю, что это работает… но я все еще не уверен, как установить int stepNumber …… могу ли я сделать что-то вроде stepNumber = dataReadResponse.getDataSet(тип данных.TYPE_STEP_COUNT_DELTA)); Или мне нужно как-то извлечь его из fitnessOptions?
2. чтобы уточнить, как мне на самом деле преобразовать этот ответ в простое целое число или Long, которое я могу использовать в своем приложении?
3. легко)) вы вернетесь к
.readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA)
и.addOnSuccessListener(new OnSuccessListener<DataSet>()
. В вашем результирующем наборе данных вы можете получить:dataSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt());
4. Когда я пытаюсь установить int steps = DataSet.getDataPoints().get(0).GetValue (поле. FIELD_STEPS).asInt()); он компилируется и запускается… но сбой в той части, где я пытаюсь установить для TextView значение .setText (steps); Я думаю, что мусор хранится в steps? Нужно ли мне указывать ему где-то использовать ключ API? или Oauth? Потому что я еще нигде их не разместил, поскольку понятия не имею, куда они ведут.
5. ? Я также использую Android Studio на win 10, и у меня есть журналы на всех моих реальных устройствах.