Android 安卓&x2B;谷歌地图api v2+;当前位置
我正在创建一个带有谷歌地图视图的应用程序,我希望该应用程序能够检测用户的当前位置,并在地图上显示带有标记的lat和long,但到目前为止,我所能做的就是显示谷歌地图,并检测当前位置,而不显示任何标记,也不显示任何文本来显示lat和long 我直到现在才添加标记,因为我不知道将其放在代码中的什么位置,以及这样做的最佳实践是什么 有人能帮我吗??? 这是以下代码: 清单文件Android 安卓&x2B;谷歌地图api v2+;当前位置,android,google-maps,Android,Google Maps,我正在创建一个带有谷歌地图视图的应用程序,我希望该应用程序能够检测用户的当前位置,并在地图上显示带有标记的lat和long,但到目前为止,我所能做的就是显示谷歌地图,并检测当前位置,而不显示任何标记,也不显示任何文本来显示lat和long 我直到现在才添加标记,因为我不知道将其放在代码中的什么位置,以及这样做的最佳实践是什么 有人能帮我吗??? 这是以下代码: 清单文件 首先检查文档,它很好地说明了获取用户位置的最佳策略 就我个人而言,我通常在地图的起始位置放置一个标记 Location las
首先检查文档,它很好地说明了获取用户位置的最佳策略 就我个人而言,我通常在地图的起始位置放置一个标记
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
然后我开始监听位置更新并移动标记
它还取决于您的应用程序的用途所需的准确位置,如果您不需要真正准确的位置,但面积足够大,您可以使用lastnownlocation
你可以试试这样的
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Getting Google Play availability status
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());
// Showing status
if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available
int requestCode = 10;
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
dialog.show();
}else { // Google Play Services are available
// Getting reference to the SupportMapFragment of activity_main.xml
SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
// Getting GoogleMap object from the fragment
googleMap = fm.getMap();
// Enabling MyLocation Layer of Google Map
googleMap.setMyLocationEnabled(true);
// Getting LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Getting the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Getting Current Location
Location location = locationManager.getLastKnownLocation(provider);
LocationListener locationListener = new LocationListener() {
void onLocationChanged(Location location) {
// redraw the marker when get location update.
drawMarker(location);
}
if(location!=null){
//PLACE THE INITIAL MARKER
drawMarker(location);
}
locationManager.requestLocationUpdates(provider, 20000, 0, locationListener);
}
}
private void drawMarker(Location location){
// Remove any existing markers on the map
googleMap.clear();
LatLng currentPosition = new LatLng(location.getLatitude(),location.getLongitude());
googleMap.addMarker(new MarkerOptions()
.position(currentPosition)
.snippet("Lat:" + location.getLatitude() + "Lng:"+ location.getLongitude())
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
.title("ME"));
}
另外,您不需要Activity类来实现LocationListener,您只需定义一个监听器并注册它,就像我上面所做的那样
另外,我没有编辑器,我的代码可能包含打字错误
希望这有帮助,干杯在android中定义谷歌地图android v2的完整快捷方式 XML文件:
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
Menifest文件:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<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_NETWORK_STATE" />
<!-- Map permission Starts -->
<permission
android:name="com.example.mapdemoapiv2.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.mapdemoapiv2.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<!-- Map permission Starts -->
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.mapdemoapiv2.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MapDetail" >
</activity>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="Your Key" />
<uses-library android:name="com.google.android.maps" />
</application>
活动类别:
public class MainActivity extends android.support.v4.app.FragmentActivity
{
GoogleMap googleMap;
MarkerOptions markerOptions;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setUpMapIfNeeded();
GetCurrentLocation();
}
private void setUpMapIfNeeded() {
if (googleMap == null) {
Log.e("", "Into null map");
googleMap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter(
MainActivity.this));
if (googleMap != null) {
Log.e("", "Into full map");
googleMap.setMapType(googleMap.MAP_TYPE_NORMAL);
googleMap.getUiSettings().setZoomControlsEnabled(false);
}
}
}
private void GetCurrentLocation() {
double[] d = getlocation();
Share.lat = d[0];
Share.lng = d[1];
googleMap
.addMarker(new MarkerOptions()
.position(new LatLng(Share.lat, Share.lng))
.title("Current Location")
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.dot_blue)));
googleMap
.animateCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(Share.lat, Share.lng), 5));
}
public double[] getlocation() {
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
List<String> providers = lm.getProviders(true);
Location l = null;
for (int i = 0; i < providers.size(); i++) {
l = lm.getLastKnownLocation(providers.get(i));
if (l != null)
break;
}
double[] gps = new double[2];
if (l != null) {
gps[0] = l.getLatitude();
gps[1] = l.getLongitude();
}
return gps;
}
public class MainActivity扩展了android.support.v4.app.FragmentActivity
{
谷歌地图谷歌地图;
标记选项标记选项;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupmapifneed();
GetCurrentLocation();
}
私有void setUpMapIfNeeded(){
if(googleMap==null){
Log.e(“,”进入空映射”);
Google地图=((SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
setInfoWindowAdapter(新的CustomInfoWindowAdapter(
主要活动,这),;
if(谷歌地图!=null){
Log.e(“,”进入完整地图”);
googleMap.setMapType(googleMap.MAP\u TYPE\u NORMAL);
googleMap.getUiSettings().setZoomControlsEnabled(false);
}
}
}
私有void GetCurrentLocation(){
double[]d=getlocation();
Share.lat=d[0];
Share.lng=d[1];
谷歌地图
.addMarker(新标记选项()
.职位(新LatLng(Share.lat,Share.lng))
.标题(“当前位置”)
.图标(位图描述符工厂)
.fromResource(R.drawable.dot_blue));
谷歌地图
.animateCamera(CameraUpdateFactory.newLatLngZoom(
新LatLng(Share.lat,Share.lng),5);
}
公共双[]getlocation(){
LocationManager lm=(LocationManager)getSystemService(Context.LOCATION\u服务);
列表提供程序=lm.getProviders(true);
位置l=空;
对于(int i=0;i
像这样简单:
在此之后—
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="Your Key" />
把这个-
<meta-data android:name="com.google.android.gms.version" android:value="4030500" />
我也遇到了同样的问题,并找到了一种使用谷歌地图API的方法:
private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());
mMarker = mMap.addMarker(new MarkerOptions().position(loc));
if(mMap != null){
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
}
}
};
然后设置映射的侦听器:
mMap.setOnMyLocationChangeListener(myLocationChangeListener);
当地图第一次找到位置时,将调用此函数
根本不需要LocationService
或LocationManager
。最好使用:
Location currentLocation =
LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
@drChivas这正是我想要做的,我需要在地图上用包含lat和long的文本显示用户的当前位置,但我不知道如何做,如果最后一个已知位置为空,那该怎么办?这太棒了,而且很划算。仅供参考,这是一个语法错误:。snippet(“lat:+location.getLatitude()”“Lng:+location.getLongitude());我必须删除最后一个括号和分号,因为它使下面的.icon()无效等等。@Chivas博士,你能告诉我,如果我按下右边地图的按钮,我如何显示当前位置吗?我们可以通过谷歌地图API获取位置吗?因为有些设备没有GPS。这和预期的一样。谢谢。但我想修改它,以便能够返回双[]含有lat和lng。这怎么可能?我觉得很奇怪/
private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());
mMarker = mMap.addMarker(new MarkerOptions().position(loc));
if(mMap != null){
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
}
}
};
mMap.setOnMyLocationChangeListener(myLocationChangeListener);
Location currentLocation =
LocationServices.FusedLocationApi.getLastLocation(googleApiClient);