在 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>
 * &lt;complexType name="EnrouteRequest">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="airport" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         &lt;element name="howMany" type="{http://www.w3.org/2001/XMLSchema}int"/>
 *         &lt;element name="filter" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         &lt;element name="offset" type="{http://www.w3.org/2001/XMLSchema}int"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/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());
            }
        });