Android:如何从可穿戴设备获取Google健身数据?

我遵循这里描述的相同步骤(谷歌飞度客户端连接部分工作正常)。

final DataType dataType=TYPE_STEP_COUNT_DELTA; DataSourcesRequest requestData = new DataSourcesRequest.Builder() .setDataTypes(dataType) // At least one datatype must be specified. .build(); Fitness.SensorsApi.findDataSources(mClient, requestData) .setResultCallback(new ResultCallback<DataSourcesResult>() { @Override public void onResult(DataSourcesResult dataSourcesResult) { Log.i(TAG, "Result: " + dataSourcesResult.getDataSources().size() + " sources " + dataSourcesResult.getStatus().toString()); for (DataSource dataSource : dataSourcesResult.getDataSources()) { Log.i(TAG, "Data source found: " + dataSource.toString()); Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName()); } } }); 

当我询问数据来源时,我只能得到一个智能手机的结果。 如果我添加一个侦听器,那么我真的得到的数据,所以它的工作。

不过,它也通过手机与Android Wear智能手表Gear Wear和Android Wear应用程序连接。 Google健身安装在他们两个,但我想从智能手表获取数据。

在我读的官方指南

传感器API可以访问Android设备上可用传感器的原始传感器数据stream,以及配套设备(例如可穿戴设备)中的传感器。

这段代码在智能手机上运行,​​所以我认为从同伴smartwatch的数据来源也是正确的。 但是这对我的手机应用程序来说是不可见的。 难道我做错了什么?

编辑:

 public class MainActivity extends AppCompatActivity { private final static String TAG = "main_mobile"; private static final int REQUEST_OAUTH = 1; private final static String DATE_FORMAT = "yyyy.MM.dd HH:mm:ss"; private static final String AUTH_PENDING = "auth_state_pending"; private boolean authInProgress = false; private GoogleApiClient mClient = null; private final static DataType dataType = TYPE_STEP_COUNT_DELTA; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null) { authInProgress = savedInstanceState.getBoolean(AUTH_PENDING); } mClient = new GoogleApiClient.Builder(this) .addApi(Fitness.SENSORS_API) .addApi(Fitness.RECORDING_API) .addApi(Fitness.HISTORY_API) .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addConnectionCallbacks(connectionCallbacks) .addOnConnectionFailedListener(connectionFailCallbacks) .build(); } private void initFitness() { DataSourcesRequest requestData = new DataSourcesRequest.Builder() .setDataTypes(dataType) .build(); Fitness.SensorsApi.findDataSources(mClient, requestData) .setResultCallback(new ResultCallback<DataSourcesResult>() { @Override public void onResult(DataSourcesResult dataSourcesResult) { Log.i(TAG, "Result: " + dataSourcesResult.getDataSources().size() + " sources " + dataSourcesResult.getStatus().toString()); for (DataSource dataSource : dataSourcesResult.getDataSources()) { Log.i(TAG, "\nData source found: \n\t" + dataSource.toString() + "\n\tType: " + dataSource.getDataType().getName()); } } }); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "Connecting..."); mClient.connect(); } @Override protected void onStop() { super.onStop(); if (mClient.isConnected()) { mClient.disconnect(); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(AUTH_PENDING, authInProgress); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_OAUTH) { authInProgress = false; if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mClient.isConnecting() && !mClient.isConnected()) { mClient.connect(); } } } } GoogleApiClient.ConnectionCallbacks connectionCallbacks = new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { Log.i(TAG, "Connected!!!"); // Now you can make calls to the Fitness APIs. // Put application specific code here. initFitness(); } @Override public void onConnectionSuspended(int i) { // If your connection to the sensor gets lost at some point, // you'll be able to determine the reason and react to it 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"); } } }; GoogleApiClient.OnConnectionFailedListener connectionFailCallbacks = new GoogleApiClient.OnConnectionFailedListener() { // Called whenever the API client fails to connect. @Override public void onConnectionFailed(ConnectionResult result) { Log.i(TAG, "Connection failed. Cause: " + result.toString()); if (!result.hasResolution()) { // Show the localized error dialog GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), MainActivity.this, 0).show(); return; } // The failure has a resolution. Resolve it. // Called typically when the app is not yet authorized, and an // authorization dialog is displayed to the user. if (!authInProgress) { try { Log.i(TAG, "Attempting to resolve failed connection"); authInProgress = true; result.startResolutionForResult(MainActivity.this, REQUEST_OAUTH); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Exception while starting resolution activity", e); } } } }; } 

我还没有尝试过这个。

看起来好像三星Gear Live传感器并不支持开箱即用,但是您可以通过软件传感器使其工作:

你的装备生活

正如在这个回答中所说,

Samsung Gear Live手表不会将自己宣传为BLE心率监视器 ,因此不会通过普通的Bluetooth Low Energy API或基于其构build的Google Fit API来提供心率数据。

支持的传感器

正如在官方文件中所说,

Google Fit包含对移动设备上的传感器和与设备配对使用的低功耗蓝牙传感器的支持。 Google Fit让开发人员可以实现对其他传感器的支持,并将其作为Android应用中的软件传感器公开。 Google健身支持的传感器可作为数据源对象提供给Android应用。

可能的scheme

看起来有可能实现附加的软件传感器 。

(复制的模板是在post的底部,因为它很长)。

你会得到可穿戴的数据, 从传感器三星齿轮生活 。

模板(来自https://developers.google.com/fit/android/new-sensors

把这个添加到你的清单文件中:

 <service android:name="com.example.MySensorService" android:process=":sensor"> <intent-filter> <action android:name="com.google.android.gms.fitness.service.FitnessSensorService"/> <!-- include at least one mimeType filter for the supported data types --> <data android:mimeType="vnd.google.fitness.data_type/com.google.heart_rate.bpm"/> </intent-filter> </service> 

并把这个Service进去:

 import com.google.android.gms.common.*; import com.google.android.gms.common.api.*; import com.google.android.gms.fitness.*; import com.google.android.gms.fitness.data.*; import com.google.android.gms.fitness.service.*; ... public class MySensorService extends FitnessSensorService { @Override public void onCreate() { super.onCreate(); // 1. Initialize your software sensor(s). // 2. Create DataSource representations of your software sensor(s). // 3. Initialize some data structure to keep track of a registration for each sensor. } @Override protected List<DataSource> onFindDataSources(List<DataType> dataTypes) { // 1. Find which of your software sensors provide the data types requested. // 2. Return those as a list of DataSource objects. } @Override protected boolean onRegister(FitnessSensorServiceRequest request) { // 1. Determine which sensor to register with request.getDataSource(). // 2. If a registration for this sensor already exists, replace it with this one. // 3. Keep (or update) a reference to the request object. // 4. Configure your sensor according to the request parameters. // 5. When the sensor has new data, deliver it to the platform by calling // request.getDispatcher().publish(List<DataPoint> dataPoints) } @Override protected boolean onUnregister(DataSource dataSource) { // 1. Configure this sensor to stop delivering data to the platform // 2. Discard the reference to the registration request object } }