在 Android 中使用 FlightAware API
Use FlightAware API in Android
概览:
你好。我正在尝试使用 Android 中的 FlightAware api 获取飞行数据(飞行路径等等)。我不确定完成此任务的最佳方法是什么。我应该提一下,我确实有一个有效的用户名和 api 密钥。我正在使用 Android Studio。
要更好地了解我正在寻找什么样的信息,您可以查看他们的 Java脚本 example。这是 HTML 页面的图片(他们的 Java 脚本示例),它允许使用来自 FlightAware api 的数据在地图上直观地表示飞行路径:
https://i.gyazo.com/ab7bb4560e698ae00dc9ef9a52eca64c.jpg。我有办法在我的应用程序中直观地表示数据;我只需要一种首先获取数据的方法(在 Android 中)。
问题: 考虑到这一点,我如何查询航班信息,就像您在上面的示例中看到的那样 Android?
不成功的尝试: 如果您转到 FlightAware 站点的代码示例部分,您可以查看许多建议的实施方法 api。自然地,我向下滚动到 Java 部分,因为 Android 使用了 Java 的相当大一部分。然后我尝试在 Android 中实现 NetBeans 示例。问题是,我不确定如何使用他们在 Android Studio 中提供的 WSDL(以前从未听说过 WSDL)link。我搜集到只有XML可以转换成Java类?我尝试使用 WSDL2Code(网站)将 WSDL 转换为我可以使用的 Java 类;这在某种程度上起作用,但无法转换我需要的 类 的 all(仍然缺少一些)。然后我尝试了 Android 插件 EasyWSDL 生成器(免费版),但它生成的 Java 类 比 WSDL2Code 还要少。最后,我进入 NetBeans IDE 并从 WSDL link 生成 Java 类 并且能够生成所有 Java 类.但是,它们似乎在 Android 中不起作用,因为通过 NetBeans 生成的 Java 类 倾向于导入 javax.xml.bind.annotation
,而 javax.xml.bind.annotation
似乎不包含在 Android。
这是我从 NetBeans 复制过来的生成的 Java 类 之一的示例:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for EnrouteRequest complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="EnrouteRequest">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="airport" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="howMany" type="{http://www.w3.org/2001/XMLSchema}int"/>
* <element name="filter" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="offset" type="{http://www.w3.org/2001/XMLSchema}int"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "EnrouteRequest", propOrder = {
"airport",
"howMany",
"filter",
"offset"
})
public class EnrouteRequest {
@XmlElement(required = true)
protected String airport;
protected int howMany;
@XmlElement(required = true)
protected String filter;
protected int offset;
/**
* Gets the value of the airport property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getAirport() {
return airport;
}
/**
* Sets the value of the airport property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setAirport(String value) {
this.airport = value;
}
如有任何帮助,我们将不胜感激!
我似乎找到了使用 ksoap2 的有效解决方案:
1).将 ksoap2 库添加到您的 libs 文件夹中。你可以找到 here。
2).创建一个新线程。
3).在该线程中输入以下代码:
MarshalBase64 mbase = new MarshalBase64();
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("howMany", howMany);
request.addProperty("airport", airport);
request.addProperty("filter", "");
request.addProperty("offset", 0);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
envelope.encodingStyle = SoapSerializationEnvelope.ENC2003;
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
String n = "";
HttpTransportSE ht = new HttpTransportSE(URL, 60000);
ht.debug = true;
try {
mbase.register(envelope);
ht.call(SOAP_ACTION, envelope);
SoapObject response = (SoapObject) envelope.getResponse();
} catch (Exception e) {
e.printStackTrace();
}
解释:
NAMESPACE
是“http://flightxml.flightaware.com/soap/FlightXML2”。
METHOD_NAME
是您调用的方法的名称,在我的例子中是 "EnrouteRequest"。
mbase
用于序列化字节数组。
request.addProperty
用于添加参数。就我而言,该特定方法有四个参数。
response
是您要处理的 returned 对象。这是您调用的方法将根据给定参数 return 的信息。
重要提示!
您必须在执行上述代码之前进行身份验证,否则您将无法访问 FlightAware API。您可以使用以下代码进行身份验证(将 User
替换为您的用户名,将 APIKEY
替换为您的 API 密钥):
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("User",
"APIKEY".toCharArray());
}
});
概览: 你好。我正在尝试使用 Android 中的 FlightAware api 获取飞行数据(飞行路径等等)。我不确定完成此任务的最佳方法是什么。我应该提一下,我确实有一个有效的用户名和 api 密钥。我正在使用 Android Studio。
要更好地了解我正在寻找什么样的信息,您可以查看他们的 Java脚本 example。这是 HTML 页面的图片(他们的 Java 脚本示例),它允许使用来自 FlightAware api 的数据在地图上直观地表示飞行路径: https://i.gyazo.com/ab7bb4560e698ae00dc9ef9a52eca64c.jpg。我有办法在我的应用程序中直观地表示数据;我只需要一种首先获取数据的方法(在 Android 中)。
问题: 考虑到这一点,我如何查询航班信息,就像您在上面的示例中看到的那样 Android?
不成功的尝试: 如果您转到 FlightAware 站点的代码示例部分,您可以查看许多建议的实施方法 api。自然地,我向下滚动到 Java 部分,因为 Android 使用了 Java 的相当大一部分。然后我尝试在 Android 中实现 NetBeans 示例。问题是,我不确定如何使用他们在 Android Studio 中提供的 WSDL(以前从未听说过 WSDL)link。我搜集到只有XML可以转换成Java类?我尝试使用 WSDL2Code(网站)将 WSDL 转换为我可以使用的 Java 类;这在某种程度上起作用,但无法转换我需要的 类 的 all(仍然缺少一些)。然后我尝试了 Android 插件 EasyWSDL 生成器(免费版),但它生成的 Java 类 比 WSDL2Code 还要少。最后,我进入 NetBeans IDE 并从 WSDL link 生成 Java 类 并且能够生成所有 Java 类.但是,它们似乎在 Android 中不起作用,因为通过 NetBeans 生成的 Java 类 倾向于导入 javax.xml.bind.annotation
,而 javax.xml.bind.annotation
似乎不包含在 Android。
这是我从 NetBeans 复制过来的生成的 Java 类 之一的示例:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for EnrouteRequest complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="EnrouteRequest">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="airport" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="howMany" type="{http://www.w3.org/2001/XMLSchema}int"/>
* <element name="filter" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="offset" type="{http://www.w3.org/2001/XMLSchema}int"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "EnrouteRequest", propOrder = {
"airport",
"howMany",
"filter",
"offset"
})
public class EnrouteRequest {
@XmlElement(required = true)
protected String airport;
protected int howMany;
@XmlElement(required = true)
protected String filter;
protected int offset;
/**
* Gets the value of the airport property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getAirport() {
return airport;
}
/**
* Sets the value of the airport property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setAirport(String value) {
this.airport = value;
}
如有任何帮助,我们将不胜感激!
我似乎找到了使用 ksoap2 的有效解决方案:
1).将 ksoap2 库添加到您的 libs 文件夹中。你可以找到 here。
2).创建一个新线程。
3).在该线程中输入以下代码:
MarshalBase64 mbase = new MarshalBase64();
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("howMany", howMany);
request.addProperty("airport", airport);
request.addProperty("filter", "");
request.addProperty("offset", 0);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
envelope.encodingStyle = SoapSerializationEnvelope.ENC2003;
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
String n = "";
HttpTransportSE ht = new HttpTransportSE(URL, 60000);
ht.debug = true;
try {
mbase.register(envelope);
ht.call(SOAP_ACTION, envelope);
SoapObject response = (SoapObject) envelope.getResponse();
} catch (Exception e) {
e.printStackTrace();
}
解释:
NAMESPACE
是“http://flightxml.flightaware.com/soap/FlightXML2”。METHOD_NAME
是您调用的方法的名称,在我的例子中是 "EnrouteRequest"。mbase
用于序列化字节数组。request.addProperty
用于添加参数。就我而言,该特定方法有四个参数。response
是您要处理的 returned 对象。这是您调用的方法将根据给定参数 return 的信息。
重要提示!
您必须在执行上述代码之前进行身份验证,否则您将无法访问 FlightAware API。您可以使用以下代码进行身份验证(将 User
替换为您的用户名,将 APIKEY
替换为您的 API 密钥):
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("User",
"APIKEY".toCharArray());
}
});