2016-08-08 1 views
-1

단계 수를 계산할 수 없습니다. onDataPoint 메서드를 호출하는 데 막혔습니다. 이 코드는 거의 정확합니다. 나는 그것이 스텝 카운트를 보이지 않는 이유를 발견 할 수 없다. (주석에 용해 된 바와 같이)Google 맞춤 API, onDatapoint 메소드가 호출되지 않습니다.

package com.example.akkisocc.heath; 


import android.content.Intent; 
import android.content.IntentSender; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.Scopes; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.common.api.Scope; 
import com.google.android.gms.common.api.Status; 
import com.google.android.gms.fitness.Fitness; 
import com.google.android.gms.fitness.data.DataPoint; 
import com.google.android.gms.fitness.data.DataSource; 
import com.google.android.gms.fitness.data.DataType; 
import com.google.android.gms.fitness.data.Field; 
import com.google.android.gms.fitness.data.Value; 
import com.google.android.gms.fitness.request.DataSourcesRequest; 
import com.google.android.gms.fitness.request.OnDataPointListener; 
import com.google.android.gms.fitness.request.SensorRequest; 
import com.google.android.gms.fitness.result.DataSourcesResult; 

import java.util.concurrent.TimeUnit; 

public class MainActivity extends AppCompatActivity implements OnDataPointListener, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 
    private static final int REQUEST_OAUTH = 1; 
    private static final String AUTH_PENDING = "auth_state_pending"; 
    TextView msg; 
    private boolean authInProgress = false; 
    private GoogleApiClient mApiClient; 

    @Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     msg = (TextView) findViewById(R.id.msg); 
     msg.setText("On Create"); 
Log.e("GoogleFit", "Oncreate"); 

     if (savedInstanceState != null) { 
      authInProgress = savedInstanceState.getBoolean(AUTH_PENDING); 
     } 

     mApiClient = new GoogleApiClient.Builder(this) 
       .addApi(Fitness.SENSORS_API) 
       .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     mApiClient.connect(); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQUEST_OAUTH) { 
      authInProgress = false; 
      if (resultCode == RESULT_OK) { 
       if (!mApiClient.isConnecting() && !mApiClient.isConnected()) { 
        mApiClient.connect(); 
       } 
      } else if (resultCode == RESULT_CANCELED) { 
       Log.e("GoogleFit", "RESULT_CANCELED"); 
      } 
     } else { 
      Log.e("GoogleFit", "requestCode NOT request_oauth"); 
     } 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     DataSourcesRequest dataSourceRequest = new DataSourcesRequest.Builder() 
       .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE) 
       .setDataSourceTypes(DataSource.TYPE_RAW) 
       .build(); 

     ResultCallback<DataSourcesResult> dataSourcesResultCallback = new ResultCallback<DataSourcesResult>() { 
      @Override 
      public void onResult(DataSourcesResult dataSourcesResult) { 
       for (DataSource dataSource : dataSourcesResult.getDataSources()) { 
        if (DataType.TYPE_STEP_COUNT_CUMULATIVE.equals(dataSource.getDataType())) { 
         registerFitnessDataListener(dataSource, DataType.TYPE_STEP_COUNT_CUMULATIVE); 
        } 
       } 
      } 
     }; 

     Fitness.SensorsApi.findDataSources(mApiClient, dataSourceRequest) 
       .setResultCallback(dataSourcesResultCallback); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     if (!authInProgress) { 
      try { 
       authInProgress = true; 
       connectionResult.startResolutionForResult(MainActivity.this, REQUEST_OAUTH); 
      } catch (IntentSender.SendIntentException e) { 

      } 
     } else { 
      Log.e("GoogleFit", "authInProgress"); 
     } 

    } 

    private void registerFitnessDataListener(DataSource dataSource, DataType dataType) { 

     SensorRequest request = new SensorRequest.Builder() 
       .setDataSource(dataSource) 
       .setDataType(dataType) 
       .setSamplingRate(3, TimeUnit.SECONDS) 
       .build(); 

     Fitness.SensorsApi.add(mApiClient, request, this) 
       .setResultCallback(new ResultCallback<Status>() { 
        @Override 
        public void onResult(Status status) { 
         if (status.isSuccess()) { 
          Log.e("GoogleFit", "SensorApi successfully added"); 
         } 
        } 
       }); 
    } 

    @Override 
    public void onDataPoint(DataPoint dataPoint) { 
     for (final Field field : dataPoint.getDataType().getFields()) { 
      final Value value = dataPoint.getValue(field); 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(getApplicationContext(), "Field: " + field.getName() + " Value: " + value, Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    } 
} 
+0

나는 당신이 전에 [google-fit question] (http://stackoverflow.com/questions/38799685/google-fitness-sensors-ondatapoint-not-being-called)에서 이것을 말했지만, 이미 시도 했습니까? '.setDataSourceTypes (DataSource.TYPE_RAW)'를 제거 하시겠습니까? 단계 수는 원시 데이터 형식이라고 생각하지 않습니다. –

+0

그게 문제가 아니라면, 코드를 [최소한의 완전하고 검증 가능한 예제] (http://stackoverflow.com/help/mcve)로 줄이고 시도한 것을 보여주고 문제의 범위를 좁히십시오. 누군가가 전체 코드를 처음부터 디버깅 할 것으로 기대할 수는 없습니다. –

+0

고마워 Matthew, 이제 앱을 완벽하게 실행할 수있게되었습니다. 원시 데이터에 주석을다는 것은 때로는 정확하지 않은 값을 부여하는 것으로 나타났습니다. 데이터 유형을 원시에서 파생 클래스로 변경하는 것은 잘 작동합니다. –

답변

0

는 문제가 TYPE_STEP_COUNT_CUMULATIVEGoogle uses a combination of sensors, accelerometer, machine learning, etc. to determine step count 고정형 원시 데이터가 없다는 것이다. 따라서 .setDataSourceTypes(DataSource.TYPE_RAW) 행을 삭제해야합니다.

영업 이익을 보았을 때 영업 회선을 제거하면 DataSource.TYPE_DERIVED으로 바꾸는 것보다 정확도가 떨어지는 것으로 나타났습니다.

또한, Google Fit FAQTYPE_DERIVED을 사용하는 예가있다.

관련 문제