Android Google 拟合示例不起作用

Android Google Fit example is not working

我无法获取 Google 提供的 Google Fit 运行 的示例应用程序。

到目前为止我发现,在我选择 Account.

后,我在 onActivityResult 中得到的 resultCode0

我目前使用的示例应用程序是 BasicRecordingApi,可以在 here 找到它。 但我也试过其他的。

我为应用程序创建了一个 API 密钥,并且我已经启用了 Google Fit API。

没有任何帮助。

有什么想法吗?

开始 Android

这解释了如何使用 Google Fit on Android 开始开发。 Google Fit 是 Google Play 服务的一部分。

第 1 步:获取 Google 播放服务

Google Fit 可在 Android 设备上使用 Google Play 服务 7.0 或更高版本。 运行ning Android 2.3 或更高版本且具有 Google Play 商店应用的设备会自动接收 Google Play 服务的更新。

要检查您的设备上安装了哪个版本的 Google Play 服务,请转至设置 > 应用 > Google Play 服务。

确保您的开发主机上有 Google Play 服务的最新客户端库:

1.Open Android SDK 管理器。 2.Under 附加功能,找到 Google 播放服务和 Google 存储库。 3.If 这些包的状态与已安装不同,select 它们都是,然后单击安装包。

第 2 步:获取 Google 帐户 要使用 Google Fit API,您需要一个 Google 帐户。

第 3 步:启用健身 API 在 google 控制台创建一个项目

1.Go 到 Google 开发者控制台。 2.Click 创建项目。 3.In 在“项目名称”字段中,为您的项目键入一个名称,然后单击“创建”。

激活健身API 1.Go 到 Google 开发者控制台。 2.In左侧边栏,点击APIs和Auth。 3.Find Fitness API 并将其状态设置为 ON。

创建新的客户端 ID

1.Go 到 Google 开发者控制台。 2.In 在左侧边栏中,单击凭据。 3.Click 创建一个新的客户端 ID。出现“创建客户端 ID”对话框。 4.Under 应用程序类型,select 已安装的应用程序。 5.Under 安装的应用程序类型,select Android。 6.In 程序包名称字段,输入您的 Android 应用程序的程序包名称。 7.In 签名证书指纹 (SHA1) 字段,输入证书的 SHA1 指纹。 8.Click 创建客户端 ID。

第 4 步:配置项目

在 IDE 中,打开模块的 build.gradle 文件并添加 Google Play 服务客户端库作为依赖项:

 apply plugin: 'com.android.application'
    ...

    dependencies {
        compile 'com.google.android.gms:play-services-fitness:8.3.0'
    }

第 5 步:连接健身服务

开始 Android

本文档介绍了如何使用 Google Fit on Android 开始开发。 Google Fit 是 Google Play 服务的一部分。

第 1 步:获取 Google 播放服务

Google Fit 可在 Android 设备上使用 Google Play 服务 7.0 或更高版本。 运行ning Android 2.3 或更高版本且具有 Google Play 商店应用的设备会自动接收 Google Play 服务的更新。

要检查您的设备上安装了哪个版本的 Google Play 服务,请转至设置 > 应用 > Google Play 服务。

确保您的开发主机上有 Google Play 服务的最新客户端库:

打开 Android SDK 管理器。 在 Extras 下,找到 Google Play services 和 Google Repository。 如果这些包的状态不同于已安装,select 它们,然后单击安装包。 第 2 步:获取 Google 帐户

要使用 Google Fit API,您需要一个 Google 帐户。如果您已经有一个帐户,那么一切就绪。您可能还需要一个单独的 Google 帐户用于测试目的。

第 3 步:启用健身 API

要与 Google Fit 进行身份验证和通信,您必须在 Google 开发人员控制台中创建一个项目,激活 Fitness API,创建一个 OAuth 2.0 客户端 ID,然后注册public 来自您应用的已签名 APK 的证书。

创建项目

注意:对应用程序的 Android 和 REST 版本使用相同的项目。 转到 Google 开发人员控制台。 单击创建项目。 在“项目名称”字段中,为您的项目键入一个名称,然后单击“创建”。 激活健身API

转到 Google 开发人员控制台。 在左侧边栏中,单击 APIs 和 Auth。 找到 Fitness API 并将其状态设置为 ON。 Fitness API 现在出现在 API 列表的顶部。

获取证书的 SHA1 指纹

