为Google Fit创建自定义数据类型

时间:2015-04-10 17:25:37

标签: android google-fit custom-data-type

我一直在尝试为google fit应用程序创建自定义数据类型,但我遇到了一些错误。最初ConfigApi.createCustomDataType收到以下错误

“非静态方法”createCustomDataType(com.google.android.gms.common.api.GoolgeApiClient,com.google.android.gms.fitness.request.DataTypeCreateRequest)无法从静态上下文引用“

所以我实例化了ConfigApi以绕过该错误,然后在运行应用程序时出现以下错误:

java.lang.NullPointerException:尝试在null上调用接口方法'void com.google.android.gms.common.api.PendingResult.setResultCallback(com.google.android.gms.common.api.ResultCallback)'对象参考

该错误发生在这一行:pendingResult.setResultCallback

我希望有人可以帮助我解决我做错的事情,然后才开始制造比现有更糟糕的东西。以下是我正在使用的代码:

    // build a request to create a new data type
    DataTypeCreateRequest request = new DataTypeCreateRequest.Builder()
            .setName(myPackageName)
            .addField("custom", Field.FORMAT_INT32)
            .build();

    // invoke the CONFIG API with (Google API client object and create data type request)

    // instantiating ConfigApi due to the following error:
    // non-static method createCustomDataType cannot be referenced from a static context 

    ConfigApi configApi = new ConfigApi() {
        @Override
        public PendingResult<DataTypeResult> createCustomDataType(GoogleApiClient googleApiClient, DataTypeCreateRequest dataTypeCreateRequest) {
            return null;
        }

        @Override
        public PendingResult<DataTypeResult> readDataType(GoogleApiClient googleApiClient, String s) {
            return null;
        }

        @Override
        public PendingResult<Status> disableFit(GoogleApiClient googleApiClient) {
            return null;
        }
    };

    PendingResult<DataTypeResult> pendingResult =
            configApi.createCustomDataType(mClient, request);
    /** 
      * ConfigApi.createCustomDataType was getting the following error:
      * non-static method 'createCustomDataType 
      * (com.google.android.gms.common.api.GoolgeApiClient,
      * com.google.android.gms.fitness.request.DataTypeCreateRequest)
      * cannot be referenced from a static context
      */

    // 3. Check the result asynchronously
    // (The result may not be immediately available)
    pendingResult.setResultCallback(
            new ResultCallback<DataTypeResult>() {
                @Override
                public void onResult(DataTypeResult dataTypeResult) {

                    if (dataTypeResult.getStatus().isSuccess()){
                        DataType customType = dataTypeResult.getDataType();
                        // Use this custon data type to insert data in your app
                        onDataTypeAvailable(customType);
                    }

                    // Retrieve the created data type
                    // Use this custom data type to insert data in your app
                    // (see other examples)

                }
            }
    );
}

3 个答案:

答案 0 :(得分:3)

创建GoogleApiClient时,请务必添加配置API:

 GoogleApiClient client = new GoogleApiClient.Builder()
     .addApi(Fitness.CONFIG_API)
     ...
     .build();

答案 1 :(得分:0)

您可能希望使用Fitness.ConfigApi而不是创建自己的ConfigApi实现。

答案 2 :(得分:0)

扩展Guga的第一个答案(有点晚,但以防其他人有同样的问题):

我遇到了完全相同的问题。事实证明,概述中的示例代码(您可能找到here,正如我所做的那样)可能不完全正确。在Google的ConfigApi文档(here)中的一个示例中,类似的方法readDataType()被称为不同的方式(尽管错误的调用也会重复一次)。

将示例应用于createCustomDataType(),调用应如下所示:

PendingResult pendingResult = Fitness.ConfigApi.createCustomDataType(mClient, request);

(当然,不要忘记向您的客户添加正确的API。)