适用于Android的Google Fit:读取传感器数据
介绍
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进行授权。
@Overrideprotected 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()
执行此操作。
@Overrideprotected void onStart() { super.onStart(); mApiClient.connect();}
用户第一次运行该应用程序时,与Fitness API的连接将失败,因为用户必须授权您的应用程序访问其健身数据。 您可以在onConnectionFailed()
侦听此事件,并通过检查是否正在进行授权来做出相应的反应。 如果是这样,请调用startResolutionForResult()
以便Google Play服务可以正确处理授予用户使用其信息权限的用户。
@Overridepublic 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客户端。
@Overrideprotected 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()
开始搜索有效的步骤数据源。
@Overridepublic 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线程上触发回调。
@Overridepublic 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()
。
@Overrideprotected void onStop() { super.onStop(); Fitness.SensorsApi.remove( mApiClient, this ) .setResultCallback(new ResultCallback() { @Override public void onResult(Status status) { if (status.isSuccess()) { mApiClient.disconnect(); } } });}@Overrideprotected 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
更多相关文章
- Android下编译库文件jar包并在应用中调用
- eclipse项目迁移到android studio(图文最新版)
- flutter学习笔记(随缘更新)
- 那两年炼就的Android内功修养
- Android之如何打开USB调试模式
- Android电子拍卖系统学习笔记
- Android开发指南目录
- Android分享新浪微博
- Android(安卓)Studio运行程序出现Session ‘app’: Error Launch