如何在android中获取google mapview上的当前位置
在我的代码中,我不明白我在代码中犯了什么错误。我没有在地图视图中用pin点图像获取当前位置。如何获取纬度和纬度并通过地理点。然后将值传递给OverlayItem如何在android中获取google mapview上的当前位置,android,google-maps,android-mapview,Android,Google Maps,Android Mapview,在我的代码中,我不明白我在代码中犯了什么错误。我没有在地图视图中用pin点图像获取当前位置。如何获取纬度和纬度并通过地理点。然后将值传递给OverlayItem public class HelloGoogleMaps2 extends MapActivity implements LocationListener{ private LocationManager locationManager; private String provider; int lat; int lng;
public class HelloGoogleMaps2 extends MapActivity implements LocationListener{
private LocationManager locationManager;
private String provider;
int lat;
int lng;
MyLocationOverlay myLocOverlay;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
// Get the location manager
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the locatioin provider -> use
// default
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);
Log.d("provider ","Provider "+provider);
Log.d("provider ","Provider "+provider);
Log.d("provider ","Provider "+provider);
Log.d("location","Location "+location);
Log.d("location","Location "+location);
Log.d("location","Location "+location);
// Initialize the location fields
if (location != null) {
System.out.println("Provider " + provider + " has been selected.");
onLocationChanged(location);
} else {
//latituteField.setText("Location not available");
// longitudeField.setText("Location not available");
}
List<Overlay> mapOverlays = mapView.getOverlays();
myLocOverlay = new MyLocationOverlay(this, mapView);
mapOverlays.add(myLocOverlay);
myLocOverlay.enableMyLocation();
GeoPoint point = new GeoPoint(lat, lng);
// mc.setCenter(point);
// mapView.invalidate();
Drawable drawable = this.getResources().getDrawable(R.drawable.ic_launcher);
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);
GeoPoint point = new GeoPoint(lat,lng);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
/* Remove the locationlistener updates when Activity is paused */
//
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
//
public void onLocationChanged(Location location) {
lat = (int) (location.getLatitude()* 1E6);
lng = (int) (location.getLongitude()* 1E6);
// latituteField.setText(String.valueOf(lat));
// longitudeField.setText(String.valueOf(lng));
}
//
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
//
public void onProviderEnabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
}
//
public void onProviderDisabled(String provider) {
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
公共类HelloLogleMaps2扩展MapActivity实现LocationListener{
私人场所经理场所经理;
私有字符串提供者;
int lat;
国际液化天然气;
MyLocationOverlay myLocOverlay;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView MapView=(MapView)findViewById(R.id.MapView);
mapView.SetBuilTinZoomControl(真);
//获取位置管理器
locationManager=(locationManager)getSystemService(Context.LOCATION\u服务);
//定义如何选择位置提供程序->使用的条件
//违约
标准=新标准();
provider=locationManager.getBestProvider(标准,true);
Location Location=locationManager.getLastKnownLocation(提供者);
日志d(“提供商”、“提供商”+提供商);
日志d(“提供商”、“提供商”+提供商);
日志d(“提供商”、“提供商”+提供商);
日志d(“位置”、“位置”+位置);
日志d(“位置”、“位置”+位置);
日志d(“位置”、“位置”+位置);
//初始化位置字段
如果(位置!=null){
System.out.println(“已选择提供程序”+提供程序+”);
onLocationChanged(位置);
}否则{
//latituteField.setText(“位置不可用”);
//longitudeField.setText(“位置不可用”);
}
List mapOverlays=mapView.getOverlays();
myLocOverlay=新的MyLocationOverlay(这是地图视图);
mapOverlays.add(myLocOverlay);
myLocOverlay.enableMyLocation();
地质点=新的地质点(纬度、液化天然气);
//mc.设置中心(点);
//mapView.invalidate();
Drawable Drawable=this.getResources().getDrawable(R.Drawable.ic_启动器);
HelloItemizedOverlay itemizedoverlay=新HelloItemizedOverlay(可绘制);
地质点=新的地质点(纬度、液化天然气);
OverlayItem OverlayItem=新的OverlayItem(指向“你好,芒多!”,“我在墨西哥城!”);
itemizedoverlay.addOverlay(overlayitem);
添加(itemizedoverlay);
}
@凌驾
受保护的布尔值isRouteDisplayed(){
//TODO自动生成的方法存根
返回false;
}
受保护的void onResume(){
super.onResume();
locationManager.requestLocationUpdates(提供者,400,1,this);
}
/*活动暂停时删除locationlistener更新*/
//
受保护的void onPause(){
super.onPause();
locationManager.RemoveUpdate(此);
}
//
已更改位置上的公共无效(位置){
lat=(int)(location.getLatitude()*1E6);
lng=(int)(location.getLongitude()*1E6);
//latituteField.setText(String.valueOf(lat));
//longitudeField.setText(字符串值(lng));
}
//
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
//TODO自动生成的方法存根
}
//
公共无效onProviderEnabled(字符串提供程序){
Toast.makeText(此“已启用的新提供程序”+提供程序,
吐司。长度(短)。show();
}
//
公共无效onProviderDisabled(字符串提供程序){
Toast.makeText(此“禁用的提供程序”+提供程序,
吐司。长度(短)。show();
}
}我推荐
用于在地图上绘制用户当前位置(和精度)的覆盖图,和/或罗盘玫瑰插图。子类可以重写dispatchTap()来处理当前位置上的点击。您可能需要从活动的Activity.onResume()方法调用enableMyLocation()和/或enableCompass(),以启用此覆盖的功能。记住在活动的Activity.onPause()方法中调用相应的DisableLocation()和/或disableCompass(),以便在后台关闭更新。
或者,构造器还可以选择一个MapController,并使用它来保持“我的位置”点可见,方法是在地图离开屏幕时平移地图,并在位置或方向发生变化时使用视图来查看。postInvalidate() runOnFirstFix(java.lang.Runnable)中可以提供Runnables,以便在修复后立即运行。(例如,这可以使地图居中并放大以显示位置。)
你可以找到一个关于MyLocationOverlay的很好的教程。正确的代码是这样的,但也可以添加使用权限、Internet、访问粗略位置、访问精细位置和写入外部存储。用户库
public class GoogleMapActivity extends MapActivity implements LocationListener {
private final static String TAG = GoogleMapActivity.class.getSimpleName();
private MyItemizedOverlay itemizedOverlay;
double lat;
double lng;
private String provider;
private LocationManager locationManager;
private MapView mapview;
Drawable drawable;
boolean sat = true;
boolean dra = true;
private MapController controller;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// fetch the map view from the layout
mapview = (MapView) findViewById(R.id.mapview);
// make available zoom controls
mapview.setBuiltInZoomControls(false);
// Use the location manager through GPS
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
System.out.println("Provider " + provider + " has been selected.");
lat = (double) (location.getLatitude());
lng = (double) (location.getLongitude());
Log.i(TAG, "Lattitude:" + lat);
Log.i(TAG, "Longitude:" + lng);
Toast.makeText(
this,
"Current location:\nLatitude: " + lat + "\n"
+ "Longitude: " + lng, Toast.LENGTH_LONG).show();
// create geo point
GeoPoint point = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
// get the MapController object
controller = mapview.getController();
// animate to the desired point
controller.animateTo(point);
// set the map zoom to 13
// zoom 1 is top world view
controller.setZoom(13);
// invalidate the map in order to show changes
mapview.invalidate();
drawable = this.getResources().getDrawable(R.drawable.ic_launcher);
OverlayItem overlayItem = new OverlayItem(point, "", "");
itemizedOverlay = new MyItemizedOverlay(drawable, this);
itemizedOverlay.addOverlay(overlayItem);
mapview.getOverlays().add(itemizedOverlay);
mapview.invalidate();
} else {
System.out.println("Location not avilable");
}
// when the current location is found – stop listening for updates
// (preserves battery)
locationManager.removeUpdates(this);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
public void onProviderDisabled(String provider) {
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
public void onProviderEnabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onLocationChanged(Location location) {
}
public MapView getMapView() {
return this.mapview;
}
}
`//这是另一个项目覆盖
public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem>
{
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
public MyItemizedOverlay(Drawable defaultMarker, Context ctx){
super(boundCenterBottom(defaultMarker));
}
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
public void clear() {
mOverlays.clear();
populate();
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
@Override
protected boolean onTap(int index) {
return true;
}
公共类MyItemizeOverlay扩展了ItemizeOverlay
{
private ArrayList mOverlays=new ArrayList();
公共MyItemizeOverlay(可绘制的defaultMarker,上下文ctx){
super(boundCenterBottom(defaultMarker));
}
公共void addOverlay(OverlayItem overlay){
添加(覆盖);
填充();
}
公共空间清除(){
mOverlays.clear();
填充();
}
@凌驾
受保护的OverlayItem createItem(int i){
返回mOverlays.get(i);
}
@凌驾
公共整数大小(){
返回mOverlays.size();
}
@凌驾
受保护的布尔onTap(整数索引){
返回true;
}
}Sir i wnat动态纬度和经度以及通过的地理点让您尝试myLocationOverlay.runOnFirstFix(新Runnable(){public void run(){localLat=myLocationOverlay.getMyLocation().GetLatitude6()/1E6;localLng=myLocationOverlay.getMyLocation().getLongitudeE6()/1E6;}});