要为您的 Android 应用创建新的客户端 ID,您需要用于签署 APK 的证书的 SHA1 指纹。获取此指纹:

找到您的密钥库的位置。 在终端中,运行 来自 JDK 的 keytool 实用程序。例如,如果您使用 debug 密钥库: $ keytool -exportcert -alias \ androiddebugkey -keystore \ ~/.android/debug.keystore -list -v 注意:在 Mac OS 和 Linux 上,调试密钥库通常位于 ~/.android/debug.keystore。在 Windows,它通常位于 %USERPROFILE%.android\debug.keystore.

keytool 命令的输出包含证书的 SHA1 指纹。

图 1:“创建客户端 ID”对话框。 创建新的客户端 ID

转到 Google 开发人员控制台。 在左侧边栏中,单击凭据。 单击创建新的客户端 ID。出现“创建客户端 ID”对话框。 在“应用程序类型”下,select 已安装的应用程序。 在已安装的应用程序类型下,select Android。 在包名称字段中,输入 Android 应用程序的包名称。 在签名证书指纹 (SHA1) 字段中,输入证书的 SHA1 指纹。 单击创建客户端 ID。 第 4 步:配置您的项目

Android Studio 可以轻松地为 Google Fit 创建项目。按照创建项目中描述的步骤进行操作。

在 IDE 中,打开模块的 build.gradle 文件并添加 Google Play 服务客户端库作为依赖项:

apply plugin: 'com.android.application'
...

dependencies {
    compile 'com.google.android.gms:play-services-fitness:8.3.0'
}

第 5 步:连接到健身服务

在您可以从 Google Fit API 调用方法之前,您必须连接到适当的健身服务,这些服务是 Google Play 服务的一部分。您可以使用以下 API:

1.Fitness.SENSORS_API
2.Fitness.RECORDING_API
3.Fitness.HISTORY_API
4.Fitness.SESSIONS_API
5.Fitness.BLE_API
6.Fitness.CONFIG_API

创建API客户端如下:

1.Define activity 中的变量可帮助您跟踪连接状态:

private static final int REQUEST_OAUTH = 1;

/**
 *  Track whether an authorization activity is stacking over the current activity, i.e. when
 *  a known auth error is being resolved, such as showing the account chooser or presenting a
 *  consent dialog. This avoids common duplications as might happen on screen rotations, etc.
 */
private static final String AUTH_PENDING = "auth_state_pending";
private boolean authInProgress = false;

private GoogleApiClient mClient = null;

2.Determine是否在onCreate方法中进行认证:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Put application specific code here.

    if (savedInstanceState != null) {
        authInProgress = savedInstanceState.getBoolean(AUTH_PENDING);
    }

    buildFitnessClient();
}

**3.Create Google API 客户端并提供所需的回调方法:*

/**
 *  Build a {@link GoogleApiClient} that will authenticate the user and allow the application
 *  to connect to Fitness APIs. The scopes included should match the scopes your app needs
 *  (see documentation for details). Authentication will occasionally fail intentionally,
 *  and in those cases, there will be a known resolution, which the OnConnectionFailedListener()
 *  can address. Examples of this include the user never having signed in before, or having
 *  multiple accounts on the device and needing to specify which account to use, etc.
 */
private void buildFitnessClient() {
    // Create the Google API Client
    mClient = new GoogleApiClient.Builder(this)
            .addApi(Fitness.SENSORS_API)
            .addScope(new Scope(Scopes.FITNESS_LOCATION_READ))
            .addConnectionCallbacks(
                    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.
                        }

                        @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 == ConnectionCallbacks.CAUSE_NETWORK_LOST) {
                                Log.i(TAG, "Connection lost.  Cause: Network Lost.");
                            } else if (i == ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
                                Log.i(TAG, "Connection lost.  Reason: Service Disconnected");
                            }
                        }
                    }
            )
            .addOnConnectionFailedListener(
                    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);
                                }
                            }
                        }
                    }
            )
            .build();
}

4.Manage activity 中客户端的连接生命周期:

@Override
protected void onStart() {
    super.onStart();
    // Connect to the Fitness API
    Log.i(TAG, "Connecting...");
    mClient.connect();
}

@Override
protected void onStop() {
    super.onStop();
    if (mClient.isConnected()) {
        mClient.disconnect();
    }
}

@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();
            }
        }
    }
}

@Override
   protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
  }