android - OnDataPointListener does not get callback if GoogleApiClient is disconnected -


i using google fit apis first time. have modified basicsensorsapi sample code calculate steps count. working fine, problem when call googleapiclient.disconnect() in onstop() function , again call googleapiclient.connect() in onstart() function, ondatapointlistener stops getting callbacks. not unregistering listener where.

when don't call googleapiclient.disconnect() working fine , callbacks event after activity's onstop() function called.

i not sure whether should disconnect googleapiclient in onstop() function or not. if yes how can solve above problem?

here relavent code:

private void buildfitnessclient() {     // create google api client     mclient = new googleapiclient.builder(this)             .addapi(fitness.sensors_api)             .addscope(new scope(scopes.fitness_location_read))             .addscope(new scope((scopes.fitness_activity_read)))             .addscope(new scope((scopes.fitness_body_read)))             .addconnectioncallbacks(                     new googleapiclient.connectioncallbacks() {                          @override                         public void onconnected(bundle bundle) {                             log.i(tag, "connected!!!");                             // can make calls fitness apis.                             // put application specific code here.                             findfitnessdatasources();                         }                          @override                         public void onconnectionsuspended(int i) {                             // if connection sensor gets lost @ point,                             // you'll able determine reason , react here.                             if (i == googleapiclient.connectioncallbacks.cause_network_lost) {                                 log.i(tag, "connection lost.  cause: network lost.");                             } else if (i == googleapiclient.connectioncallbacks.cause_service_disconnected) {                                 log.i(tag, "connection lost.  reason: service disconnected");                             }                         }                     }             )             .addonconnectionfailedlistener(                     new googleapiclient.onconnectionfailedlistener() {                         // called whenever api client fails connect.                         @override                         public void onconnectionfailed(connectionresult result) {                             log.i(tag, "connection failed. cause: " + result.tostring());                             if (!result.hasresolution()) {                                 // show localized error dialog                                 googleplayservicesutil.geterrordialog(result.geterrorcode(), mainactivity.this, 0).show();                                 return;                             }                             // failure has resolution. resolve it.                             // called typically when app not yet authorized, ,                             // authorization dialog displayed user.                             if (!authinprogress) {                                 try {                                     log.i(tag, "attempting resolve failed connection");                                     authinprogress = true;                                     result.startresolutionforresult(mainactivity.this, request_oauth);                                 } catch (intentsender.sendintentexception e) {                                     log.e(tag, "exception while starting resolution activity", e);                                 }                             }                         }                     }             )             .build(); }  @override protected void onstart() {     super.onstart();     // connect fitness api     log.i(tag, "connecting...");     mclient.connect(); }  @override protected void onstop() {     super.onstop();     if (mclient.isconnected()) {         //mclient.disconnect();     } }  @override protected void onactivityresult(int requestcode, int resultcode, intent data) {     if (requestcode == request_oauth) {         authinprogress = false;         if (resultcode == result_ok) {             // make sure app not connected or attempting connect             if (!mclient.isconnecting() && !mclient.isconnected()) {                 mclient.connect();             }         }     } }  @override protected void onsaveinstancestate(bundle outstate) {     super.onsaveinstancestate(outstate);     outstate.putboolean(auth_pending, authinprogress); }  // [end auth_connection_flow_in_activity_lifecycle_methods]  /**  * find available data sources , attempt register on specific {@link datatype}.  * if application cares data type doesn't care source of data,  * can skipped entirely, instead calling  * {@link com.google.android.gms.fitness.sensorsapi  * #register(googleapiclient, sensorrequest, datasourcelistener)},  * {@link sensorrequest} contains desired data type.  */ private void findfitnessdatasources() {     // [start find_data_sources]     fitness.sensorsapi.finddatasources(mclient, new datasourcesrequest.builder()             // @ least 1 datatype must specified.             .setdatatypes(datatype.type_step_count_cadence)             .setdatatypes(datatype.type_step_count_cumulative)             .setdatatypes(datatype.type_step_count_delta)                     // can specify whether data type raw or derived.             .setdatasourcetypes(datasource.type_derived)             .build())             .setresultcallback(new resultcallback<datasourcesresult>() {                 @override                 public void onresult(datasourcesresult datasourcesresult) {                     log.i(tag, "result: " + datasourcesresult.getstatus().tostring());                     (datasource datasource : datasourcesresult.getdatasources()) {                         log.i(tag, "data source found: " + datasource.tostring());                         log.i(tag, "data source type: " + datasource.getdatatype().getname());                          //let's register listener receive activity data!                         if (datasource.getdatatype().equals(datatype.type_step_count_cadence) && mlistener == null) {                             log.i(tag, "data source type_step_count_cadence found!  registering.");                             registerfitnessdatalistener(datasource, datatype.type_step_count_cadence);                         } else if (datasource.getdatatype().equals(datatype.type_step_count_cumulative) && mlistener == null) {                             log.i(tag, "data source type_step_count_cumulative found!  registering.");                             registerfitnessdatalistener(datasource, datatype.type_step_count_cumulative);                         } else if (datasource.getdatatype().equals(datatype.type_step_count_delta) && mlistener == null) {                             log.i(tag, "data source type_step_count_delta found!  registering.");                             registerfitnessdatalistener(datasource, datatype.type_step_count_delta);                         }                     }                 }             });     // [end find_data_sources] }  /**  * register listener sensors api provided {@link datasource} ,  * {@link datatype} combo.  */ private void registerfitnessdatalistener(datasource datasource, datatype datatype) {     // [start register_data_listener]     mlistener = new ondatapointlistener() {         @override         public void ondatapoint(datapoint datapoint) {             (field field : datapoint.getdatatype().getfields()) {                 value val = datapoint.getvalue(field);                 log.i(tag, "detected datapoint field: " + field.getname());                 log.i(tag, "detected datapoint value: " + val);             }         }     };      fitness.sensorsapi.add(             mclient,             new sensorrequest.builder()                     .setdatasource(datasource) // optional recommended custom data sets.                     .setdatatype(datatype) // can't omitted.                     .setsamplingrate(10, timeunit.seconds)                     .build(),             mlistener)             .setresultcallback(new resultcallback<status>() {                 @override                 public void onresult(status status) {                     if (status.issuccess()) {                         log.i(tag, "listener registered!");                     } else {                         log.i(tag, "listener not registered.");                     }                 }             });     // [end register_data_listener] } 

if tracking step counts in foreground correct behaviour disconnecting google api client in onstop(). once googleapiclient disconnected listeners removed googleapiclient. if wish track step counts in background, may have move implementation service , decide when want disconnect googleapiclient.


Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -