androidgoogle-mapsgeolocationgoogle-maps-markersitemizedoverlay

Unable to create OverlayItem on the geoPoint its Keep crushing the application


In my app I am asking user to enter a place in autocomplete textbox I am able to get the location successfully from JSON Object and I successfully extracted the longitude and latitude and created a GeoPoint for these locations. I am having problem in creating a overlayitem for the desire GeoPoint.

Following is my code for ItemziedOverlayclass in SiteOverlay constructor i am taking the new location overlay for drawing and calling populate() but no sucess its keep saying Null point ItemizedOverlay.

private class SitesOverlay extends ItemizedOverlay<OverlayItem> {

    private Drawable marker = null;
    private OverlayItem inDrag = null;
    private ImageView dragImage = null;
    private int xDragImageOffset = 0;
    private int yDragImageOffset = 0;
    private int xDragTouchOffset = 0;
    private int yDragTouchOffset = 0;

    public SitesOverlay(Drawable marker) {
        super(marker);
        this.marker = marker;

        dragImage = (ImageView) findViewById(R.id.drag);
        xDragImageOffset = dragImage.getDrawable().getIntrinsicWidth() / 2;
        yDragImageOffset = dragImage.getDrawable().getIntrinsicHeight();

        // items.add(new OverlayItem(getPoint(24.893379, 67.028061),
        // "Karachi", "Sindh, Pakistan"));

    }

    public SitesOverlay(Drawable marker, OverlayItem newlocationItem) {
        super(marker);
        this.marker = marker;

        dragImage = (ImageView) findViewById(R.id.drag);
        xDragImageOffset = dragImage.getDrawable().getIntrinsicWidth() / 2;
        yDragImageOffset = dragImage.getDrawable().getIntrinsicHeight();

        // items.add(new OverlayItem(getPoint(24.893379, 67.028061),
        // "Karachi", "Sindh, Pakistan"));

        items.add(newlocationItem);
        populate();

    }

    @Override
    protected boolean onTap(int index) {
        // TODO Auto-generated method stub

        OverlayItem item = items.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(
                getApplicationContext());
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();

        return super.onTap(index);
    }

    @Override
    protected OverlayItem createItem(int i) {
        return (items.get(i));
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        super.draw(canvas, mapView, shadow);

        boundCenterBottom(marker);
    }

    @Override
    public int size() {
        return (items.size());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) {
        final int action = event.getAction();
        final int x = (int) event.getX();
        final int y = (int) event.getY();
        boolean result = false;

        if (action == MotionEvent.ACTION_DOWN) {
            for (OverlayItem item : items) {
                Point p = new Point(0, 0);

                map.getProjection().toPixels(item.getPoint(), p);

                if (hitTest(item, marker, x - p.x, y - p.y)) {
                    result = true;
                    inDrag = item;
                    items.remove(inDrag);
                    populate();

                    xDragTouchOffset = 0;
                    yDragTouchOffset = 0;

                    setDragImagePosition(p.x, p.y);
                    dragImage.setVisibility(View.VISIBLE);

                    xDragTouchOffset = x - p.x;
                    yDragTouchOffset = y - p.y;

                    break;
                }
            }
        } else if (action == MotionEvent.ACTION_MOVE && inDrag != null) {
            setDragImagePosition(x, y);
            result = true;
        } else if (action == MotionEvent.ACTION_UP && inDrag != null) {
            dragImage.setVisibility(View.GONE);

            GeoPoint pt = map.getProjection().fromPixels(
                    x - xDragTouchOffset, y - yDragTouchOffset);
            OverlayItem toDrop = new OverlayItem(pt, inDrag.getTitle(),
                    inDrag.getSnippet());
            Toast.makeText(
                    MainActivity.this,
                    "Latitude " + pt.getLatitudeE6() + "," + " "
                            + "Longitude " + pt.getLongitudeE6(),
                    Toast.LENGTH_SHORT).show();
            items.add(toDrop);
            populate();

            inDrag = null;
            result = true;

            /*
             * //--- Get the name of the location by Longitude and
             * latitude--- Geocoder geoCoder = new
             * Geocoder(getBaseContext(), Locale.getDefault()); try {
             * List<Address> addresses = geoCoder.getFromLocation(
             * pt.getLatitudeE6() / 1E6, pt.getLongitudeE6() / 1E6, 1);
             * String add = ""; if (addresses.size() > 0) { for (int i=0;
             * i<addresses.get(0).getMaxAddressLineIndex(); i++) add +=
             * addresses.get(0).getAddressLine(i) + "\n"; }
             * Toast.makeText(getBaseContext(), add,
             * Toast.LENGTH_SHORT).show();
             * 
             * } catch (IOException e) { e.printStackTrace(); }
             */

        }

        return (result || super.onTouchEvent(event, mapView));
    }

    private void setDragImagePosition(int x, int y) {
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) dragImage
                .getLayoutParams();

        lp.setMargins(x - xDragImageOffset - xDragTouchOffset, y
                - yDragImageOffset - yDragTouchOffset, 0, 0);
        dragImage.setLayoutParams(lp);
    }

}

class GetPlaces extends AsyncTask<String, Void, ArrayList<String>> {

    @Override
    // three dots is java for an array of strings
    protected ArrayList<String> doInBackground(String... args) {

        Log.d("gottaGo", "doInBackground");

        ArrayList<String> predictionsArr = new ArrayList<String>();

        try {

            URL googlePlaces = new URL(
                    // URLEncoder.encode(url,"UTF-8");
                    "https://maps.googleapis.com/maps/api/place/autocomplete/json?input="
                            + URLEncoder.encode(args[0].toString(), "UTF-8")
                            + "&types=geocode&language=en&sensor=true&key=AIzaSyBBILczt124ZWZHlSYsB6hb_Fqjb2nFEaE");
            URLConnection tc = googlePlaces.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    tc.getInputStream()));

            String line;
            StringBuffer sb = new StringBuffer();
            // take Google's legible JSON and turn it into one big string.
            while ((line = in.readLine()) != null) {
                sb.append(line);
            }
            // turn that string into a JSON object
            JSONObject predictions = new JSONObject(sb.toString());
            // now get the JSON array that's inside that object
            JSONArray ja = new JSONArray(
                    predictions.getString("predictions"));

            for (int i = 0; i < ja.length(); i++) {
                JSONObject jo = (JSONObject) ja.get(i);
                // add each entry to our array
                predictionsArr.add(jo.getString("description"));
            }
        } catch (IOException e) {

            Log.e("YourApp", "GetPlaces : doInBackground", e);

        } catch (JSONException e) {

            Log.e("YourApp", "GetPlaces : doInBackground", e);

        }

        return predictionsArr;

    }

    // then our post

    @Override
    protected void onPostExecute(ArrayList<String> result) {

        Log.d("YourApp", "onPostExecute : " + result.size());
        // update the adapter
        adapter = new ArrayAdapter<String>(getBaseContext(),
                R.layout.item_list);
        adapter.setNotifyOnChange(true);
        // attach the adapter to textview
        textView.setAdapter(adapter);

        for (String string : result) {

            Log.d("YourApp", "onPostExecute : result = " + string);
            adapter.add(string);
            adapter.notifyDataSetChanged();

        }

        Log.d("YourApp",
                "onPostExecute : autoCompleteAdapter" + adapter.getCount());

    }

}

