Question

enter image description herei am working on a project where i have to add marker for my current location and have to add multiple markers according to my json response.

Everything is working fine but after adding setInfoAdapter to map object ,marker that showing my current location leads to app crash when i tap on that marker.

Where i am going wrong? please suggest me.

This is my activity.

public class MapActivity extends Activity implements LocationListener {

    private ProgressDialog pDialog;
    private GoogleMap gMap;
    private LocationManager locationManager;
    private String provider;
    boolean gps_enabled = false;
    boolean netwrk_enabled = false;
    String phone = null;
    JSONArray json;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        gMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
                .getMap();
        gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(
                23.40276491, 77.51953125), 5));

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        gps_enabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        netwrk_enabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (gps_enabled)
            provider = LocationManager.GPS_PROVIDER;
        else
            provider = LocationManager.NETWORK_PROVIDER;
        locationManager.requestLocationUpdates(provider, 5000L, 10F, this);

        Location location = locationManager.getLastKnownLocation(provider);


//Moving and adding marker to my current location here

        CameraPosition cp = new CameraPosition(new LatLng(
                location.getLatitude(), location.getLongitude()), 13, 0, 0);
        gMap.animateCamera(CameraUpdateFactory.newCameraPosition(cp), 3000,
                null);

        gMap = ((MapFragment) getFragmentManager().findFragmentById(
                R.id.map)).getMap();

        Marker marker = gMap.addMarker(new MarkerOptions()
                .position(
                        new LatLng(location.getLatitude(), location
                                .getLongitude())).title("I am here").icon(BitmapDescriptorFactory.fromResource(R.drawable.mrk1)));
        marker.showInfoWindow();


        if (location != null) {

            if (provider == LocationManager.GPS_PROVIDER)
                Toast.makeText(getApplicationContext(), "location by gps",
                        Toast.LENGTH_SHORT).show();
            else if (provider == LocationManager.NETWORK_PROVIDER)
                Toast.makeText(getApplicationContext(), "location by network",
                        Toast.LENGTH_SHORT).show();

            new HttpGetTask().execute();
        }

    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub18d1:d002
        super.onPause();
        locationManager.removeUpdates(this);
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        locationManager.requestLocationUpdates(provider, 400, 1, this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.map, menu);
        return true;
    }

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "Disabled provider " + provider,
                Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

        Toast.makeText(this, "Enabled new provider " + provider,
                Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    private class HttpGetTask extends AsyncTask<Void, Void, String> {

//http request
        }

        @Override
        protected void onPostExecute(String result) {

            if (pDialog.isShowing())
                pDialog.dismiss();
            try {
                 json = new JSONArray(result);

                for (int i = 0; i < json.length(); i++) {
                    Log.v("Response", result);
                    final JSONObject e = json.getJSONObject(i);
                    String point = e.getString("point");
                    Log.v("POINT", point);
                    phone = e.getString("ph");
                    Log.v("PH", phone);

                    String[] point2 = point.split(",");
                    double lat1 = Double.parseDouble(point2[0]);
                    double lng1 = Double.parseDouble(point2[1]);
                    Log.v("LLDN", "" + lat1 + "&" + lng1);

//Adding multiple markers to my map

                    gMap.addMarker(new MarkerOptions()
                            .title(e.getString("name"))
                            .snippet(
                                    e.getString("LS")+"-"+e.getString("ph") )
                            .position(new LatLng(lng1, lat1))
                            .icon(BitmapDescriptorFactory
                                    .fromResource(R.drawable.pmr)));

                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

//Adding infoWindowAdapter to my markers.

            gMap.setInfoWindowAdapter(new InfoWindowAdapter() {

                @Override
                public View getInfoWindow(Marker arg0) {
                    // TODO Auto-generated method stub
                    return null;
                }

                @Override
                public View getInfoContents(Marker mrkr) {
                    // TODO Auto-generated method stub
                    String name = mrkr.getTitle();
                    String detail = mrkr.getSnippet();
                    String trimmedDetail = detail.substring(0, 60);

                    Log.v("Info", name + " " + detail);
                    View v = getLayoutInflater().inflate(R.layout.infowindow,
                            null);
                    TextView title = (TextView) v.findViewById(R.id.titleTV);
                    TextView snippet = (TextView) v
                            .findViewById(R.id.snippetTV);

                    title.setText("" + name);
                    snippet.setText("" + trimmedDetail);

                    return v;
                }
            });

            gMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

                @Override
                public void onInfoWindowClick(Marker arg0) {
                    Intent myIntent = new Intent(getBaseContext(),
                            DtActivity.class);
                    myIntent.putExtra("title", arg0.getTitle());
                    myIntent.putExtra("detail", arg0.getSnippet());
                    //myIntent.putExtra("ph1", phone);

                    startActivity(myIntent);

                }
            });

            if (null != mClient)
                mClient.close();

        }
    }

It is leading to NullPointerException because i didn't passing snippet in that marker.

I don't want any infoWindow for that marker. How to achieve this.?

I tried with creating one more GoogleMap object and added marker that shows my current location to that object, but same result.

I tried to disable MouseClickEvent of that marker. it is disabling all markers click event.`

Can i add that marker using overlay.?

Was it helpful?

Solution

I wrote single method for adding marker on Google map by which I can find marker id. Have a look below:

String markerID = null;
private void addMarker(GoogleMap map, double lat, double lon, String title, String snippet, int resourceId)
    {
        markerID = map.addMarker(new MarkerOptions().position(new LatLng(lat, lon)).title(title).snippet(snippet).icon(BitmapDescriptorFactory.fromResource(resourceId))).getId();
    }

And use that marker id for matching in OnClickListener of marker:

@Override
 public View getInfoWindow(final Marker marker)
 {
      if(!marker.getId().equals(markerID))
           //do your code
      else
           //do your code
  }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top