I'm trying to make an app that will display an offline map with some clickable points on it.
My problem is that the map tiles won't show when i test my app. Plus the clickable points (markers) disappear as soon as i move the map.
Any help or ideas on the problem will be very helpful.
Here is my code:
MainActivity.java:
package com.cvasil05.offlinemapwithoverlay;
import java.util.ArrayList;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.MyLocationOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
// Default map zoom level:
private int MAP_DEFAULT_ZOOM = 17;
// Default map Latitude:
private double MAP_DEFAULT_LATITUDE = 35.14476619358656E6;
// Default map Longitude:
private double MAP_DEFAULT_LONGITUDE = 33.409520387649536E6;
private MapView mymapView = null;
private MapController myMapController = null;
private MyLocationOverlay location = null;
LocationManager mylocmanager = null;
LocationListener myloclistener = null;
ArrayList<OverlayItem> OverlayItemArray = null;
MyOverlayItem overlay = null;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize Map with its properties
mymapView = (MapView)findViewById(R.id.mapview);
mymapView.setBuiltInZoomControls(false);
mymapView.setMultiTouchControls(false);
mymapView.setTileSource(TileSourceFactory.MAPQUESTOSM);
// Initialize Map Controller
myMapController = mymapView.getController();
mylocmanager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
myloclistener = new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onLocationChanged(Location location) {
myMapController.animateTo(new GeoPoint(location.getLatitude(), location.getLongitude()));
myMapController.setZoom(17);
mymapView.invalidate();
}
public void run() {
// TODO Auto-generated method stub
location.runOnFirstFix(new Runnable() {
public void run() {
mymapView.getController().animateTo(location.getMyLocation());
}
});
}
};
mylocmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,myloclistener);
OverlayItemArray = new ArrayList<OverlayItem>();
// Points to be added
GeoPoint point1 = new GeoPoint(35.14392398396914E6, 33.40521812438965E6);
OverlayItem overlayitem1 = (OverlayItem) new OverlayItem("Εστίες", "Οι εστίες του Πανεπιστημίου Κύπρου.", point1);
OverlayItemArray.add(overlayitem1);
GeoPoint point2 = new GeoPoint(35.14447668501356E6, 33.41047525405884E6);
OverlayItem overlayitem2 = new OverlayItem("ΘΕΕ02", "Κτίριο Χημείας & Φυσικής.", point2);
OverlayItemArray.add(overlayitem2);
GeoPoint point3 = new GeoPoint(35.14461705293515E6, 33.41110825538635E6);
OverlayItem overlayitem3 = new OverlayItem("ΘΕΕ01", "Κτίριο Πληροφορικής & Μαθηματικών.", point3);
OverlayItemArray.add(overlayitem3);
GeoPoint point4 = new GeoPoint(35.14512588462148E6, 33.41071128845215E6);
OverlayItem overlayitem4 = new OverlayItem("ΧΩΔ01", "Χώροι Διδασκαλίας", point4);
OverlayItemArray.add(overlayitem4);
GeoPoint point5 = new GeoPoint(35.1459856274836E6, 33.41367244720459E6);
OverlayItem overlayitem5 = new OverlayItem("Κέντρο αθλητισμού", "Αποτελείται από το Γυμναστήριο, το Γήπεδο Τέννις και το Γύπεδο Φούτσαλ.", point5);
OverlayItemArray.add(overlayitem5);
// Add Points to Overlay
overlay = new MyOverlayItem(this, OverlayItemArray);
mymapView.getOverlays().add(overlay);
/*
// Get Location
location = new MyLocationOverlay(getApplicationContext(), mymapView);
// View Location
mymapView.getOverlays().add(location);
location.enableMyLocation();
location.disableFollowLocation();
*/
// Zoom and Center Map
myMapController.setZoom(MAP_DEFAULT_ZOOM);
myMapController.setCenter(new GeoPoint(MAP_DEFAULT_LATITUDE, MAP_DEFAULT_LONGITUDE));
}
// Create Menu
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
// Actions on Menu Options
#Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.esties){
myMapController.setZoom(MAP_DEFAULT_ZOOM);
myMapController.setCenter(new GeoPoint(MAP_DEFAULT_LATITUDE, MAP_DEFAULT_LONGITUDE));
}
return super.onOptionsItemSelected(item);
}
}
MyOverlayItem.java:
package com.cvasil05.offlinemapwithoverlay;
import java.util.List;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import android.app.AlertDialog;
import android.content.Context;
public class MyOverlayItem extends ItemizedIconOverlay<OverlayItem> {
private Context mContext;
public MyOverlayItem(final Context context, final List<OverlayItem> aList) {
super(context, aList, new OnItemGestureListener<OverlayItem>() {
public boolean onItemSingleTapUp(final int index,
final OverlayItem item) {
return false;
}
public boolean onItemLongPress(final int index,
final OverlayItem item) {
return false;
}
});
// TODO Auto-generated constructor stub
mContext = context;
}
#Override
protected boolean onSingleTapUpHelper(final int index, final OverlayItem item, final MapView mapView) {
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}
my xml file has this:
<org.osmdroid.views.MapView
android:id="#+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:enabled="true"
android:clickable="true"
/>
and i added this to my manifest file:
<supports-screens
android:anyDensity="true"
android:resizeable="false"
android:largeScreens="true"
android:normalScreens="true" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Im a newbe in osmdroid :) But I had the same Problem.. In my case my EmulatorDevice was configured with no SDCard
Related
I make small static map application, in which i take three pin(marker) and set static longitude and latitude. Actually, i want to display balloon annotation for location information display in mapview. when i touch the marker(pin) then balloon annotation is open and display the information for current location. My code is following:
**Source Code: MainActivity.java
----------------------------------**
package com.example.mapapp;
import java.util.List;
import com.google.android.maps.*;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends MapActivity {
MapController mpc;
//Button hotels,theaters,bank;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* hotels = (Button)findViewById(R.id.btnhotels);
hotels.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(MainActivity.this,Hotels.class);
startActivity(i);
}
});
theaters = (Button)findViewById(R.id.btntheaters);
theaters.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i1 = new Intent(MainActivity.this,Theaters.class);
startActivity(i1);
}
});
bank = (Button)findViewById(R.id.btnbank);
bank.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i2 = new Intent(MainActivity.this,Bank.class);
startActivity(i2);
}
});*/
MapView mp = (MapView)findViewById(R.id.mapview);
mp.setBuiltInZoomControls(true);
mp.setSatellite(true);
mp.setTraffic(true);
mp.setStreetView(true);
mpc = mp.getController();
//for RL WebSolutions
double rl_lat = Double.parseDouble("23.0355018");
double rl_lon = Double.parseDouble("72.5630625");
GeoPoint point = new GeoPoint((int)(rl_lat*1E6), (int)(rl_lon*1E6));
mpc.animateTo(point);
mpc.setZoom(15);
mp.invalidate();
List<Overlay> mapoverlays = mp.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.redpin);
AddItemizedOverlay itemizedOverlay = new AddItemizedOverlay(drawable,this);
OverlayItem overlayitem = new OverlayItem(point, "Rl Websolution", "Here is RL Websolutions");
itemizedOverlay.addOverlay(overlayitem);
mapoverlays.add(itemizedOverlay);
//for State Bank of India
double stb_lat = Double.parseDouble("23.066519");
double stb_lon = Double.parseDouble("72.56956000000002");
GeoPoint point1 = new GeoPoint((int)(stb_lat*1E6), (int)(stb_lon*1E6));
mpc.animateTo(point1);
mpc.setZoom(15);
mp.invalidate();
List<Overlay> mpoverlays = mp.getOverlays();
Drawable d = this.getResources().getDrawable(R.drawable.poin1);
AddItemizedOverlay itemizeOverlay = new AddItemizedOverlay(d,this);
OverlayItem over = new OverlayItem(point1, "State Bank Of India", "Here is State Bank");
itemizeOverlay.addOverlay(over);
mpoverlays.add(itemizeOverlay);
//for Navrangpura Bus Stop
double bus_lat = Double.parseDouble("23.035626");
double bus_lon = Double.parseDouble("72.5641536");
GeoPoint point2 = new GeoPoint((int)(bus_lat*1E6), (int)(bus_lon*1E6));
mpc.animateTo(point2);
mpc.setZoom(15);
mp.invalidate();
List<Overlay> mboverlays = mp.getOverlays();
Drawable d1 = this.getResources().getDrawable(R.drawable.bus);
AddItemizedOverlay itemizOverlay = new AddItemizedOverlay(d1,this);
OverlayItem over1 = new OverlayItem(point2, "Navrangpura Bus Stop", "Here is Bus Stop");
itemizOverlay.addOverlay(over1);
mboverlays.add(itemizOverlay);
}
protected boolean isRouteDisplayed() {
return true;
}
}
****Here AddItemizedOverlay.java**
-----------------------------------**
package com.example.mapapp;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.Log;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
public class AddItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();
private Context context;
public AddItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
// TODO Auto-generated constructor stub
}
public AddItemizedOverlay(Drawable defaultMarker, Context context) {
this(defaultMarker);
this.context = context;
}
#Override
protected OverlayItem createItem(int i) {
// TODO Auto-generated method stub
return mapOverlays.get(i);
}
#Override
public int size() {
// TODO Auto-generated method stub
return mapOverlays.size();
}
#Override
protected boolean onTap(int index) {
OverlayItem item = mapOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
public void addOverlay(OverlayItem overlay) {
mapOverlays.add(overlay);
this.populate();
}
}
I think this is the perfect example you are looking for:
http://wptrafficanalyzer.in/blog/adding-marker-on-touched-location-of-google-maps-using-android-api-v2-with-supportmapfragment/
In Google Maps, I'm dropping a pin on user's current location but now I want to give another functionality to user that he can drag that pin manually and drop anywhere on the map, also by the time he drops the pin manually I can receive a callback which gives me the Longitude and Latitude of that position where user drops that pin.
If you can give me some examples it will be greatly appreciable.
In the last few days I finally found how to implement those functions you described and because there was no answer in this question, I decided to post what I found even though there has been a long time since you asked and you may found another answer by yourself.
So, I used the code of this git. I managed to do all that you want except the callback that I didn't try it in that way. I am getting the position of the pin after pressing a button.
There is no need to post my AndroidManifest because I read that you had no problem with displaying your location, so the permissions needed were fine.
The only thing that was required to do, was to create an activity named MapsActivity.
This is the whole content of it:
import com.google.android.gms.maps.*;
import com.google.android.gms.maps.model.*;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;
import common.logger.Log;
public class MapsActivity extends Activity implements
OnMapReadyCallback, GoogleMap.OnInfoWindowClickListener,
GoogleMap.OnMarkerDragListener {
LatLng position = new LatLng(34.6767, 33.04455);
final Marker marker_final = null;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
MapFragment mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.
map);
mapFragment.getMapAsync(this);
ImageButton returnback = (ImageButton)findViewById(R.id.returnback);
returnback.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Toast.makeText(MapsActivity.this.getApplicationContext(), position.latitude + ":" + position.longitude, Toast.LENGTH_LONG).show();
}
});
}
#Override
public void onMapReady(GoogleMap map) {
map.setMyLocationEnabled(true);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13));
CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
map.animateCamera(zoom);
map.addMarker(new MarkerOptions()
.title("Shop")
.snippet("Is this the right location?")
.position(position))
.setDraggable(true);
// map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(this);
map.setOnMarkerDragListener(this);
}
#Override
public void onInfoWindowClick(Marker marker) {
Toast.makeText(this, marker.getTitle(), Toast.LENGTH_LONG).show();
}
#Override
public void onMarkerDragStart(Marker marker) {
LatLng position0 = marker.getPosition();
Log.d(getClass().getSimpleName(), String.format("Drag from %f:%f",
position0.latitude,
position0.longitude));
}
#Override
public void onMarkerDrag(Marker marker) {
LatLng position0 = marker.getPosition();
Log.d(getClass().getSimpleName(),
String.format("Dragging to %f:%f", position0.latitude,
position0.longitude));
}
#Override
public void onMarkerDragEnd(Marker marker) {
position = marker.getPosition();
Log.d(getClass().getSimpleName(), String.format("Dragged to %f:%f",
position.latitude,
position.longitude));
}
}
This is my activity_maps.xml layout (I've also added an edit text, but there is no need to use it):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:background="#ecf0f1">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="#+id/scrollView3" >
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:weightSum="1"
android:layout_height="wrap_content">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.9"
android:id="#+id/locationsearch" />
<ImageButton
android:layout_width="40dp"
android:layout_height="40dp"
android:id="#+id/search"
android:layout_weight="0.1"
android:background="#drawable/search" />
</LinearLayout>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/map"
android:layout_width="match_parent"
android:layout_height="405dp"
android:name="com.google.android.gms.maps.MapFragment"/>
<ImageButton
android:layout_width="60dp"
android:layout_height="60dp"
android:id="#+id/returnback"
android:background="#drawable/less" />
</LinearLayout>
</ScrollView>
</LinearLayout>
Refer Below links where you can find samples from Commons guy
Sample
SO question
Hi Use the below code.
you will get the dropped pin position.
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
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;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
public class rescue extends MapActivity {
private LocationManager myLocationManager;
private LocationListener myLocationListener;
private MapView myMapView;
private MapController myMapController;
private String provider;
private MyLocationOverlay me=null;
private int defaultLat =(int)(51.51216124955517);
private int defaultLong =(int)(-0.1373291015625);
private GeoPoint defaultGeoPint = new GeoPoint(defaultLat,defaultLong);
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rescue);
setCurrentLocation();
}
#Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
private void setCurrentLocation()
{
myMapView = (MapView)findViewById(R.id.rescueMapView);
myMapView.setTraffic(true);
///myMapView.setBuiltInZoomControls(true);
myMapController = myMapView.getController();
myMapController.setZoom(16); //Fixed Zoom Level
myLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
myLocationListener = new MyLocationListener();
try
{
Criteria criteria = new Criteria();
provider = myLocationManager.getBestProvider(criteria, false);
Location location = myLocationManager.getLastKnownLocation(provider);
myLocationManager.requestLocationUpdates(
provider,
0,
0,
myLocationListener);
Location lastLocation = myLocationManager.getLastKnownLocation(provider);
if(lastLocation != null)
{
int lastLocLat =(int)(lastLocation.getLatitude()*1000000);
int lastLocLong =(int)(lastLocation.getLongitude()*1000000);
//Get the current location in start-up
GeoPoint initGeoPoint = new GeoPoint(lastLocLat,lastLocLong);
CenterLocatio(initGeoPoint);
}
else
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Location Services Disabled")
.setMessage("The location service on the device are disabled, your location is not able to be found, please call AXA uding the button below to be rescued")
.setCancelable(false)
.setPositiveButton("Drop pin", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//do things
CenterLocatio(defaultGeoPint);
}
});
builder.create().show();
}
}
catch (Exception e)
{
// TODO: handle exception
Context context = getApplicationContext();
String toasttext = e.getMessage();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, toasttext, duration);
toast.show();
}
}
private void CenterLocatio(GeoPoint centerGeoPoint)
{
myMapView.getOverlays().clear();
myMapController.animateTo(centerGeoPoint);
Drawable marker=getResources().getDrawable(R.drawable.marker);
marker.setBounds(0, 0, marker.getIntrinsicWidth(),
marker.getIntrinsicHeight());
int lat = centerGeoPoint.getLatitudeE6();
int lon = centerGeoPoint.getLongitudeE6();
double lat1 = centerGeoPoint.getLatitudeE6()/1E6;
double lon1 = centerGeoPoint.getLongitudeE6()/1E6;
ArrayList<Double> passing = new ArrayList<Double>();
passing.add(lat1);
passing.add(lon1);
Context context = getApplicationContext();
ReverseGeocodeLookupTask task = new ReverseGeocodeLookupTask();
task.applicationContext = context;
task.activityContext = rescue.this;
task.execute(passing);
myMapView.getOverlays().add(new SitesOverlay(marker,lat, lon ));
me=new MyLocationOverlay(this, myMapView);
myMapView.getOverlays().add(me);
};
private class MyLocationListener implements LocationListener{
#Override
public void onLocationChanged(Location argLocation) {
// TODO Auto-generated method stub
GeoPoint myGeoPoint = new GeoPoint(
(int)(argLocation.getLatitude()*1000000),
(int)(argLocation.getLongitude()*1000000));
//CenterLocatio(myGeoPoint);
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onStatusChanged(String provider,
int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
private GeoPoint getPoint(int lat, int lon) {
return(new GeoPoint(lat, lon));
/*
return(new GeoPoint((int)(lat*1000000.0),
(int)(lon*1000000.0)));
*/
}
private class SitesOverlay extends ItemizedOverlay<OverlayItem> {
private List<OverlayItem> items=new ArrayList<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, int lat, int longitude) {
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(lat,
longitude),
"UN", "United Nations"));
/*
items.add(new OverlayItem(getPoint(40.76866299974387,
-73.98268461227417),
"Lincoln Center",
"Home of Jazz at Lincoln Center"));
*/
populate();
}
#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);
myMapView.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=myMapView.getProjection().fromPixels(x-xDragTouchOffset,
y-yDragTouchOffset);
String title = inDrag.getTitle();
OverlayItem toDrop=new OverlayItem(pt, title,
inDrag.getSnippet());
items.add(toDrop);
populate();
double lat = pt.getLatitudeE6()/1E6;
double lon = pt.getLongitudeE6()/1E6;
ArrayList<Double> passing = new ArrayList<Double>();
passing.add(lat);
passing.add(lon);
Context context = getApplicationContext();
ReverseGeocodeLookupTask task = new ReverseGeocodeLookupTask();
task.applicationContext = context;
task.activityContext = rescue.this;
task.execute(passing);
//CenterLocatio(pt);
inDrag=null;
result=true;
}
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);
}
}
public class ReverseGeocodeLookupTask extends AsyncTask <ArrayList<Double>, Void, String>
{
private ProgressDialog dialog;
protected Context applicationContext;
protected Context activityContext;
#Override
protected void onPreExecute()
{
this.dialog = ProgressDialog.show(activityContext, "Please wait",
"Requesting location", true);
}
protected String doInBackground(ArrayList<Double>... params)
{
String foundAddress = "";
String localityName = "";
ArrayList<Double> passed = params[0];
double lat = passed.get(0);
double lon = passed.get(1);
try
{
List<Address> addresses = new Geocoder(applicationContext,Locale.getDefault()).getFromLocation(lat,lon, 1);
if (addresses.size() > 0)
{
String addressLine = "";
for(Integer i = 0; i < addresses.get(0).getMaxAddressLineIndex(); i++)
{
if(!addressLine.equals(""))
{
addressLine+= ", ";
}
addressLine+= addresses.get(0).getAddressLine(i);
}
if(addressLine!="")
{
foundAddress+= addressLine;
}
}
}
catch (Exception e) {
// TODO: handle exception
}
finally
{
}
return foundAddress;
}
#Override
protected void onPostExecute(String result)
{
this.dialog.cancel();
showToast(result);
}
}
public void showToast(String message)
{
Context context = getApplicationContext();
String toasttext = message;
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, toasttext, duration);
toast.show();
}
}
Use below permission in manifest file
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:icon="#drawable/ic_launcher"
android:label="#string/app_name" >
<uses-library android:name="com.google.android.maps" />
<activity
android:label="#string/app_name"
android:name=".DragAndDropPinActivity" >
</activity>
<activity
android:label="#string/app_name"
android:name=".rescue" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
I have been using a previous question and a Google Tutorial to attempt to add multiple pin images on a Google Map view when the current location of the user changes.
Each pin when tapped displays the Longitude and Latitude of the pin.
However currently my code only displays one pin and does not add another image when the location of the user changes. I am relatively new to Android and can't see why this code wouldn't work?
Map.java:
import java.util.List;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.OverlayItem;
import android.util.Log;
public class Map extends MapActivity {
private MapView map;
private MapController controller;
private double lon, lat;
private Drawable drawable;
private MapOverlay itemizedoverlay;
private List<Overlay> mapOverlays;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maps);
initMapView();
mapOverlays = map.getOverlays();
drawable = this.getResources().getDrawable(R.drawable.pin);
itemizedoverlay = new MapOverlay(drawable, this);
initMyLocation();
}
private void initMapView() {
map = (MapView) findViewById(R.id.map);
controller = map.getController();
map.setSatellite(true);
map.setBuiltInZoomControls(true);
}
private void initMyLocation() {
final MyLocationOverlay overlay = new MyLocationOverlay(this, map);
overlay.enableMyLocation();
overlay.enableCompass(); // wont work in emulator
overlay.runOnFirstFix(new Runnable() {
public void run() {
// Zoom in to current location - 1 is word view
controller.setZoom(20);
controller.animateTo(overlay.getMyLocation());
lon = overlay.getMyLocation().getLongitudeE6();
lat = overlay.getMyLocation().getLatitudeE6();
setLON(lon);
setLAT(lat);
//-0.959896
//51.742953
Log.w("test-lon", Double.toString(lon/1E6));
Log.w("test-lat", Double.toString(lat/1E6));
GeoPoint point = new GeoPoint((int)(lat),(int)(lon));
mapOverlays.add(itemizedoverlay);
test(point);
}
});
map.getOverlays().add(overlay);
}
public void setLON(double x){ //remove?
lon = x;
}
public void setLAT(double x){ //remove?
lat = x;
}
public void test(GeoPoint px){
OverlayItem overlayitem = new OverlayItem(px,"Test Point" , "Lat: " + Double.toString(lat/1E6) + "\nLon: " + Double.toString(lon/1E6) );
itemizedoverlay.addOverlay(overlayitem);
}
#Override
protected boolean isRouteDisplayed() {
// Required method from MapActivity
return false;
}
}
MapOverlay.java:
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
public class MapOverlay extends ItemizedOverlay {
private ArrayList<OverlayItem> mapOverlay = new ArrayList<OverlayItem>();
private Context mContext;
public MapOverlay (Drawable defaultMarker, Context context) {
super(boundCenterBottom(defaultMarker));
mContext = context;
}
public MapOverlay(Drawable arg0) {
super(boundCenterBottom(arg0));
}
public void addOverlay(OverlayItem overlay) {
mapOverlay.add(overlay);
populate();
}
#Override
protected OverlayItem createItem(int i) {
return mapOverlay.get(i);
}
#Override
public int size() {
return mapOverlay.size();
}
#Override
protected boolean onTap(int index) {
OverlayItem item = mapOverlay.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}
u need implements class LocationListener for listen our location changes and update on the map.
class LocationsListeners implements LocationListener {
#Override
public void onLocationChanged(Location location) {
setLAT(location.getLatitude());
setLON(location.getLongitude());
setGeoPoint(lat, lon);
mapOverlays.add(geoPoint);
}
#Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
#Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
#Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
u need method for calc the GeoPoint:
public GeoPoint setGeoPoint(double lat, double lon){
geoPoint = new GeoPoint((int) (lat * 1E6), (int)(lon * 1E6));
return geoPoint;
}
or using Little Fluffy Location - Its library that updates our location and notify u, is broadcast receiver, very simple and fast implementation:
try:
http://code.google.com/p/little-fluffy-location-library/
I searched for two hours but only found draw Line, i want get direction as this form Click here! I have ten point and when i click the point i want to show direction from my location to the point.
My code look:
package de.vogella.android.locationapi.maps;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
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;
import com.google.android.maps.Projection;
public class ShowMapActivity extends MapActivity {
private MapController mapController;
private MapView mapView;
private LocationManager locationManager;
private MyOverlays itemizedoverlay,itemizedoverlay_central;
private MyLocationOverlay myLocationOverlay;
private String nameOfOffice_AZ[];
private String addressOfOffice_AZ[];
private String phoneOfOffice_AZ[];
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main); // bind the layout to the activity
// Configure the Map
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
Projection projection = mapView.getProjection();
nameOfOffice_AZ= getResources().getStringArray(R.array.NamesOFObject_AZ);
addressOfOffice_AZ = getResources().getStringArray(R.array.AddressOfOffice_AZ);
phoneOfOffice_AZ = getResources().getStringArray(R.array.PhoneOfOffice_AZ);
mapController = mapView.getController();
mapController.setZoom(16); // Zoon 1 is world view
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, new GeoUpdateHandler());
myLocationOverlay = new MyLocationOverlay(this, mapView);
mapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.runOnFirstFix(new Runnable() {
public void run() {
mapView.getController().animateTo(myLocationOverlay.getMyLocation());
}
});
Drawable drawable = this.getResources().getDrawable(R.drawable.office_icon);
Drawable drawable_central = this.getResources().getDrawable(R.drawable.central_office);
itemizedoverlay = new MyOverlays(this, drawable);
itemizedoverlay_central = new MyOverlays(this, drawable_central);
createMarker();
}
#Override
protected boolean isRouteDisplayed() {
return false;
}
public class GeoUpdateHandler implements LocationListener {
#Override
public void onLocationChanged(Location location) {
int lat = (int) (location.getLatitude() * 1E6);
int lng = (int) (location.getLongitude() * 1E6);
GeoPoint point = new GeoPoint(lat, lng);
createMarker();
mapController.animateTo(point); // mapController.setCenter(point);
}
#Override
public void onProviderDisabled(String provider) {
}
#Override
public void onProviderEnabled(String provider) {
}
#Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
private void createMarker() {
//CENTRAL OFFICE
GeoPoint p_central = new GeoPoint((int)(40.38292884084829 * 1e6),(int)(49.84223246574 * 1e6));
OverlayItem overlayitem = new OverlayItem(p_central, nameOfOffice_AZ[0] ,addressOfOffice_AZ[0]+"\n"+phoneOfOffice_AZ[0] );
itemizedoverlay_central.addOverlay(overlayitem);
mapView.getOverlays().add(itemizedoverlay_central);
//END CENTRALL OFFICE
GeoPoint p = new GeoPoint((int)(40.376455916943236 * 1e6),(int)(49.84803676605224 * 1e6));
overlayitem = new OverlayItem(p, nameOfOffice_AZ[0] ,addressOfOffice_AZ[0]+"\n"+phoneOfOffice_AZ[0] );
itemizedoverlay.addOverlay(overlayitem);
mapView.getOverlays().add(itemizedoverlay);
}
#Override
protected void onResume() {
super.onResume();
myLocationOverlay.enableMyLocation();
myLocationOverlay.enableCompass();
}
#Override
protected void onPause() {
super.onPause();
myLocationOverlay.disableMyLocation();
myLocationOverlay.disableCompass();
}
}
and MyOverlays.java
package de.vogella.android.locationapi.maps;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
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.MapView;
import com.google.android.maps.OverlayItem;
public class MyOverlays extends ItemizedOverlay<OverlayItem> {
private static int maxNum = 5;
private OverlayItem overlays[] = new OverlayItem[maxNum];
private int index = 0;
private boolean full = false;
private Context mContext;
private OverlayItem previousoverlay;
public MyOverlays(Context context, Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
this.mContext = context;
}
private ArrayList< OverlayItem > mOverlays = new ArrayList< OverlayItem >();
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
public void name() {
}
#Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
#Override
public int size() {
return mOverlays.size();
}
#Override
protected boolean onTap(int i) {
//when you tap on the marker this will show the informations provided by you when you create in the
//main class the OverlayItem
OverlayItem item = mOverlays.get(i);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setInverseBackgroundForced(true);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.setCancelable(true);
dialog.setPositiveButton("Go To", new OkOnClickListener());
/// dialog.setNegativeButton("No, no", new CancelOnClickListener());
dialog.show();
// nese bax = new nese();
// bax.oldu(mContext);
return true;
}
private final class CancelOnClickListener implements
DialogInterface.OnClickListener {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(mContext, "You clicked yes", Toast.LENGTH_LONG)
.show();
}
}
private final class OkOnClickListener implements
DialogInterface.OnClickListener {
public void onClick(DialogInterface dialog, int which) {
//Toast.makeText(mContext, "You clicked no", Toast.LENGTH_LONG).show();
}
}
public class RoutePath extends MapActivity {
/** Called when the activity is first created. */
MapView mapView;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView mapView = (MapView) findViewById(R.id.mapview);
double src_lat = 25.04202; // the testing source
double src_long = 121.534761;
double dest_lat = 25.05202; // the testing destination
double dest_long = 121.554761;
GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),
(int) (src_long * 1E6));
GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),
(int) (dest_long * 1E6));
DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView);
mapView.getController().animateTo(srcGeoPoint);
mapView.getController().setZoom(15);
}
#Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
private void DrawPath(GeoPoint src, GeoPoint dest, int color,
MapView mMapView01) {
// code in section 2.2
}
}
}
Less efforts on search..
Anyway look at Google Driving Directions - MapView overlayed Also The Google Directions API
and using intent
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://maps.google.com/maps?saddr=xx.xx,xx.xx&daddr=xx.xx,xx.xx"));
startActivity(intent);
This blogpost can be a good startpoint: Android driving direction Route-Path
Worked fine for me.
I have a map activity which displays the map, I want to add a marker when I touch on the screen ..
This is my Activity ...
package com.adhamenaya.android;
import java.util.List;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
public class MapApp extends MapActivity {
private MapView mapView;
private MapController mapController;
private LocationManager locationManager;
private Context context;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
context=this;
initLayout();
initMap();
}
private void initLayout(){
mapView = (MapView) findViewById(R.id.mapview);
//blueIcon = (Drawable)this.getResources().getDrawable(R.drawable.blueicon);
}
private void initMap(){
mapView.setBuiltInZoomControls(true);
mapView.setStreetView(true);
mapController=mapView.getController();
mapController.setZoom(10);// 1 is world view
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, new GeoUpdateHandler());
}
#Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
class GeoUpdateHandler implements LocationListener {
#Override
public void onLocationChanged(Location location) {
int lat=(int)(location.getLatitude()*1E6);
int lng=(int)(location.getLongitude()*1E6);
GeoPoint point=new GeoPoint(lat,lng);
//GeoPoint point = new GeoPoint(19240000,-99120000);
mapController.animateTo(point);
mapController.setCenter(point);
Drawable redIcon = context.getResources().getDrawable(R.drawable.redicon);
List<Overlay> mapOverlays = mapView.getOverlays();
MyItemizedOverlay itemizedoverlay = new MyItemizedOverlay(redIcon);
OverlayItem overlayitem = new OverlayItem(point, "Hello !", "I'm here");
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
}
#Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
#Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
#Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
public boolean onTouchEvent(MotionEvent event){
int x=(int)event.getX();
int y=(int)event.getY();
Toast.makeText(context, x, Toast.LENGTH_LONG).show();
GeoPoint point = mapView.getProjection().fromPixels(x, y);
Drawable redIcon = context.getResources().getDrawable(R.drawable.blueicon);
List<Overlay> mapOverlays = mapView.getOverlays();
MyItemizedOverlay itemizedoverlay = new MyItemizedOverlay(redIcon);
OverlayItem overlayitem = new OverlayItem(point, "New Place", "I clicked here !");
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
return false;
}
}
}
Edit : This is the class for ItemizedOverlay, where I have implemented onTap() method , but nothing happens ...
package com.adhamenaya.android;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.widget.Toast;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
public class MyItemizedOverlay extends ItemizedOverlay{
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Context mContext;
public MyItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public MyItemizedOverlay(Drawable defaultMarker, Context context) {
super(defaultMarker);
mContext = context;
}
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
#Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
#Override
public int size() {
return mOverlays.size();
}
#Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
#Override
public boolean onTouchEvent(MotionEvent event, MapView mapView) {
int x=(int)event.getX();
int y=(int)event.getY();
Toast.makeText(mContext, x, Toast.LENGTH_LONG).show();
return super.onTouchEvent(event, mapView);
}
}
Hello, MapView! tutorial covers showing markers on MapView. In the tutorial markers are added as soon as the activity starts, but you can also add markers at later time, for example, when user touches screen. If you try this approach, you'll likely want to override onTap in your subclass of ItemizedOverlay.
Update:
If you follow the tutorial, you'll have your own subclass of ItemizedOverlay. onTap is one of its methods. Now that I look at the documentation, unfortunately onTap(GeoPoint p, MapView mapView) is not public or protected so you cannot override it.
What you can do, is have another overlay, solely for detecting taps. Instead of subclassing ItemizedOverlay, subclass Overlay.
private class TapOverlay extends Overlay {
public boolean onTap(GeoPoint p, MapView mapView) {
// code that adds item in your ItemizedOverlay
// goes here
return true;
}
}