【问题标题】:Creating Custom DataType for GoogleFit为 Google Fit 创建自定义数据类型
【发布时间】:2015-04-10 17:25:36
【问题描述】:

我一直在尝试为 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)

                }
            }
    );
}

【问题讨论】:

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


    【解决方案1】:

    当您创建 GoogleApiClient 时,请确保添加配置 API:

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

    【讨论】:

    • 谢谢,我没有意识到我可以向 GoogleApiClient 添加多个 API
    【解决方案2】:

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

    【讨论】:

    • 谢谢,所以我将其更改为 Fitness.ConfigApi,现在我收到一条错误消息,指出未请求适当的 Api。
    【解决方案3】:

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

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

    将例子应用到createCustomDataType(),调用应该如下:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      相关资源
      最近更新 更多