現在、MapView にルートをプロットする必要があるアプリケーションを設計しています。これが正しく機能するためには、取得した 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を使用しました。