如何在Google Maps v2中的用户位置放置标记

时间:2014-03-17 12:43:24

标签: android google-maps location google-maps-markers

您好我希望用户能够在Google Maps v2上找到他们的位置。当我点击地图上的位置按钮时会发生一些事情,因为我的手机顶部会出现一个带有光束的卫星物。任何人都可以帮忙解决这个问题吗?

另外,作为一个侧面问题,是否有任何方法可以向指定位置添加方向或距离?

MapsActivity.java:

package com.example.softwaresearchapp;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends Activity {

    // Google Map
    private GoogleMap googleMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.maps);

        try {
            // Loading map
            initilizeMap();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }  
    /**
     * function to load map. If map is not created it will create it for you
     * */
    private void initilizeMap() {
        if (googleMap == null) {
            googleMap = ((MapFragment) getFragmentManager().findFragmentById(
                    R.id.map)).getMap();

            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                        .show();
            }
        }

        googleMap.setMyLocationEnabled(true); // false to disable
        googleMap.getUiSettings().setMyLocationButtonEnabled(true);
        googleMap.getUiSettings().setCompassEnabled(true);
        googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        googleMap.addMarker(new MarkerOptions()
                .position(new LatLng(52.911927, -1.187923))
                .title("Nottingham Trent University - Clifton Campus"));
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        //googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        //googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        //googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        //googleMap.setMapType(GoogleMap.MAP_TYPE_NONE);
    }

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

的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.softwaresearchapp"
    android:versionCode="1"
    android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="17" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" 
        android:theme="@style/Theme.AppCompat.Light">
        <activity
            android:name="com.example.softwaresearchapp.MainActivity"
            android:label="@string/app_name">
            <meta-data
                android:name="android.app.default_searchable"
                android:value=".SearchResultsActivity" />
        </activity>
        <!-- Search results activity -->
        <activity android:name="com.example.softwaresearchapp.SearchResultsActivity"
            android:parentActivityName="com.example.softwaresearchapp.MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>
         <activity android:name ="com.example.softwaresearchapp.MapsActivity"/>
             <activity android:name ="com.example.softwaresearchapp.ABActivity"/>
             <activity android:name="com.example.softwaresearchapp.SoftwareSearchActivity"/>
             <activity android:name="com.example.softwaresearchapp.SplashActivity">
                 <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            </activity>        
         <meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="AIzaSyAyPwV_djsaafTUYCjEc_QyUgjnSdnriwg"/>
         <meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />
    </application>
</manifest>

2 个答案:

答案 0 :(得分:0)

来自文档:

使标记可拖动

只要标记的draggable属性设置为true,就可以在标记添加到地图后重新定位标记。长按标记以启用拖动。当您将手指从屏幕上移开时,标记将保持在该位置。

默认情况下,标记不可拖动。在将标记添加到地图之前,必须使用MarkerOptions.draggable(boolean)将标记显式设置为可拖动,或者将Marker.setDraggable(boolean)添加到地图后。您可以在标记上侦听拖动事件,如标记拖动事件中所述。

下面的代码片段在澳大利亚珀斯增加了一个可拖动的标记。

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .draggable(true));

此处有更多信息:https://developers.google.com/maps/documentation/android/marker?hl=nl#make_a_marker_draggable

检查第二个问题:Launching Google Maps Directions via an intent on Android

答案 1 :(得分:0)

以下是如何操作:

// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      googleMap.addMarker(new MarkerOptions()
        .position(new LatLng(location.getLatitude(), location.getLongitude()))
        .title("Hello world"));
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

另外,请务必在清单中添加正确的权限:

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