Я пытаюсь написать простое приложение, которое извлекает данные из GoogleFit на Android, но возвращаемые мной наборы данных не содержат никаких точек данных, даже если я добавил данные вручную в Google Fit . Мой код ниже можно найти ниже. Я запускаю это на эмуляторе Android, но у меня сложилось впечатление, что я все еще могу получать данные, потому что я использовал .enableServerQueries()
в DataReadRequest.Builder
.
MainActivity:
public void accessGoogleFit(GoogleSignInAccount account) {
Fitness.getRecordingClient(this, account)
.subscribe(DataType.TYPE_ACTIVITY_SAMPLES);
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
long endTime = cal.getTimeInMillis();
cal.add(Calendar.YEAR, -1);
long startTime = cal.getTimeInMillis();
GoogleApiClient client = new GoogleApiClient.Builder(this)
.addApi(Fitness.HISTORY_API)
.addScope(Fitness.SCOPE_ACTIVITY_READ)
.build();
client.connect();
DataReadRequest readRequest = new DataReadRequest.Builder()
.read(DataType.TYPE_STEP_COUNT_DELTA)
.read(DataType.AGGREGATE_ACTIVITY_SUMMARY)
.enableServerQueries()
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
.readData(readRequest)
.addOnCompleteListener(new OnCompleteListener<DataReadResponse>() {
@Override
public void onComplete(@NonNull Task<DataReadResponse> task) {
System.out.println("Successful: " + task.isSuccessful());
if (task.isSuccessful()) {
List<DataSet> dataSets = task.getResult().getDataSets();
System.out.println("Size: " + dataSets.size());
for (DataSet set : dataSets) {
dumpDataSet(set);
}
}
}
});
}
private static void dumpDataSet(DataSet dataSet) {
Log.i("GoogleFitData", "Data returned for Data type: " + dataSet.getDataType().getName());
DateFormat dateFormat = getTimeInstance();
for (DataPoint dp : dataSet.getDataPoints()) {
Log.i("GoogleFitData", "Data point:");
Log.i("GoogleFitData", "\tType: " + dp.getDataType().getName());
Log.i("GoogleFitData", "\tStart: " + dateFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
Log.i("GoogleFitData", "\tEnd: " + dateFormat.format(dp.getEndTime(TimeUnit.MILLISECONDS)));
for (Field field : dp.getDataType().getFields()) {
Log.i("GoogleFitData", "\tField: " + field.getName() + " Value: " + dp.getValue(field));
}
}
}
Я заметил в logcat, есть ошибки, связанные с тем, что мой файл ключа устройства не найден, но я не знаю, как это исправить. Я не уверен, что это связано, потому что запрос GoogleFit возвращается успешно, просто без каких-либо данных. Я включил GoogleFit API в Google Cloud Console и вставил в приложение сертификат и пакет отпечатков пальцев.
Logcat:
2018-11-03 15:17:31.749 26017-26446/com.google.android.gms.persistent W/GLSUser: [AppCertManager] IOException while requesting key:
java.io.IOException: Invalid device key response.
at hdw.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):12)
at hdw.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):64)
at hdw.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):20)
at hdu.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):4)
at hdr.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):2)
at hdp.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):10)
at hdp.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):22)
at pfn.d(:com.google.android.gms@12874026@12.8.74 (040700-204998136):3)
at pgg.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):9)
at pgg.b(:com.google.android.gms@12874026@12.8.74 (040700-204998136):7)
at pgg.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):23)
at pgg.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):33)
at utl.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):36)
at vvf.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):56)
at vsz.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):206)
at vpw.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):30)
at vpu.a(:com.google.android.gms@12874026@12.8.74 (040700-204998136):107)
at vpp.run(:com.google.android.gms@12874026@12.8.74 (040700-204998136):10)
at pmz.run(:com.google.android.gms@12874026@12.8.74 (040700-204998136):28)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at ptb.run(:com.google.android.gms@12874026@12.8.74 (040700-204998136))
at java.lang.Thread.run(Thread.java:761)
2018-11-03 15:17:31.749 26017-26446/com.google.android.gms.persistent W/GLSUser: [DeviceKeyStore] Cannot load key: Device key file not found.
2018-11-03 15:17:31.854 26017-26757/com.google.android.gms.persistent W/Conscrypt: Could not set socket write timeout: java.lang.reflect.InvocationTargetException
2018-11-03 15:17:31.854 26017-26757/com.google.android.gms.persistent W/Conscrypt: at java.lang.reflect.Method.invoke(Native Method)
2018-11-03 15:17:31.854 26017-26757/com.google.android.gms.persistent W/Conscrypt: at com.google.android.gms.org.conscrypt.Platform.setSocketWriteTimeout(:com.google.android.gms@12874026@12.8.74 (040700-204998136):13)
2018-11-03 15:17:31.854 26017-26757/com.google.android.gms.persistent W/Conscrypt: Caused by: android.system.ErrnoException: setsockopt failed: EBADF (Bad file descriptor)
2018-11-03 15:17:31.854 26017-26757/com.google.android.gms.persistent W/Conscrypt: at libcore.io.Posix.setsockoptTimeval(Native Method)
2018-11-03 15:17:31.854 26017-26757/com.google.android.gms.persistent W/Conscrypt: at libcore.io.ForwardingOs.setsockoptTimeval(ForwardingOs.java:157)
2018-11-03 15:17:31.915 26017-26757/com.google.android.gms.persistent W/Conscrypt: Could not set socket write timeout: java.lang.reflect.InvocationTargetException
2018-11-03 15:17:31.915 26017-26757/com.google.android.gms.persistent W/Conscrypt: at java.lang.reflect.Method.invoke(Native Method)
2018-11-03 15:17:31.915 26017-26757/com.google.android.gms.persistent W/Conscrypt: at com.google.android.gms.org.conscrypt.Platform.setSocketWriteTimeout(:com.google.android.gms@12874026@12.8.74 (040700-204998136):13)
2018-11-03 15:17:31.915 26017-26757/com.google.android.gms.persistent W/Conscrypt: Caused by: android.system.ErrnoException: setsockopt failed: EBADF (Bad file descriptor)
2018-11-03 15:17:31.915 26017-26757/com.google.android.gms.persistent W/Conscrypt: at libcore.io.Posix.setsockoptTimeval(Native Method)
2018-11-03 15:17:31.915 26017-26757/com.google.android.gms.persistent W/Conscrypt: at libcore.io.ForwardingOs.setsockoptTimeval(ForwardingOs.java:157)
2018-11-03 15:17:31.992 2776-2776/com.testdatapull.testdatapull I/System.out: Successful: true
2018-11-03 15:17:31.993 2776-2776/com.testdatapull.testdatapull I/System.out: Size: 2
2018-11-03 15:17:31.993 2776-2776/com.testdatapull.testdatapull I/GoogleFitData: Data returned for Data type: com.google.step_count.delta
2018-11-03 15:17:31.993 2776-2776/com.testdatapull.testdatapull I/GoogleFitData: Data returned for Data type: com.google.activity.summary
Любой совет будет принят с благодарностью.
Спасибо