2016-01-28 68 views
0

綜述: 您好。我正嘗試使用Android中的FlightAware api獲取航班數據(航班路線和其他)。我不確定要完成這個任務的最好方法是什麼。我應該提到我有一個有效的用戶名和api密鑰。我正在使用Android Studio。使用Android系統中的FlightAware API

爲了更好地瞭解我在尋找什麼樣的信息,你可以看看他們的JavaScript example。下面是一個HTML頁面(他們的JavaScript示例)的圖片,該頁面允許使用FlightAware api中的數據在地圖上直觀顯示航線路徑: https://i.gyazo.com/ab7bb4560e698ae00dc9ef9a52eca64c.jpg。我有一種方法可以直觀地表示我的應用程序中的數據;我首先需要一種方式來獲取數據(在Android中)。

問題:因此,考慮到這一點,我如何查詢航班信息,就像你在Android上面的例子中看到的那樣?

不成功的嘗試:如果您轉到FlightAware站點的代碼示例部分,可以查看許多建議的實現api的方法。自然,我向下滾動到Java部分,因爲Android使用了相當大的Java部分。然後我嘗試在Android中實現NetBeans示例。問題是,我不確定如何使用Android Studio中提供的WSDL(以前從未聽說過WSDL)鏈接。我認爲這只是可以轉換成Java類的XML?我嘗試使用WSDL2Code(網站)將WSDL轉換爲我可以使用的Java類;這工作在一定程度上,但不能轉換所有我需要的類(仍然缺少一些)。然後我嘗試了Android插件EasyWSDL生成器(免費版),但生成的Java類比WSDL2Code少。最後,我進入NetBeans IDE並從WSDL鏈接生成Java類,並能夠生成所有Java類。但是,它們似乎在Android中不起作用,因爲通過NetBeans生成的Java類傾向於導入javax.xml.bind.annotation,這似乎並未包含在Android中。

下面是生成的Java類之一的一個例子,我從NetBeans中複製過來:

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; 
    } 

任何幫助將不勝感激!

回答

0

我似乎已經發現使用kso​​ap2工作的解決方案:

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是您將要處理的返回對象。這是您調用的方法將根據給定的參數返回的信息。

重要注意事項
您必須在執行上述代碼之前進行身份驗證,否則您將無法訪問FlightAware API。你可以用下面的代碼(用你的API密鑰替換User與您的用戶名和APIKEY)認證:

Authenticator.setDefault(new Authenticator() { 
      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication("User", 
         "APIKEY".toCharArray()); 
      } 
     }); 
+0

能否請您發佈您的代碼? –