【问题标题】:No able to create Device object for SyncResponse Payload无法为 SyncResponse Payload 创建设备对象
【发布时间】:2019-06-10 16:15:58
【问题描述】:

据我了解,SyncResponse 的有效负载是一个设备类型的数组。

我的问题是我无法创建在 SyncResponse - Payload - Device 中定义的设备类型的实例(无权访问)。

当我import com.google.actions.api.smarthome.SyncResponse.Payload.Device; 收到“无法解析”的错误时,设备引用出现“设备无法解析为类型”错误。

如果我使用com.google.api.services.actions_fulfillment.v2.model.Device,则在screenshot左侧显示SyncResponse.Payload.Device不可见(我无法上传图片),我无法投射。

由于我之前错过了添加代码,让我们从 OnOff 参考页面中使用,错误可能会在此处复制。

package com.example;

import java.util.Collections;
import java.util.Map;
import javax.annotation.Nullable;
import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
import com.google.actions.api.smarthome.DisconnectRequest;
import com.google.actions.api.smarthome.ExecuteRequest;
import com.google.actions.api.smarthome.ExecuteResponse;
import com.google.actions.api.smarthome.QueryRequest;
import com.google.actions.api.smarthome.QueryResponse;
import com.google.actions.api.smarthome.SmartHomeApp;
import com.google.actions.api.smarthome.SyncRequest;
import com.google.actions.api.smarthome.SyncResponse;
import com.google.actions.api.smarthome.SyncResponse.Payload;
import com.google.actions.api.smarthome.SyncResponse.Payload.Device;

public class MyActionsApp extends SmartHomeApp {

    @NotNull
    @Override
    public SyncResponse onSync(@NotNull SyncRequest syncRequest, @Nullable Map<?, ?> headers) {
        Payload payload = new Payload();
        payload.setAgentUserId("1836.15267389");
        payload.setDevices(new Device[] {
            new Device.Builder().setId("123")
                  .setType("action.devices.types.LIGHT")
                  .addTrait("action.devices.traits.OnOff")
                  .setName(
                      Collections.singletonList("AAA bulb A19 color hyperglow"),
                      "lamp1",
                      Collections.singletonList("reading lamp")
                  )
                  .setWillReportState(true)
                  .setAttributes(new JSONObject()
                      .put("commandOnlyOnOff", false)
                  )
                  .setDeviceInfo("BrandX", "hg11", "1.2", "5.4")
                  .setCustomData(new JSONObject()
                      .put("fooValue", 12)
                      .put("barValue", false)
                      .put("bazValue", "dancing alpaca")
                      .toString()
                  )
                  .build() });
        return new SyncResponse(syncRequest.getRequestId(), payload);
    }

    @Override
    public void onDisconnect(DisconnectRequest request, Map<?, ?> headers) {        
    }

    @Override
    public ExecuteResponse onExecute(ExecuteRequest request, Map<?, ?> headers) {
        return null;
    }

    @Override
    public QueryResponse onQuery(QueryRequest request, Map<?, ?> headers) {
        return null;
    }
}

我应该如何创建一个 Device 对象,或者如何转换它?

P.S.:抱歉之前没说清楚。

【问题讨论】:

  • 请提供更多细节和背景说明您正在尝试做什么。
  • 我刚刚添加了更多细节。
  • 您能否通过显式使用SyncResponse.Payload.Device 类型来验证它是否选择了正确的Device 对象?
  • 我相信是的。导入语句是否导入了错误的语句?顺便说一句,我开始使用的是Thermostat,甚至尝试显式使用com.google.actions.api.smarthome.SyncResponse.Payload.Device 并出现相同的“无法解析为类型”错误。
  • @NickFelker 我做了一些额外的测试,如果我将 MyActionsApp 转换为 Kotlin,应用程序能够看到 Device 子类。此外,如果我更改 SyncResponse,将 Device 向下移动一级,这对 Java 可见,但对子类 Builder 不可见。到目前为止,对于这种情况,我可以检查下 2 级的类对 Java 代码不可见,但对 Kotlin 可见。我在 MacOS 上使用 Java 8 (AdoptOpenJDK) 和 11 (Oracle) 进行了测试。我不了解 Kotlin 的可见性,但您能否提供更多有关 Java 应用程序使用子类开箱即用的环境的详细信息?

标签: java actions-on-google


【解决方案1】:

目前还不清楚您的具体问题是什么。该文档包含许多关于如何使用 Device 对象数组创建正确的 SyncResponse 的示例。

来自OnOff reference page

@NotNull
@Override
public SyncResponse onSync(@NotNull SyncRequest syncRequest, @Nullable Map<?, ?> headers) {
  Payload payload = new Payload();
  payload.setAgentUserId("1836.15267389");
  payload.setDevices(new Device[] {
      new Device.Builder()
          .setId("123")
          .setType("action.devices.types.LIGHT")
          .addTrait("action.devices.traits.OnOff")
          .setName(
              Collections.singletonList("AAA bulb A19 color hyperglow"),
              "lamp1",
              Collections.singletonList("reading lamp")
          )
          .setWillReportState(true)
          .setAttributes(new JSONObject()
              .put("commandOnlyOnOff", false)
          )
          .setDeviceInfo("BrandX", "hg11", "1.2", "5.4")
          .setCustomData(new JSONObject()
              .put("fooValue", 12)
              .put("barValue", false)
              .put("bazValue", "dancing alpaca")
              .toString()
          )
          .build()
  });
  return new SyncResponse(syncRequest.getRequestId(), payload);
}

【讨论】:

    【解决方案2】:

    曾是 JDT Core bug,并已在 Eclipse 版本 2019-09 上修复。

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      相关资源
      最近更新 更多