【问题标题】:Map application isn't updating location until Google maps location has been updated在 Google 地图位置更新之前,地图应用程序不会更新位置
【发布时间】:2017-01-02 19:51:21
【问题描述】:

我只有在首先更新谷歌地图后才能在我的应用程序中获取当前位置,而如果我不更新谷歌地图,我的应用程序将无法获取当前位置。这是我的 Java 代码:

MapsActivity.java

import android.location.Location;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements
    OnMapReadyCallback,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    GoogleMap.OnMarkerDragListener,
    GoogleMap.OnMapLongClickListener,
    View.OnClickListener{

//Our Map
private GoogleMap mMap;

//To store longitude and latitude from map
private double longitude;
private double latitude;

//Buttons
private ImageButton buttonSave;
private ImageButton buttonCurrent;
private ImageButton buttonView;

//Google ApiClient
private GoogleApiClient googleApiClient;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    //Initializing googleapi client
    googleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();

    //Initializing views and adding onclick listeners
    buttonSave = (ImageButton) findViewById(R.id.buttonSave);
    buttonCurrent = (ImageButton) findViewById(R.id.buttonCurrent);
    buttonView = (ImageButton) findViewById(R.id.buttonView);
    buttonSave.setOnClickListener(this);
    buttonCurrent.setOnClickListener(this);
    buttonView.setOnClickListener(this);
}

@Override
protected void onStart() {
    googleApiClient.connect();
    super.onStart();
}

@Override
protected void onStop() {
    googleApiClient.disconnect();
    super.onStop();
}

//Getting current location
private void getCurrentLocation() {
    mMap.clear();
    //Creating a location object
    Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
    if (location != null) {
        //Getting longitude and latitude
        longitude = location.getLongitude();
        latitude = location.getLatitude();

        //moving the map to location
        moveMap();
    }
}

//Function to move the map
private void moveMap() {
    //String to display current latitude and longitude
    String msg = latitude + ", "+longitude;

    //Creating a LatLng Object to store Coordinates
    LatLng latLng = new LatLng(latitude, longitude);

    //Adding marker to map
    mMap.addMarker(new MarkerOptions()
            .position(latLng) //setting position
            .draggable(true) //Making the marker draggable
            .title("Current Location")); //Adding a title

    //Moving the camera
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

    //Animating the camera
    mMap.animateCamera(CameraUpdateFactory.zoomTo(15));

    //Displaying current coordinates in toast
    Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    LatLng latLng = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(latLng).draggable(true));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    mMap.setOnMarkerDragListener(this);
    mMap.setOnMapLongClickListener(this);
}

@Override
public void onConnected(Bundle bundle) {
    getCurrentLocation();
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

@Override
public void onMapLongClick(LatLng latLng) {
    //Clearing all the markers
    mMap.clear();

    //Adding a new marker to the current pressed position
    mMap.addMarker(new MarkerOptions()
            .position(latLng)
            .draggable(true));
}

@Override
public void onMarkerDragStart(Marker marker) {

}

@Override
public void onMarkerDrag(Marker marker) {

}

@Override
public void onMarkerDragEnd(Marker marker) {
    //Getting the coordinates
    latitude = marker.getPosition().latitude;
    longitude = marker.getPosition().longitude;

    //Moving the map
    moveMap();
}

@Override
public void onClick(View v) {
    if(v == buttonCurrent){
        getCurrentLocation();
        moveMap();
    }}}

这是我的清单。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.takecare">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <!--
         The API key for Google Maps-based APIs is defined as a string resource.
         (See the file "res/values/google_maps_api.xml").
         Note that the API key is linked to the encryption key used to sign the APK.
         You need a different API key for each encryption key, including the release key that is used to
         sign the APK for publishing.
         You can define the keys for the debug and release targets in src/debug/ and src/release/. 
    -->
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/google_maps_key" />

    <activity
        android:name=".MapsActivity"
        android:label="@string/title_activity_maps">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

这是我的 App Gradle 依赖项

compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.android.support:design:24.1.1'
compile 'com.android.support:support-v4:24.1.1'
compile 'com.google.android.gms:play-services:9.4.0'
compile 'com.google.android.gms:play-services-location:9.4.0'

【问题讨论】:

    标签: android google-maps android-studio location


    【解决方案1】:

    你这几行代码写错了

    此代码用于获取当前的经纬度数据

    longitude = location.getLongitude();
    latitude = location.getLatitude();
    

    你把这些数据设置在地图上

    mMap = googleMap;
    LatLng latLng = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(latLng).draggable(true));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    mMap.setOnMarkerDragListener(this);
    mMap.setOnMapLongClickListener(this);
    

    更新您的位置后,您将设置此位置

    mMap.addMarker(new MarkerOptions()
            .position(latLng)
            .draggable(true));
    
    where as your data is on latLng   -34, 151
    

    那是因为您没有在地图上获取更新数据,只需使用这些代码行获取最新数据

    LatLng latLng = new LatLng(location.getLongitude(),location.getLatitude());
    

    我没有检查你的 gradle 或 manifest 请检查你的最后。

    也许这段代码会对你有所帮助);

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 2017-07-21
      • 2016-11-03
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      相关资源
      最近更新 更多