介绍
Google Fit是一个平台,使开发人员可以构建专注于用户适应性数据的应用程序。 Google提供的工具之一是适用于Android的Google Fit,可以在Google Play服务中打包获得。
正如Envato Tuts +概述文章中所讨论的,尽管有许多适用于Google Fit的API,但本教程着重介绍如何设置并使用Google Fit在Android设备上读取传感器数据。 可以在GitHub上找到本教程的示例项目。
1.设置开发者控制台
为了使用Google Fit for Android,您需要:
- 在Google Developers Console中启用Fitness API
- 创建一个OAuth 2.0客户端ID
- 连接到Android应用程序中的Fitness API
本节向您展示如何设置Android应用程序和Fitness API。 您可以先访问Google Developers Console 。 如果您已经有一个要处理的项目,则可以跳过下一步。 如果不是,请继续为您的Google Fit应用程序创建一个新项目。
步骤1:建立专案
要创建一个新项目,请单击屏幕左上角的蓝色“ 创建项目”按钮。
这为您提供一个对话框,询问您的项目名称。 在本教程中,我创建了一个项目,并将其命名为TutsPlusGoogleFit 。 您可以为您的项目命名有一些限制。 仅允许使用字母,数字,引号,连字符,空格和感叹号。
一旦点击Create ,页面的右下角将出现一个对话框,指示正在创建项目。
步骤2:启用Google Fit API
完成项目设置后,您将进入项目概述页面。 查找Google Fit API的最简单方法是搜索关键字“ fit” 。 从显示的结果中选择Fitness API 。
点击启用API以启用Fitness API 。
启用Fitness API后,您会收到一条警告,通知您还需要创建凭据才能使用Fitness API。 幸运的是,警告中包含一个按钮,可将我们带到“ 凭据”页面。
步骤3:建立凭证
在“ 凭据”页面上,您需要在“ 凭据向导”中提供有关您的应用程序的一些常规信息。 指定您正在使用Fitness API ,从Android应用程序调用该API,并且该应用程序需要访问User data 。
接下来,单击我需要什么凭证? 在底部继续,并为您的Android应用程序创建OAuth 2.0客户端ID。 此步骤需要两个重要的信息:
- 签名证书指纹
- 应用程序的软件包名称
您可以通过打开终端或命令提示符,然后导航到应用程序的签名证书的位置来获取签名证书指纹。 这是您的发布密钥或Android Studio使用的默认debug.keystore证书。 导航到密钥库后,可以使用以下命令生成必要的SHA1,其中debug.keystore是签名证书的名称。
keytool -list -v -keystore debug.keystore
将SHA1键粘贴到SHA1字段中, 然后在包名称字段中输入com.tutsplus.googlefit 。
最后,您需要配置OAuth 2.0同意屏幕。 这是显示给用户的屏幕,以便他们可以授予您的应用程序使用其健身数据的权限。 此步骤需要您的电子邮件和产品名称才能显示给用户。 在本教程中,我输入了Tuts + Google Fit 。
单击继续 ,然后在下一页上,单击完成以完成设置过程。
步骤4:Android专案设定
在Google Developer Console上设置并配置项目后,您就可以开始创建新的Android项目了。 确保软件包名称与您在Google Developer Console中输入的软件包名称匹配,并将应用程序设置为使用手机和平板电脑平台,且SDK版本最低为14。GoogleFit的最低API级别为9。创建一个空活动以保留基础项目干净,因此您可以在本教程中专注于Google Fit API。
设置完项目后,打开项目的build.gradle文件,并通过将以下行添加到Google Play服务中,导入健身包。 dependencies
节点。
compile 'com.google.android.gms:play-services-fitness:8.4.0'
接下来,打开MainActivity.java并添加以下接口:
-
OnDataPointListener
-
GoogleApiClient.ConnectionCallback
-
GoogleApiClient.OnConnectionFailedListener
在为这些接口添加了必需的方法后,您的类应如下所示:
public class MainActivity extends AppCompatActivity implements OnDataPointListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onConnected(Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
@Override
public void onDataPoint(DataPoint dataPoint) {
}
}
最后但并非最不重要的一点是,创建将用于本教程的成员变量。 您可以将以下行复制到类的顶部:
private static final int REQUEST_OAUTH = 1;
private static final String AUTH_PENDING = "auth_state_pending";
private boolean authInProgress = false;
private GoogleApiClient mApiClient;
在下一步中,您将连接到Google Play服务,并了解如何在应用程序中访问用户的健身数据。
2.使用Fitness API
第1步:连接到Google Play服务
在Android Studio和Google Developer Console中设置了项目之后,就该开始学习Fitness API。 在onCreate()
方法中,您检查您的应用是否已经在尝试对Fitness API进行授权。 然后,您可以通过添加Fitness Sensors API,定义范围并注册应用程序回调来初始化GoogleApiClient
实例。 如果您不请求范围,则您的应用将无法针对Fitness Sensors API进行授权。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
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();
}
初始化GoogleApiClient
实例后,您需要使其连接到Google的后端。 您可以在onStart()
执行此操作。
@Override
protected void onStart() {
super.onStart();
mApiClient.connect();
}
用户第一次运行该应用程序时,与Fitness API的连接将失败,因为用户必须授权您的应用程序访问其健身数据。 您可以在onConnectionFailed()
侦听此事件,并通过检查是否正在进行授权来做出相应的反应。 如果是这样,请调用startResolutionForResult()
以便Google Play服务可以正确处理授予用户使用其信息权限的用户。
@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" );
}
}
如果您现在运行应用程序,则可能会出现一个对话框,询问您是否在设备上使用了多个帐户,请选择要使用的Google帐户。
当操作系统知道要使用哪个帐户时,您的应用程序将显示一个新对话框,要求用户向应用程序授予读取健身数据的权限。
在此阶段,用户要么授予您的应用程序使用其数据的权限,要么关闭对话框,以取消该过程。 您可以在onActivityResult()
监听这两个事件并处理结果。 如果用户授予您的应用程序许可,则您的应用程序会收到RESULT_OK
响应,然后可以尝试连接到Google API客户端。
@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");
}
}
您的应用程序现在应该能够成功连接到Google Play服务。 有了这些,您就可以开始关注Fitness API。
步骤2:使用Fitness API访问Step数据
当您的GoogleApiClient
实例连接到Google后,就会触发onConnected()
回调。 在此回调中,您需要创建一个新的DataSourcesRequest
对象,该对象定义您的应用程序感兴趣的数据类型。您还需要创建一个ResultCallback
,处理可以从设备中检索步骤时应用程序应该执行的操作。 创建对象后,调用Fitness.SensorsApi.findDataSources()
开始搜索有效的步骤数据源。
@Override
public void onConnected(Bundle bundle) {
DataSourcesRequest dataSourceRequest = new DataSourcesRequest.Builder()
.setDataTypes( DataType.TYPE_STEP_COUNT_CUMULATIVE )
.setDataSourceTypes( DataSource.TYPE_RAW )
.build();
ResultCallback dataSourcesResultCallback = new ResultCallback() {
@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);
}
您可能会注意到registerFitnessDataListener()
方法实际上并不存在。 这是一个辅助方法,在找到步骤计数器的数据源时将调用该方法,然后该方法创建一个SensorRequest
对象,用于从步骤计数传感器请求数据。
在以下代码片段中, SensorRequest
对象尝试每三秒钟查找一次步数。 然后Fitness.SensorApi
将请求添加新的OnDataPointListener
以便在有新数据可用时触发侦听器。 如果未找到新数据,则不会触发OnDataPointListener
,并且Fitness API等待三秒钟,然后再次检查。
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() {
@Override
public void onResult(Status status) {
if (status.isSuccess()) {
Log.e( "GoogleFit", "SensorApi successfully added" );
}
}
});
}
检测到步数变化时,将调用onDataPoint()
。 在这种方法中,您将遍历DataPoint
参数中的字段,并显示带有字段名称和值的Toast
消息。 在此示例中,这将是步骤计数器。 在自己的应用程序中,您将使用更适当的逻辑来执行任务。 您会注意到Toast
命令包装在一个传递给runOnUiThread
的Runnable
中。 这是因为未在主UI线程上触发回调。
@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();
}
});
}
}
对于此样本,您还需要做两件事。 首先是在使用SensorApi
和Google Play服务之后,将它们断开。 在此示例中,在onStop()
时执行此操作。 第二个方法是将onCreate()
检查的authInProgress
值存储在onSavedInstanceState()
。
@Override
protected void onStop() {
super.onStop();
Fitness.SensorsApi.remove( mApiClient, this )
.setResultCallback(new ResultCallback() {
@Override
public void onResult(Status status) {
if (status.isSuccess()) {
mApiClient.disconnect();
}
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(AUTH_PENDING, authInProgress);
}
结论
在本教程中,您学习了如何连接到Google Play Services Fitness API和如何从用户设备读取健身传感器数据。 甚至对于用户而言,甚至只有步进数据之类的东西也可以证明对于诸如Android Wear表盘或目标跟踪器之类的应用程序而言具有不可估量的价值。 您可以使用许多其他类型的数据源以及Google Fit中的许多其他API来使您的应用程序变得更好。
翻译自: https://code.tutsplus.com/tutorials/google-fit-for-android-reading-sensor-data--cms-25723