在android sdk中的两个位置之间的地图中绘制线条时出现问题

2023-11-29

package com.hands;

import java.net.HttpURLConnection;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.os.Bundle;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class DrawlineActivity extends MapActivity {
     MapView myMapView = null;
     MapController myMC = null;
     GeoPoint geoPoint = null;
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);
      myMapView = (MapView) findViewById(R.id.mapview);

      geoPoint = null;
      myMapView.setSatellite(false);
      double fromLat = 12.303534;
      double fromLong = 76.64611;
      double toLat = 12.9715987;
      double toLong = 77.5945627;

      String sourceLat = Double.toString(fromLat);
      String sourceLong = Double.toString(fromLong);
      String destinationLat = Double.toString(toLat);
      String destinationLong = Double.toString(toLong);

  String pairs[] = getDirectionData(sourceLat,sourceLong, destinationLat, destinationLong );
//The above line pairs[] retrieving null value. Showing as NULL POINTER EXCEPTION
      String[] lngLat = pairs[0].split(",");

      // STARTING POINT
      GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));

      myMC = myMapView.getController();
      geoPoint = startGP;
      myMC.setCenter(geoPoint);
      myMC.setZoom(10);
      myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP));

      // NAVIGATE THE PATH

      GeoPoint gp1;
      GeoPoint gp2 = startGP;

      for (int i = 1; i < pairs.length; i++) {
       lngLat = pairs[i].split(",");
       gp1 = gp2;
       // watch out! For GeoPoint, first:latitude, second:longitude

       gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),(int) (Double.parseDouble(lngLat[0]) * 1E6));
       myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2));
       Log.d("xxx", "pair:" + pairs[i]);
      }

      // END POINT
      myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2));

      myMapView.getController().animateTo(startGP);
      myMapView.setBuiltInZoomControls(true);
      myMapView.displayZoomControls(true);

     }

     @Override
     protected boolean isRouteDisplayed() {
      // TODO Auto-generated method stub
      return false;
     }

Layout

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

   <com.google.android.maps.MapView
           android:id="@+id/mapview"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"
             android:apiKey="034BXAeVNYe1Ob063cZUpablCB_0y7xjEGD3RhQ"
             />

Logcat 详细信息

08-10 09:03:20.216: W/dalvikvm(305): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-10 09:03:20.246: E/AndroidRuntime(305): FATAL EXCEPTION: main
08-10 09:03:20.246: E/AndroidRuntime(305): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hands/com.hands.DrawlineActivity}: java.lang.NullPointerException
08-10 09:03:20.246: E/AndroidRuntime(305):       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-10 09:03:20.246: E/AndroidRuntime(305):       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-10 09:03:20.246: E/AndroidRuntime(305):       at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-10 09:03:20.246: E/AndroidRuntime(305):       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-10 09:03:20.246: E/AndroidRuntime(305):       at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 09:03:20.246: E/AndroidRuntime(305):       at android.os.Looper.loop(Looper.java:123)
08-10 09:03:20.246: E/AndroidRuntime(305):       at android.app.ActivityThread.main(ActivityThread.java:4627)
08-10 09:03:20.246: E/AndroidRuntime(305):       at java.lang.reflect.Method.invokeNative(Native Method)
08-10 09:03:20.246: E/AndroidRuntime(305):       at java.lang.reflect.Method.invoke(Method.java:521)
08-10 09:03:20.246: E/AndroidRuntime(305):       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-10 09:03:20.246: E/AndroidRuntime(305):       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-10 09:03:20.246: E/AndroidRuntime(305):       at dalvik.system.NativeStart.main(Native Method)
08-10 09:03:20.246: E/AndroidRuntime(305): Caused by: java.lang.NullPointerException
08-10 09:03:20.246: E/AndroidRuntime(305):       at com.hands.DrawlineActivity.getDirectionData(DrawlineActivity.java:111)
08-10 09:03:20.246: E/AndroidRuntime(305):       at com.hands.DrawlineActivity.onCreate(DrawlineActivity.java:44)
08-10 09:03:20.246: E/AndroidRuntime(305):       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-10 09:03:20.246: E/AndroidRuntime(305):       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-10 09:03:20.246: E/AndroidRuntime(305):       ... 11 more

更新了 getDirection 方法代码

包com.hands;

导入 java.net.HttpURLConnection; 导入java.net.URL;

导入 javax.xml.parsers.DocumentBuilder; 导入 javax.xml.parsers.DocumentBuilderFactory;

导入 org.w3c.dom.Document; 导入 org.w3c.dom.Node; 导入 org.w3c.dom.NodeList;

导入 android.os.Bundle; 导入 android.util.Log;

导入 com.google.android.maps.GeoPoint; 导入 com.google.android.maps.MapActivity; 导入 com.google.android.maps.MapController; 导入 com.google.android.maps.MapView;

公共类 DrawlineActivity 扩展 MapActivity { 地图视图 myMapView = null; MapController myMC = null; GeoPoint geoPoint = null; @覆盖 公共无效onCreate(捆绑保存实例状态){ super.onCreate(savedInstanceState);

  setContentView(R.layout.main);
  myMapView = (MapView) findViewById(R.id.mapview);

  geoPoint = null;
  myMapView.setSatellite(false);
  double fromLat = 12.303534;
  double fromLong = 76.64611;
  double toLat = 12.9715987;
  double toLong = 77.5945627;

  String sourceLat = Double.toString(fromLat);
  String sourceLong = Double.toString(fromLong);
  String destinationLat = Double.toString(toLat);
  String destinationLong = Double.toString(toLong);

  String pairs[] = getDirectionData(sourceLat,sourceLong, destinationLat, destinationLong );
  String[] lngLat = pairs[0].split(",");

  // STARTING POINT
  GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));

  myMC = myMapView.getController();
  geoPoint = startGP;
  myMC.setCenter(geoPoint);
  myMC.setZoom(10);
  myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP));

  // NAVIGATE THE PATH

  GeoPoint gp1;
  GeoPoint gp2 = startGP;

  for (int i = 1; i < pairs.length; i++) {
   lngLat = pairs[i].split(",");
   gp1 = gp2;
   // watch out! For GeoPoint, first:latitude, second:longitude

   gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),(int) (Double.parseDouble(lngLat[0]) * 1E6));
   myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2));
   Log.d("xxx", "pair:" + pairs[i]);
  }

  // END POINT
  myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2));

  myMapView.getController().animateTo(startGP);
  myMapView.setBuiltInZoomControls(true);
  myMapView.displayZoomControls(true);

 }

 @Override
 protected boolean isRouteDisplayed() {
  // TODO Auto-generated method stub
  return false;
 }

 private String[] getDirectionData(String sourceLat, String sourceLong, String destinationLat, String destinationLong) {


  String urlString = "http://maps.google.com/maps?f=d&hl=en&" +"saddr="+sourceLat+","+sourceLong+"&daddr="+destinationLat+","+destinationLong + "&ie=UTF8&0&om=0&output=kml";
  Log.d("URL", urlString);
  Document doc = null;
  HttpURLConnection urlConnection = null;
  URL url = null;
  String pathConent = "";

  try {

   url = new URL(urlString.toString());
   urlConnection = (HttpURLConnection) url.openConnection();
   urlConnection.setRequestMethod("GET");
   urlConnection.setDoOutput(true);
   urlConnection.setDoInput(true);
   urlConnection.connect();
   DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   DocumentBuilder db = dbf.newDocumentBuilder();
   doc = db.parse(urlConnection.getInputStream());

  } catch (Exception e) {
  }

  NodeList nl = doc.getElementsByTagName("LineString");
  for (int s = 0; s < nl.getLength(); s++) {
   Node rootNode = nl.item(s);
   NodeList configItems = rootNode.getChildNodes();
   for (int x = 0; x < configItems.getLength(); x++) {
    Node lineStringNode = configItems.item(x);
    NodeList path = lineStringNode.getChildNodes();
    pathConent = path.item(0).getNodeValue();
   }
  }
  String[] tempContent = pathConent.split(" ");
  return tempContent;
 }

}

正如 logcat 所解释的,当您调用 getDirectionData() 方法时,您将收到 NullPointerException。上面的代码中没有显示这个方法。您可以添加这个方法以便我们看看问题出在哪里吗?

Edit:感谢您添加 getDirectionData() 方法。目前尚不清楚问题出在哪里,但一个问题是您有一个空的 catch 块 - 这将吞掉异常,然后您继续处理代码。例如,如果该行

doc = db.parse(urlConnection.getInputStream());

抛出异常或返回 null,然后您尝试从 null 对象获取 NodeList - 这会给您带来空指针异常。我建议在此方法的开头放置一个断点并逐步执行它,同时检查变量。这将确定问题的根源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在android sdk中的两个位置之间的地图中绘制线条时出现问题 的相关文章

随机推荐

  • 序列化/反序列化协议缓冲区

    我目前正在使用 Protocol Buffers C 版本 3 我正在向不同的服务来回发送消息 目前正在尝试将某些消息中存储的一些数据保存到数据库 实际上可以是任何类型 问题在于byte 被创建为类型字节串 and 列表被创建为重复字段 现
  • 如何在列表框中的项目之间显示分隔线?

    我在 Windows Phone 7 应用程序中使用 ListBox 控件 我想在列表行之间显示分隔线 线 尽管许多 不是 wp7 ListBox 示例似乎都有分隔符 但我无法找到有关此内容的任何信息 受到 NestorArturo 的启发
  • 导航时部分页面更新(PrimeFaces ajax)

    我使用 Facelets 模板完成了一个基本的 JSF 应用程序 我的模板如下
  • Android HTTP 用户代理

    如何在http user agent中获取真实设备 当我使用 WebView 时 我可以获得这样的真实值 HTTP USER AGENT gt Mozilla 5 0 Linux U Android 2 2 en gb LG P500 Bu
  • 如何解码视图状态

    我需要查看 ASP NET 页面的视图状态内容 我寻找视图状态解码器 发现Fridz Onion 的 ViewState 解码器但它要求页面的 url 来获取其视图状态 由于我的视图状态是在回发后形成的 并且是更新面板中操作的结果 因此我无
  • SQL 分组依据/计数:对多个列中的相同值进行计数?

    我试图弄清楚如何编写一个对多个列的值进行计数的查询 结果表在每列中对每个可能的值进行计数any column 示例 假设我有mytable Source data table P1 P2 P3 a b a a a a b b b a b b
  • 对象未添加到 NSMutableArray Objective -C

    我试图简单地将对象添加到可变数组中 但它们不会插入 我没有收到错误或任何错误 我不知道发生了什么 在我的主委托文件中 我将一个数组分成 4 个单独的字符串 如下所示 NSArray split currentParsedCharacterD
  • 如何避免使用 ANTLR3 构建中间和无用的 AST 节点?

    我编写了一个 ANTLR3 语法 该语法细分为更小的规则以提高可读性 例如 messageSequenceChart msc mscHead bmsc endmsc end Where mscHead is a shortcut to ms
  • 使用 std::chrono 计算持续时间会给出 0 纳秒,而它应该需要很长时间

    我试图使用 std chrono 计算 for 循环所花费的持续时间 但即使我通过增加绑定值使循环花费更长的时间 它也会给出 0 纳秒 这是代码 pragma pack 1 dont align let s let it take long
  • 存储过程和针对未知进行优化

    我已经阅读了 SQL Server 2008 OPTIMIZE FOR UNKNOWN 查询提示 我明白它是如何运作的 不过 我有一个问题where and when使用它 不能在 UDF 内指定它 它可以在存储过程中指定 然而 thisM
  • 从管道命令读取文件名

    所以我试图让 C 程序从命令行读取以下格式的文件名 cat 文件名路径 节目名称 当它作为命令行参数输入时 我可以让它读取输入文件的名称 但它不会从连接的参数中读取 这是代码 现在它读取文件名 就像在命令行上的程序名称后面写入一样 incl
  • 在 Vec 的中间或开头有效地插入或替换多个元素?

    有没有直接的方法来插入或替换多个元素 T and or Vec
  • 计算假期:Oracle中查询给定日期范围内的星期六和星期日的数量

    我想计算假期 在Oracle中查询给定日期范围内的星期六和星期日的数量 你可以使用行生成器技术首先生成给定范围的日期 然后仅计算周六和周日 例如 此查询将提供 2014 年 1 月 1 日至 2014 年 12 月 31 日期间星期六和星期
  • 如何使用 Google-Maps-for-Rails 将信息窗口自动显示为打开状态

    我想显示一张地图 其中为页面上的单个标记自动显示信息窗口框 就像http code google com apis maps documentation javascript examples map coordinates html 我尝
  • 通过Javascript调用C#函数(不使用Json)

    我在 JavaScript Mypage aspx 中有一个名为 callfunction 的函数 该函数应该调用 C 中的另一个函数 func Mypage aspx cs 像这样的事情 在我的页面 aspx 中 function cal
  • Python CSV 导入以及嵌套列表创建

    我试图简单地将 csv 导入到 Python 中 我读过很多文档 但我一生都不知道如何执行以下操作 CSV格式如下 NYC 22 55 BOSTON 39 22 我试图生成以下内容 NYC 22 55 BOSTON 39 22 以便我可以在
  • R 中的月环比客户保留率

    我正在尝试提出一种使用 39 万行的大型数据集计算逐月客户保留率的方法 基本上 我想知道一个月内在场的客户与上个月在场的客户的百分比 因此 如果上个月 客户 a b 和 c 购买了一种产品 本月 客户 b c 和 d 进行了购买 上个月的三
  • 如何与pipenv共享虚拟环境?

    Pipenv 虚拟环境 venv 将与子文件夹共享 例如 如果您安装了venv in foo 它将可以在 foo baz 但如果你想分享相同的内容怎么办venv之间 foo bob and baz alice 以下对我有用 我希望它能有所帮
  • 对数据框中的数据列重新排序(删除/更改顺序)

    我有两个大型数据集 并且我正在尝试重新格式化旧数据集 以将问题按照与新数据集相同的顺序排列 这样我就可以轻松地对每个相同的问题执行 t 检验 以跟踪 2 个数据集的显着变化 数据集之间的年数 新版本在旧版本的基础上删除了一些问题 并增加了一
  • 在android sdk中的两个位置之间的地图中绘制线条时出现问题

    package com hands import java net HttpURLConnection import java net URL import javax xml parsers DocumentBuilder import