My ActivityCode

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.net.URLConnection;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    import android.app.AlertDialog;
    import android.graphics.Canvas;
    import android.graphics.Point;
    import android.graphics.drawable.Drawable;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.MotionEvent; 
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.AutoCompleteTextView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;
   import android.widget.Toast;
   import com.google.android.maps.GeoPoint;
   import com.google.android.maps.ItemizedOverlay;
   import com.google.android.maps.MapActivity;
   import com.google.android.maps.MapController;
   import com.google.android.maps.MapView;
   import com.google.android.maps.MyLocationOverlay;
   import com.google.android.maps.OverlayItem;

   public class MainActivity extends MapActivity {
private MapView map = null;
private MyLocationOverlay me = null;
Button btn_Go;
Drawable marker;
EditText txtSearch;

AutoCompleteTextView textView;

private static final String API_KEY = "0f7ZWSUbQaZNR9_csQVFdRHpjnARCHAR1WbkFAQ";
ArrayAdapter<String> adapter;

private List<OverlayItem> items = new ArrayList<OverlayItem>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    map = (MapView) findViewById(R.id.map);
    btn_Go = (Button) findViewById(R.id.BtnSearch);

    // txtSearch = (EditText) findViewById(R.id.txt_searchbox);
    // Set the default Location of push pin
    map.getController().setCenter(getPoint(24.893379, 67.028061));
    map.setBuiltInZoomControls(true);

    marker = getResources().getDrawable(R.drawable.pushpin);

    marker.setBounds(0, 0, marker.getIntrinsicWidth(),
            marker.getIntrinsicHeight());

    map.getOverlays().add(new SitesOverlay(marker));

    me = new MyLocationOverlay(this, map);

    map.getOverlays().add(me);

    adapter = new ArrayAdapter<String>(this, R.layout.item_list);
    textView = (AutoCompleteTextView) findViewById(R.id.txtSearchBox);
    adapter.setNotifyOnChange(true);
    textView.setAdapter(adapter);
    textView.addTextChangedListener(new TextWatcher() {

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            if (count % 3 == 1) {
                adapter.clear();
                GetPlaces task = new GetPlaces();
                // now pass the argument in the textview to the task
                task.execute(textView.getText().toString());
            }
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        public void afterTextChanged(Editable s) {

        }

    });

}

public void GoTolocation(View v) {

    String value = textView.getText().toString();
    // Do something with value!
    Log.d("value", value);
    MapController mc = map.getController();
    JSONObject Response = getLocationInfo(value);
    GeoPoint p = getGeoPoint(Response);
    // map.getOverlays().remove(0);
    // map.getController().setCenter(getPoint(24.893379, 67.028061));
    map.getController().setCenter(p);
    map.setBuiltInZoomControls(true);
    marker = getResources().getDrawable(R.drawable.pushpin);
    marker.setBounds(0, 0, marker.getIntrinsicWidth(),
            marker.getIntrinsicHeight());
    OverlayItem newlocation = new OverlayItem(p, value,
            "You Selected This place");
    SitesOverlay s = new SitesOverlay(marker, newlocation);
    // s.SetPoint(newlocation);
    map.getOverlays().add(s);
    me = new MyLocationOverlay(this, map);
    map.getOverlays().add(me);
    mc.setZoom(10);
    mc.animateTo(p);
    map.invalidate();

}

public static JSONObject getLocationInfo(String address) {
    StringBuilder stringBuilder = new StringBuilder();
    try {

        address = address.replaceAll(" ", "%20");

        HttpPost httppost = new HttpPost(
                "http://maps.google.com/maps/api/geocode/json?address="
                        + address + "&sensor=false");
        HttpClient client = new DefaultHttpClient();
        HttpResponse response;
        stringBuilder = new StringBuilder();

        response = client.execute(httppost);
        HttpEntity entity = response.getEntity();
        InputStream stream = entity.getContent();
        int b;
        while ((b = stream.read()) != -1) {
            stringBuilder.append((char) b);
        }
    } catch (ClientProtocolException e) {
    } catch (IOException e) {
    }

    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject = new JSONObject(stringBuilder.toString());
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return jsonObject;
}

