0

現在、MapView にルートをプロットする必要があるアプリケーションを設計しています。これが正しく機能するためには、取得した KML ドキュメントからデータを取得する必要があります。

http://maps.google.com/maps?f=d&hl=ja&saddr=-33.882993,18.63486&daddr=-33.870162,18.657837&ie=UTF8&0&om=0&output=kml

このデータが正しく受信されることを確認するために、テスト プロジェクトを作成しました。問題は、エミュレーターでは完全に動作しますが、実際の Android フォンでは動作しないことです。

次のコードは、ボタンがクリックされたときにスレッドを開始し、入力ストリーム レスポンス (KML) を取得します。

public void onClick(View v) {
        if (v.getId()== R.id.btn1)
        {   
              new Thread() {
                 @Override
                 public void run() {
                    String url = "http://maps.google.com/maps?f=d&hl=en&saddr=-33.882993,18.63486&daddr=-33.870162,18.657837&ie=UTF8&0&om=0&output=kml";
                    InputStream is = getConnection(url);

                    mRoad = RouteProvider.getRoute(is);
                    mHandler.sendEmptyMessage(0);
                 }
             }.start(); 
        }   

}

private InputStream getConnection(String url) {
    InputStream is = null;
    try {
           HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection();
            conn.connect();
            is = conn.getInputStream();
            conn = null;
    } catch (MalformedURLException e) {
            e.printStackTrace();
    } catch (IOException e) {
            e.printStackTrace();
    }
     return is;
    }

今のところ、getRoute() が行う必要があるのは、KML ドキュメント内の「LineString」要素のコンテンツを提供することだけです。これらの内容は、ルートの描画に使用できる座標のリストです。

public class RouteProvider {
    /** Gets data from KML response **/
    public static Road getRoute(InputStream is) {
        Road road = new Road();

        try 
        {
            Document xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
            NodeList a = xmlDoc.getElementsByTagName("LineString");
            System.out.println(a.item(0).getTextContent());
            road.mName = a.item(0).getTextContent();


        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }   


        return road;
      }

私が実行しているエミュレータでは、座標のリストであるroad.mName内に正しい値が表示されます。Android フォンでは null と表示されますか?

私はEclipseでAndroid 2.3.3用に構築しており、テストにはSamsung Galaxy S2を使用しました。

4

1 に答える 1

1

結局、KMLを使用する必要はありませんでした。ちょうどグーグルマップを使用してxml形式を提供しました。はるかに簡単です。 https://developers.google.com/maps/documentation/directions/

于 2012-12-07T09:20:28.373 に答える