Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓&x2B;谷歌地图api v2+;当前位置_Android_Google Maps - Fatal编程技术网

Android 安卓&x2B;谷歌地图api v2+;当前位置

Android 安卓&x2B;谷歌地图api v2+;当前位置,android,google-maps,Android,Google Maps,我正在创建一个带有谷歌地图视图的应用程序,我希望该应用程序能够检测用户的当前位置,并在地图上显示带有标记的lat和long,但到目前为止,我所能做的就是显示谷歌地图,并检测当前位置,而不显示任何标记,也不显示任何文本来显示lat和long 我直到现在才添加标记,因为我不知道将其放在代码中的什么位置,以及这样做的最佳实践是什么 有人能帮我吗??? 这是以下代码: 清单文件 首先检查文档,它很好地说明了获取用户位置的最佳策略 就我个人而言,我通常在地图的起始位置放置一个标记 Location las

我正在创建一个带有谷歌地图视图的应用程序,我希望该应用程序能够检测用户的当前位置,并在地图上显示带有标记的lat和long,但到目前为止,我所能做的就是显示谷歌地图,并检测当前位置,而不显示任何标记,也不显示任何文本来显示lat和long

我直到现在才添加标记,因为我不知道将其放在代码中的什么位置,以及这样做的最佳实践是什么

有人能帮我吗??? 这是以下代码:

清单文件
首先检查文档,它很好地说明了获取用户位置的最佳策略

就我个人而言,我通常在地图的起始位置放置一个标记

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);