public static GeoPoint getGeoPoint(JSONObject jsonObject) {

    Double lon = new Double(0);
    Double lat = new Double(0);

    try {

        lon = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lng");

        lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lat");

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

    return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.location:
        Toast.makeText(this, "You pressed the location!", Toast.LENGTH_LONG)
                .show();
        return true;

    case R.id.street:
        Toast.makeText(this, "You pressed the street!", Toast.LENGTH_LONG)
                .show();
        if (map.isSatellite() == true) {
            map.setSatellite(false);
        }
        return true;

    case R.id.satallite:
        Toast.makeText(this, "You pressed the satallite!",
                Toast.LENGTH_LONG).show();
        if (map.isSatellite() == false) {
            map.setSatellite(true);
        }

        return true;

    default:
        return super.onOptionsItemSelected(item);
    }

}

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

    me.enableCompass();
}

@Override
public void onPause() {
    super.onPause();

    me.disableCompass();
}

@Override
protected boolean isRouteDisplayed() {
    return (false);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_S) {
        map.setSatellite(!map.isSatellite());
        return (true);
    } else if (keyCode == KeyEvent.KEYCODE_Z) {
        map.displayZoomControls(true);
        return (true);
    }

    return (super.onKeyDown(keyCode, event));
}

private GeoPoint getPoint(double lat, double lon) {
    return (new GeoPoint((int) (lat * 1000000.0), (int) (lon * 1000000.0)));
}

this is my main xml code

      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" 
android:layout_height="wrap_content">

<com.google.android.maps.MapView
    android:id="@+id/map"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:apiKey="0f7ZWSUbQaZNR9_csQVFdRHpjnARCHAR1WbkFAQ"
    android:clickable="true" />

<ImageView android:id="@+id/drag" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:src="@drawable/pushpin"
    android:visibility="gone" 
    android:contentDescription="@string/todo"/>

<Button
    android:id="@+id/BtnSearch"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:onClick="GoTolocation"
    android:text="Go" />

<AutoCompleteTextView
    android:id="@+id/txtSearchBox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_toLeftOf="@+id/BtnSearch"
    android:ems="10"
    android:hint="Search Here" >

    <requestFocus />
</AutoCompleteTextView>

    </RelativeLayout>

This is my mainfest File

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mapview_dragdrop_marker"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <uses-library android:name="com.google.android.maps" />

    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Below is the logcat which is showing me error .

   12-23 16:02:03.647: E/AndroidRuntime(788): FATAL EXCEPTION: main
   12-23 16:02:03.647: E/AndroidRuntime(788): java.lang.NullPointerException
   12-23 16:02:03.647: E/AndroidRuntime(788):   at   com.google.android.maps.ItemizedOverlay.getIndexToDraw(ItemizedOverlay.java:211)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at com.google.android.maps.ItemizedOverlay.draw(ItemizedOverlay.java:240)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at com.example.mapview_dragdrop_marker.MainActivity$SitesOverlay.draw(MainActivity.java:393)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at com.google.android.maps.Overlay.draw(Overlay.java:179) 
   12-23 16:02:03.647: E/AndroidRuntime(788):   at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:42)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at com.google.android.maps.MapView.onDraw(MapView.java:530)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.View.draw(View.java:6880)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.View.draw(View.java:6883)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.widget.FrameLayout.draw(FrameLayout.java:357)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.View.draw(View.java:6883)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.widget.FrameLayout.draw(FrameLayout.java:357)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewRoot.draw(ViewRoot.java:1522)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.os.Handler.dispatchMessage(Handler.java:99)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.os.Looper.loop(Looper.java:130)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at android.app.ActivityThread.main(ActivityThread.java:3683)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at java.lang.reflect.Method.invokeNative(Native Method)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at java.lang.reflect.Method.invoke(Method.java:507)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at                    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
   12-23 16:02:03.647: E/AndroidRuntime(788):   at dalvik.system.NativeStart.main(Native Method)

I dont know what i am foing wrong i even populate the list to generate the overlays but still its gives me error

I am using googleapi 10


Solution

  • Your code seems valid (didn't find any problem).

    Try to use other pretty good version of google.maps implementation:

    MyMapViewActivity

    public class MyMapViewActivity extends MapActivity {
    public static final int MENU_MY_LOCATION = 0;
    public static final int MENU_SEARCH = MENU_MY_LOCATION+1;
    public static final int MENU_SUBMIT = MENU_MY_LOCATION+2;
    
    MapView myMapView = null;
    MapController mc = null;
    OverlayItem myMarker;
    MyItemizedOverlay mItemizedoverlay;
    int mInputId;
    
    MyLocationOverlay myLoc = null;
    
    GeoPoint mCurrentPoint;
    
    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
    
        myMapView = (MapView) findViewById(R.id.mapView);
    
        myMapView.setBuiltInZoomControls(true);
        myMapView.setStreetView(true);
    
        mc = myMapView.getController();
        mc.setZoom(17);
        myLoc = new CustomMyLocationOverlay(this, myMapView);
        myLoc.runOnFirstFix(new Runnable() {
            public void run() {
                if (mCurrentPoint.equals(new GeoPoint(0,0))){
                    mc.animateTo(myLoc.getMyLocation());
                    mCurrentPoint = myLoc.getMyLocation();
                } 
                // new
                // SearchClicked(mapSearchBox.getText().toString()).execute();
    
            }
        });
    
        myMapView.getOverlays().add(myLoc);
        myMapView.postInvalidate();
    
        zoomToMyLocation();
    
        Drawable drawable = this.getResources().getDrawable(R.drawable.target);
        mItemizedoverlay = new MyItemizedOverlay(drawable, this);
    
        Intent i = getIntent();
        Bundle extras = i.getExtras();
        mInputId = extras.getInt("input_id");
        String defaultLocation = extras.getString("default_location");
        defaultLocation = defaultLocation.replace("[", "").replace("]", "");
        String[] defLocSp = defaultLocation.split(",");
    
        double lat = Double.parseDouble(defLocSp[0]);
        double lon = Double.parseDouble(defLocSp[1]);
    
        mCurrentPoint = new GeoPoint((int)lat,(int)lon);
    
        if (!mCurrentPoint.equals(new GeoPoint(0,0))){
            mc.animateTo(mCurrentPoint);
            setMarker();
        } 
    }
    
    @Override
    protected void onResume() {
        super.onResume();
    
        myLoc.enableCompass();
        myLoc.enableMyLocation();
    
    }
    
    @Override
    protected void onPause() {
        super.onPause();
    
        myLoc.disableCompass();
        myLoc.disableMyLocation();
    }
    
    public void zoomToMyLocation() {
        mCurrentPoint = myLoc.getMyLocation();
        if (mCurrentPoint != null) {
            myMapView.getController().animateTo(mCurrentPoint);
            // myMapView.getController().setZoom(10);
        }
    }
    
    private class SearchClicked extends AsyncTask<Void, Void, Boolean> {
        private String toSearch;
        private Address address;
    
        public SearchClicked(String toSearch) {
            this.toSearch = toSearch;
        }
    
        @Override
        protected Boolean doInBackground(Void... voids) {
    
            try {
                Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.UK);
                List<Address> results = geocoder.getFromLocationName(toSearch, 1);
    
                if (results.size() == 0) {
                    return false;
                }
    
                address = results.get(0);
    
                  // Now do something with this GeoPoint:
                mCurrentPoint = new GeoPoint((int) (address.getLatitude() * 1E6), (int) (address.getLongitude() * 1E6));
                //Log.e("", "geocoded: "+mCurrentPoint.toString());
                myMapView.getController().animateTo(mCurrentPoint);
    
                myMarker = new OverlayItem(mCurrentPoint, "Submit", toSearch);
                mItemizedoverlay.addOverlay(myMarker);
                myMapView.getOverlays().add(mItemizedoverlay);
    
            } catch (Exception e) {
                Log.e("", "Something went wrong: ", e);
                return false;
            }
            return true;
        }
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
    
        MenuItem mi;
        mi = menu.add(0, MENU_MY_LOCATION, 0, "My Location");
        mi.setIcon(android.R.drawable.ic_menu_mylocation);
    
        mi = menu.add(0, MENU_SEARCH, 0, "Search");
        mi.setIcon(android.R.drawable.ic_menu_search);
    
        mi = menu.add(0, MENU_SUBMIT, 0, "Submit");
        mi.setIcon(android.R.drawable.ic_menu_add);
    
    
    
        return true;
    }
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        menu.clear();
    
        MenuItem mi;
        mi = menu.add(0, MENU_MY_LOCATION, 0, "My Location");
        mi.setIcon(android.R.drawable.ic_menu_mylocation);
    
        mi = menu.add(0, MENU_SEARCH, 0, "Search");
        mi.setIcon(android.R.drawable.ic_menu_search);
    
        mi = menu.add(0, MENU_SUBMIT, 0, "Submit");
        mi.setIcon(android.R.drawable.ic_menu_add);
    
    
        return super.onPrepareOptionsMenu(menu);
    }
    
    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
        case MENU_MY_LOCATION:  
            zoomToMyLocation();
            return true;
    
        case MENU_SEARCH:   
            searchLocation();
            return true;
    
        case MENU_SUBMIT:
            submitLocation();
    
            return true;
    
    
    
        default:
            return false;
        }
    }
    
    public void searchLocation(){
        final EditText input = new EditText(this);
    
        AlertDialog.Builder userInputDialogBuilder = new AlertDialog.Builder(this);
        userInputDialogBuilder.setTitle("Search Location")
        .setMessage("Enter Location:")
        .setView(input)
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
    
    
                if (!input.getText().toString().equals("")){
                    new SearchClicked(input.getText().toString()).execute();            
                }
    
            }
        }).setOnCancelListener(new Dialog.OnCancelListener() {
            public void onCancel(DialogInterface dialog) {
                //mUserInputDialog = null;
            }
        }).show();
    }
    
    public void submitLocation(){
        if (null != mCurrentPoint){
            Log.e("submit","Current point: "+mCurrentPoint.toString());
    
            Intent data = new Intent();
            Bundle extras = new Bundle();
            extras.putDouble("lat", mCurrentPoint.getLatitudeE6());
            extras.putDouble("lon", mCurrentPoint.getLongitudeE6());
            extras.putInt("input_id", mInputId);
            data.putExtras(extras);
            setResult(RESULT_OK,data);//Here I am Setting the Requestcode 1, you can put according to your requirement
            finish();
        }
    }
    
    public void setCurrentLocation(GeoPoint point){
        mCurrentPoint = point;
    
    }
    
    public void setMarker(){
        myMarker = new OverlayItem(mCurrentPoint, "Submit", "");
        mItemizedoverlay.clearOverlay();
        mItemizedoverlay.addOverlay(myMarker);
        myMapView.getOverlays().add(mItemizedoverlay);
    }
    }
    

    MyItemizedOverlay

     public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    Context mContext;
    
    public MyItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
    }
    
    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }
    
    public void clearOverlay(){
        mOverlays.clear();
    }
    
    @Override
    protected OverlayItem createItem(int i) {
      return mOverlays.get(i);
    }
    
    @Override
    public int size() {
      return mOverlays.size();
    }
    
    public MyItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
    }
    
    @Override
    protected boolean onTap(int index) {
      final OverlayItem item = mOverlays.get(index);
    
    
    AlertDialog.Builder userInputDialogBuilder = new AlertDialog.Builder(mContext);
        userInputDialogBuilder.setTitle(item.getTitle())
        .setMessage(item.getSnippet())
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
    
                ((CobytMapViewActivity)mContext).setCurrentLocation(item.getPoint());
                ((CobytMapViewActivity)mContext).submitLocation();
    
            }
        }).setOnCancelListener(new Dialog.OnCancelListener() {
            public void onCancel(DialogInterface dialog) {
                //mUserInputDialog = null;
            }
        }).show();
      return true;
    }
    }