Android Google Map V3 PolyLine无法绘制 [英] Android Google Map V3 PolyLine cannot be drawn

查看:144
本文介绍了Android Google Map V3 PolyLine无法绘制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Google Map上匹配PolyLine时出现此错误

b $ b com.google.android.gms.maps.model.PolylineOptions.c'对一个空对象
引用

这是Logcat中提到的行


at
testappmapv2.PathGoogleMapActivity $ ParserTask.onPostExecute(PathGoogleMapActivity.java:208)



googleMap.addPolyline(polyLineOptions);

这是我的活动代码:

  import android.app.AlarmManager; import android.app.PendingIntent; 
导入android.content.Context;导入android.content.Intent;
导入android.graphics.Color;导入android.location.Location;

导入android.os.AsyncTask;导入android.os.Bundle;
导入android.support.v4.app.FragmentActivity;
导入android.util.Log;
import com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.Marker;
导入com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;
import com.parse.ParseException;
import com.parse.ParseGeoPoint;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import org.json.JSONObject;
import java.util.ArrayList; import java.util.HashMap;
import java.util.List;

public class PathGoogleMapActivity extends FragmentActivity {

Location mCurrentLocation;
String mLastUpdateTime;
GoogleMap google地图;
LatLng visitedPoints,currentPoints;
final String TAG =PathGoogleMapActivity;
MarkerOptions选项;
标记标记;
private final String DIRECTIONS_API_KEY =*****************;
private String parseClass =LocationManager;
private String User_id =12345;
私人列表< ParseObject>列表;
私人列表< LatLng> latLngList = new ArrayList< LatLng>();

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_path_google_map);
SupportMapFragment fm =(SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map);
googleMap = fm.getMap();
googleMap.getUiSettings()。setZoomControlsEnabled(true);




$ b @Override
protected void onResume(){
super.onResume();

尝试{
ParseQuery< ParseObject> parseQuery = ParseQuery.getQuery(parseClass);
parseQuery.whereEqualTo(User_Id,User_id);

list = parseQuery.find();

final ArrayList visitedPoint =(ArrayList)list.get(0).get(VisitedPoint);

(Object parseGeoPoint:visitedPoint){

ParseGeoPoint geoPoint =(ParseGeoPoint)parseGeoPoint;
LatLng latLng = new LatLng(geoPoint.getLatitude(),geoPoint.getLongitude());
latLngList.add(latLng);
Log.i(TAG,parseGeoPoint+ latLng.toString());


googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLngList.get(latLngList.size() - 1),
15.0f));

Log.i(TAG,List of Size:+ list.size());
Log.i(TAG,ArrayList:+ visitedPoint.size());
Log.i(TAG,ArrayList:+ visitedPoint.toString());

$ b $ catch(ParseException e){
e.printStackTrace();
}

for(int i = 0; i< latLngList.size() - 1; i ++)
{
String url = getMapsApiDirectionsUrl(latLngList.get i),latLngList.get(i + 1));
ReadTask downloadTask = new ReadTask();
downloadTask.execute(url);
addMarkers(latLngList.get(i + 1));
}}



private String getMapsApiDirectionsUrl(LatLng start,LatLng end){

String output =json;
String url =https://maps.googleapis.com/maps/api/directions/json?
+origin =+ start.latitude +,+ start.longitude
+& destination =+ end.latitude +,+ end.longitude
+ & sensor = false& units = metric& mode = walking& key =+ DIRECTIONS_API_KEY;
返回网址;
}

private void addMarkers(LatLng latLng){

marker = googleMap.addMarker(new MarkerOptions()。position(latLng).title(You are这里));
}

private class ReadTask extends AsyncTask< String,Void,String> {
@Override
protected String doInBackground(String ... url){
String data =;
尝试{
HttpConnection http = new HttpConnection();
data = http.readUrl(url [0]);
} catch(Exception e){
Log.d(Background Task,e.toString());
}
返回数据;
}

@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
new ParserTask()。execute(result);
}
}

