适用于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:建立专案

要创建一个新项目,请单击屏幕左上角的蓝色“ 创建项目”按钮。

适用于Android的Google Fit:读取传感器数据_第1张图片

这为您提供一个对话框,询问您的项目名称。 在本教程中,我创建了一个项目,并将其命名为TutsPlusGoogleFit 您可以为您的项目命名有一些限制。 仅允许使用字母,数字,引号,连字符,空格和感叹号。

适用于Android的Google Fit:读取传感器数据_第2张图片

一旦点击Create ,页面的右下角将出现一个对话框,指示正在创建项目。

适用于Android的Google Fit:读取传感器数据_第3张图片

步骤2:启用Google Fit API

完成项目设置后,您将进入项目概述页面。 查找Google Fit API的最简单方法是搜索关键字“ fit” 从显示的结果中选择Fitness API

适用于Android的Google Fit:读取传感器数据_第4张图片

点击启用API以启用Fitness API


启用Fitness API后,您会收到一条警告,通知您还需要创建凭据才能使用Fitness API。 幸运的是,警告中包含一个按钮,可将我们带到“ 凭据”页面。

启用Fitness API后,转到“凭据”按钮

步骤3:建立凭证

在“ 凭据”页面上,您需要在“ 凭据向导”中提供有关您的应用程序的一些常规信息。 指定您正在使用Fitness API ,从Android应用程序调用该API,并且该应用程序需要访问User data

适用于Android的Google Fit:读取传感器数据_第5张图片

接下来,单击我需要什么凭证? 在底部继续,并为您的Android应用程序创建OAuth 2.0客户端ID。 此步骤需要两个重要的信息:

  • 签名证书指纹
  • 应用程序的软件包名称

您可以通过打开终端或命令提示符,然后导航到应用程序的签名证书的位置来获取签名证书指纹。 这是您的发布密钥或Android Studio使用的默认debug.keystore证书。 导航到密钥库后,可以使用以下命令生成必要的SHA1,其中debug.keystore是签名证书的名称。

keytool -list -v -keystore debug.keystore
适用于Android的Google Fit:读取传感器数据_第6张图片

将SHA1键粘贴到SHA1字段中, 然后在包名称字段中输入com.tutsplus.googlefit

适用于Android的Google Fit:读取传感器数据_第7张图片

最后,您需要配置OAuth 2.0同意屏幕。 这是显示给用户的屏幕,以便他们可以授予您的应用程序使用其健身数据的权限。 此步骤需要您的电子邮件和产品名称才能显示给用户。 在本教程中,我输入了Tuts + Google Fit

适用于Android的Google Fit:读取传感器数据_第8张图片

单击继续 ,然后在下一页上,单击完成以完成设置过程。

步骤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帐户。

适用于Android的Google Fit:读取传感器数据_第9张图片

当操作系统知道要使用哪个帐户时,您的应用程序将显示一个新对话框,要求用户向应用程序授予读取健身数据的权限。

适用于Android的Google Fit:读取传感器数据_第10张图片

在此阶段,用户要么授予您的应用程序使用其数据的权限,要么关闭对话框,以取消该过程。 您可以在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命令包装在一个传递给runOnUiThreadRunnable中。 这是因为未在主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();
            }
        });
    }
}
适用于Android的Google Fit:读取传感器数据_第11张图片

对于此样本,您还需要做两件事。 首先是在使用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

你可能感兴趣的:(适用于Android的Google Fit:读取传感器数据)