DataSource.getAppPackageName () always returns "com.google.android.gms" in Google Fit

My app reads weight data from Google Fit. The data was inserted by Withings and my own application. But that doesn't make any difference when I call dataSet.getDataSource().getAppPackageName() because it always returns com.google.android.gms . Therefore, I have no chance of knowing where the data came from. Google describes how to get information about the data source in this article: https://developers.google.com/fit/android/data-attribution Unfortunately, this is completely useless to me.

I am using Google Play Services 8.3.0, tested with Android 4.3, 4.4.2 and 6.0.1.

Can anyone confirm the same behavior? Or am I doing something wrong? Any feedback is welcome.

 public void connect(final Activity activity) { client = new GoogleApiClient.Builder(activity) .addApi(Fitness.HISTORY_API) .addApi(Fitness.CONFIG_API) .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addScope(new Scope(Scopes.FITNESS_BODY_READ_WRITE)) .build(); client.connect(); } public DataReadResult readWeightValues(final Date startDate, final Date endDate) { final DataReadRequest readRequest = new DataReadRequest.Builder() .enableServerQueries() .setTimeRange(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS) .read(DataType.TYPE_WEIGHT) .build(); return Fitness.HistoryApi.readData(client, readRequest).await(1, TimeUnit.MINUTES); } public void examineWeightValues(final DataReadResult dataReadResult) { if ((dataReadResult != null) && dataReadResult.getStatus().isSuccess()) { if (!dataReadResult.getBuckets().isEmpty()) { for (final Bucket bucket : dataReadResult.getBuckets()) { final List<DataSet> dataSets = bucket.getDataSets(); for (final DataSet dataSet : dataSets) { Log.i("=====>", dataSet.getDataSource().getAppPackageName()); } } } if (!dataReadResult.getDataSets().isEmpty()) { for (final DataSet dataSet : dataReadResult.getDataSets()) { Log.i("=====>", dataSet.getDataSource().getAppPackageName()); } } } } public Status insertWeightValue(final Context context, final Date date, final float weightKg) { final DataSource dataSource = new DataSource.Builder() .setAppPackageName(context.getApplicationContext().getPackageName()) // already tried setAppPackageName(context) too .setName("com.mycompany.myapp") .setDataType(DataType.TYPE_WEIGHT) .setType(DataSource.TYPE_RAW) .build(); final DataSet dataSet = DataSet.create(dataSource); final DataPoint dataPoint = dataSet.createDataPoint(); dataPoint.setTimestamp(date.getTime(), TimeUnit.MILLISECONDS); dataPoint.getValue(Field.FIELD_WEIGHT).setFloat(weightKg); dataSet.add(dataPoint); return Fitness.HistoryApi.insertData(client, dataSet).await(1, TimeUnit.MINUTES); } 
+1
android google-play-services google-fit google-fit-sdk
source share
2 answers

DataPoint.getOriginalDataSource().getAppPackageName() will do the trick. It returns com.withings.wiscale2 for my Withings scale.

Note. There was an answer that suggested this solution last night, but this morning it disappeared. I do not know what happened here, but, unfortunately, I have no idea about the author of the disappeared answer. Anyway, I want to say thank you for pointing me in the right direction!

+2
source share

Thats nopt the right way to do this. I am sure your values ​​are not pasted into Google. You need to do all this using the onClientConnected internal feedback. Here is the api client build code

 public void buildFitnessClient() { fitnessClient = new GoogleApiClient.Builder(context) .addApi(Fitness.HISTORY_API) .addApi(Fitness.SESSIONS_API) .addApi(Fitness.RECORDING_API) .addScope(new Scope(Scopes.FITNESS_BODY_READ_WRITE)) .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addScope(new Scope(Scopes.FITNESS_LOCATION_READ_WRITE)) .addScope(new Scope(Scopes.FITNESS_NUTRITION_READ_WRITE)) .addConnectionCallbacks( new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { //Do here your stuff Or call methods from here Otherwise // You will gety Client not Connected Exception } @Override public void onConnectionSuspended(int i) { } }) .addOnConnectionFailedListener( new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed( ConnectionResult result) { if (!result.hasResolution()) { GooglePlayServicesUtil.getErrorDialog( result.getErrorCode(), context, 0) .show(); return; } if (!authInProgress) { try { authInProgress = true; result.startResolutionForResult( context, KeyConstant.REQUEST_OAUTH); } catch (IntentSender.SendIntentException e) { } } } }).build(); } 
0
source share

All Articles