private class ParserTask extends
AsyncTask< String,Integer,List< List< HashMap< String,String>>>> {
@Override
protected List< List< HashMap< String,String>>> doInBackground(
String ... jsonData){
JSONObject jObject;
List< List< HashMap< String,String>>> routes = null;
尝试{
jObject = new JSONObject(jsonData [0]);
PathJSONParser parser = new PathJSONParser();
routes = parser.parse(jObject);
} catch(Exception e){
e.printStackTrace();
}
返回路线;

$ b @Override
protected void onPostExecute(List< List< HashMap< String,String>>> routes){
ArrayList< LatLng> points = null;
PolylineOptions polyLineOptions = null;

//遍历路由
for(int i = 0; i< routes.size(); i ++){
points = new ArrayList< LatLng>();
polyLineOptions = new PolylineOptions();
List< HashMap< String,String>> path = routes.get(i);

for(int j = 0; j< path.size(); j ++){
HashMap< String,String> point = path.get(j);

double lat = Double.parseDouble(point.get(lat));
double lng = Double.parseDouble(point.get(lng));
LatLng position = new LatLng(lat,lng);

points.add(position);
}

polyLineOptions.addAll(points);
polyLineOptions.width(2);
polyLineOptions.color(Color.BLUE);
}

googleMap.addPolyline(polyLineOptions);
}}}

我确定GeoPoints来自Parse Server。
任何帮助将不胜感激。
Thanks $ / $>

解决方案

看起来像 polyLineOptions 永远不会被实例化。



如果 routes.size()为0


$ b, $ b

您的问题似乎与传递给 onPostExecute 方法的数据有关,因此请检查它是否有效以及它是否正确解析



在任何情况下,您都应该在使用前检查 polyLineOptions 是否为空,例如

  if(polyLineOptions!= null)
{
googleMap.addPolyline(polyLineOptions);
}

这会确保您的应用程序不会在出现错误时崩溃接收或解析数据。

Getting this error while trying to match PolyLine on Google Map

java.lang.NullPointerException: Attempt to read from field 'float com.google.android.gms.maps.model.PolylineOptions.c' on a null object reference

This is the line mentioned in Logcat

at testappmapv2.PathGoogleMapActivity$ParserTask.onPostExecute(PathGoogleMapActivity.java:208)

googleMap.addPolyline(polyLineOptions);

This is my Activity Code:

import android.app.AlarmManager; import android.app.PendingIntent;
import android.content.Context; import android.content.Intent;
import android.graphics.Color; import android.location.Location;               

import android.os.AsyncTask; import android.os.Bundle;  
import android.support.v4.app.FragmentActivity;  
import android.util.Log;
import com.google.android.gms.maps.CameraUpdateFactory;  
import com.google.android.gms.maps.GoogleMap;  
import com.google.android.gms.maps.SupportMapFragment;  
import com.google.android.gms.maps.model.LatLng;  
import com.google.android.gms.maps.model.Marker;  
import com.google.android.gms.maps.model.MarkerOptions;  
import com.google.android.gms.maps.model.PolylineOptions;  
import com.parse.ParseException; 
import com.parse.ParseGeoPoint;  
import com.parse.ParseObject; 
import com.parse.ParseQuery;

import org.json.JSONObject;
import java.util.ArrayList; import java.util.HashMap; 
import java.util.List;

 public class PathGoogleMapActivity extends FragmentActivity {

         Location mCurrentLocation;
         String mLastUpdateTime;
         GoogleMap googleMap;
         LatLng visitedPoints, currentPoints;
         final String TAG = "PathGoogleMapActivity";
         MarkerOptions options;
         Marker marker;
         private final String DIRECTIONS_API_KEY = "*****************";
         private String parseClass = "LocationManager";
         private String User_id = "12345";
         private List<ParseObject> list;
         private List<LatLng> latLngList=new ArrayList<LatLng>();

         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.activity_path_google_map);
             SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager()
                     .findFragmentById(R.id.map);
             googleMap = fm.getMap();
             googleMap.getUiSettings().setZoomControlsEnabled(true);        

         }



         @Override
         protected void onResume() {
             super.onResume();

             try {
                 ParseQuery<ParseObject> parseQuery = ParseQuery.getQuery(parseClass);
                 parseQuery.whereEqualTo("User_Id", User_id);

                 list = parseQuery.find();

                 final ArrayList visitedPoint = (ArrayList) list.get(0).get("VisitedPoint");

                 for (Object parseGeoPoint : visitedPoint) {

                     ParseGeoPoint geoPoint = (ParseGeoPoint) parseGeoPoint;
                     LatLng latLng = new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude());
                     latLngList.add(latLng);
                     Log.i(TAG, "parseGeoPoint" + latLng.toString());
                 }

                 googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLngList.get(latLngList.size()-1),
    15.0f));

                 Log.i(TAG, "Size of List: " + list.size());
                 Log.i(TAG, "ArrayList: " + visitedPoint.size());
                 Log.i(TAG, "ArrayList: " + visitedPoint.toString());


             } catch (ParseException e) {
                 e.printStackTrace();
             }

             for(int i=0;i<latLngList.size()-1;i++)
             {
                 String url = getMapsApiDirectionsUrl(latLngList.get(i), latLngList.get(i+1));
                 ReadTask downloadTask = new ReadTask();
                 downloadTask.execute(url);
                 addMarkers(latLngList.get(i+1));
             }    }



         private String getMapsApiDirectionsUrl(LatLng start, LatLng end) {

             String output = "json";
             String url = "https://maps.googleapis.com/maps/api/directions/json?"
                     + "origin=" + start.latitude + "," + start.longitude
                     + "&destination=" + end.latitude + "," + end.longitude
                     + "&sensor=false&units=metric&mode=walking&key=" + DIRECTIONS_API_KEY;
             return url;
         }

         private void addMarkers(LatLng latLng) {      

             marker = googleMap.addMarker(new MarkerOptions().position(latLng).title("You are here"));
         }

         private class ReadTask extends AsyncTask<String, Void, String> {
             @Override
             protected String doInBackground(String... url) {
                 String data = "";
                try {
                     HttpConnection http = new HttpConnection();
                     data = http.readUrl(url[0]);
                 } catch (Exception e) {
                     Log.d("Background Task", e.toString());
                 }
                 return data;
             }

             @Override
             protected void onPostExecute(String result) {
                 super.onPostExecute(result);
                 new ParserTask().execute(result);
             }
         }

         private class ParserTask extends
                 AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
             @Override
             protected List<List<HashMap<String, String>>> doInBackground(
                     String... jsonData) {
                 JSONObject jObject;
                 List<List<HashMap<String, String>>> routes = null;
                 try {
                     jObject = new JSONObject(jsonData[0]);
                     PathJSONParser parser = new PathJSONParser();
                     routes = parser.parse(jObject);
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
                 return routes;
             }

             @Override
             protected void onPostExecute(List<List<HashMap<String, String>>> routes) {
                 ArrayList<LatLng> points = null;
                 PolylineOptions polyLineOptions = null;

                 // traversing through routes
                 for (int i = 0; i < routes.size(); i++) {
                     points = new ArrayList<LatLng>();
                     polyLineOptions = new PolylineOptions();
                     List<HashMap<String, String>> path = routes.get(i);

                     for (int j = 0; j < path.size(); j++) {
                         HashMap<String, String> point = path.get(j);

                         double lat = Double.parseDouble(point.get("lat"));
                         double lng = Double.parseDouble(point.get("lng"));
                         LatLng position = new LatLng(lat, lng);

                         points.add(position);
                     }

                     polyLineOptions.addAll(points);
                    polyLineOptions.width(2);
                    polyLineOptions.color(Color.BLUE);
                 }

                 googleMap.addPolyline(polyLineOptions);
             }}}

I've ensured that GeoPoints are coming from Parse Server. Any Help will be appreciated. Thanks

解决方案

It looks like polyLineOptions never gets instantiated.

This can happen if routes.size() is 0

Your problem seems to be related to the data passed to the onPostExecute method, so check to see if it's valid and if it was parsed correctly

In any case you should add a check to see if polyLineOptions is null before using it, such as

if (polyLineOptions != null)
{
     googleMap.addPolyline(polyLineOptions);
}

This will make sure you app doesn't crash if there was an error in receiving or parsing the data.

这篇关于Android Google Map V3 PolyLine无法绘制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