Rumah >Java >javaTutorial >Mengapakah pengambilan data Google Directions KML tidak lagi berfungsi untuk apl Android?

Mengapakah pengambilan data Google Directions KML tidak lagi berfungsi untuk apl Android?

Linda Hamilton
Linda Hamiltonasal
2024-12-11 19:55:12642semak imbas

Why is Google Directions KML data retrieval no longer working for Android apps?

Mengapa mendapatkan semula Google Directions untuk Android menggunakan data KML tidak lagi berfungsi?

Pengenalan

Sebelum ini, adalah mungkin untuk mendapatkan Arah Google menggunakan data KML untuk aplikasi Android. Walau bagaimanapun, kaedah ini tidak lagi disokong.

Sebab Pemberhentian

Google telah menukar struktur API Arahnya, menjadikannya perlu untuk berhijrah ke JSON atau XML untuk pengambilan data. KML tidak lagi tersedia untuk tujuan ini.

Penyelesaian

Terdapat dua penyelesaian untuk menangani isu ini:

  1. Berpindah ke JSON

    • Buat kelas Java ke menghuraikan data JSON seperti yang ditunjukkan dalam coretan kod di bawah.
    • Gunakan kelas ini untuk mendapatkan dan menghuraikan data arah JSON.
  2. Alternatif

    • Pertimbangkan untuk menggunakan perkhidmatan pemetaan lain yang menyediakan KML data.
    • Teroka menggunakan API Tempat Google atau API Arah secara langsung.

Coretan Kod untuk Penghuraian JSON

Berikut ialah coretan kod untuk menghuraikan data arah JSON menggunakan Java kelas:

Parser.java

public interface Parser {
  public Route parse();
}

XMLParser.java

public abstract class XMLParser implements Parser {
  protected URL feedUrl;

  protected XMLParser(String feedUrl) throws MalformedURLException {
    this.feedUrl = new URL(feedUrl);
  }

  protected InputStream getInputStream() throws IOException {
    return feedUrl.openConnection().getInputStream();
  }
}

Seg ment.java

public class Segment {
  private GeoPoint start;
  private String instruction;
  private int length;
  private double distance;

  public Segment() {}

  public void setInstruction(String instruction) {
    this.instruction = instruction;
  }

  public String getInstruction() {
    return instruction;
  }

  public void setPoint(GeoPoint point) {
    start = point;
  }

  public GeoPoint startPoint() {
    return start;
  }
}

Route.java

public class Route {
  private String name;
  private List<GeoPoint> points = new ArrayList<>();
  private List<Segment> segments = new ArrayList<>();
  private String copyright;
  private String warning;
  private String country;
  private int length;
  private String polyline;

  public void addPoint(GeoPoint p) {
    points.add(p);
  }

  public List<GeoPoint> getPoints() {
    return points;
  }

  public void addSegment(Segment s) {
    segments.add(s);
  }

  public List<Segment> getSegments() {
    return segments;
  }
}

GoogleParser.java

public class GoogleParser extends XMLParser {
  private int distance;

  public GoogleParser(String feedUrl) throws MalformedURLException {
    super(feedUrl);
  }

  public Route parse() {
    // Convert stream to string
    String result = convertStreamToString(getInputStream());

    // Create route object
    Route route = new Route();
    Segment segment = new Segment();

    // Parse JSON object
    try {
      JSONObject json = new JSONObject(result);
      JSONObject jsonRoute = json.getJSONArray("routes").getJSONObject(0);
      JSONObject leg = jsonRoute.getJSONArray("legs").getJSONObject(0);
      JSONArray steps = leg.getJSONArray("steps");
      int numSteps = steps.length();

      route.setName(leg.getString("start_address") + " to " + leg.getString("end_address"));
      route.setCopyright(jsonRoute.getString("copyrights"));
      route.setLength(leg.getJSONObject("distance").getInt("value"));
      if (!jsonRoute.getJSONArray("warnings").isNull(0)) {
        route.setWarning(jsonRoute.getJSONArray("warnings").getString(0));
      }

      // Parse steps
      for (int i = 0; i < numSteps; i++) {
        JSONObject step = steps.getJSONObject(i);
        JSONObject start = step.getJSONObject("start_location");
        GeoPoint position = new GeoPoint((int) (start.getDouble("lat") * 1E6), (int) (start.getDouble("lng") * 1E6));
        segment.setPoint(position);
        int stepLength = step.getJSONObject("distance").getInt("value");
        distance += stepLength;
        segment.setLength(stepLength);
        segment.setDistance(distance / 1000);
        segment.setInstruction(step.getString("html_instructions").replaceAll("<(.*?)>", ""));
        route.addPoints(decodePolyLine(step.getJSONObject("polyline").getString("points")));
        route.addSegment(segment.copy());
      }
    } catch (JSONException e) {
      Log.e(e.getMessage(), "Google JSON Parser - " + feedUrl);
    }
    return route;
  }
}

Atas ialah kandungan terperinci Mengapakah pengambilan data Google Directions KML tidak lagi berfungsi untuk apl Android?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn