【发布时间】: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 应用程序使用子类开箱即用的环境的详细信息?