介绍

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命令包装在一个传递给runOnUiThreadRunnable中。 这是因为未在主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

更多相关文章

  1. Android下编译库文件jar包并在应用中调用
  2. eclipse项目迁移到android studio(图文最新版)
  3. flutter学习笔记(随缘更新)
  4. 那两年炼就的Android内功修养
  5. Android之如何打开USB调试模式
  6. Android电子拍卖系统学习笔记
  7. Android开发指南目录
  8. Android分享新浪微博
  9. Android(安卓)Studio运行程序出现Session ‘app’: Error Launch

随机推荐

  1. android中使用反射机制,调用framework中的
  2. Android(安卓)ListView和ListAdapter
  3. Android开发_微信分享功能
  4. android apk更新闪退
  5. Android(安卓)SystemUI的EventBus实现原
  6. Android(安卓)中Goolgle 相关服务的移植[
  7. 10.28,python,django中templates的奇偶性
  8. 最简单的android studio调用ffmpeg动态库
  9. Android_Button
  10. 如何使用Android(安卓)Studio开发/调试An