【问题标题】:Tracking current location on Google Maps在谷歌地图上追踪当前位置
【发布时间】:2018-04-20 00:17:36
【问题描述】:

我试图制作一个具有地图活动的应用程序,一旦打开,地图就会从用户当前位置开始。我尝试使用在线指南和帮助,但似乎所有这些指南都已过时,因为它们在地图活动中默认具有 onResume 和 onStart 方法,而我有 onMapReady 方法,但没有这些方法。这是我尝试编写的代码,但它不起作用(应用程序崩溃),

package com.imt.civilwatch;
import android.content.pm.PackageManager;
import android.location.Location;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
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.MarkerOptions;
import java.text.StringCharacterIterator;
public class MapActivity extends FragmentActivity implements         OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private GoogleMap mMap;
protected GoogleApiClient mGoogleApiClient;
Location mLastLocation;
private double mLatitudeText;
private double mLongitudeText;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
    // 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);
}
protected void onStart() {
    mGoogleApiClient.connect();
    super.onStart();
}
protected void onStop() {
    mGoogleApiClient.disconnect();
    super.onStop();
}
@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(32, 35);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    //mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
@Override
public void onConnected(Bundle connectionHint) {
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
    if (mLastLocation != null) {
        mLatitudeText = (Double.valueOf(mLastLocation.getLatitude()));
        mLongitudeText = (Double.valueOf(mLastLocation.getLongitude()));
        LatLng last = new LatLng( mLatitudeText,mLongitudeText);
        mMap.moveCamera(CameraUpdateFactory.newLatLng(last));
    }
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}

}

【问题讨论】:

  • 如果您的应用程序崩溃,请在您的问题中提供 logcat

标签: java android google-maps


【解决方案1】:

来自 Google Maps Android API 的documentation,Android 设备可用的位置数据包括使用多种技术精确定位的设备的当前位置 - 移动方向和方法,以及设备是否已经移动预定义的地理边界或地理围栏。

根据您的应用程序的需要,您可以在以下选项中进行选择:

  • 使用“我的位置”图层提供了一种简单的方式来显示 设备在地图上的位置。它不提供数据。

  • 使用Google Play services Location API 是 推荐用于位置数据的所有程序化请求。

  • 并使用 LocationSource 界面允许您提供自定义位置提供程序。

有关更多信息,请查看本教程以了解如何获取当前位置:

【讨论】:

  • 谢谢你们的反馈,你们真的帮了大忙。您链接的指南真的很有帮助,感谢我的代码终于奏效了!
【解决方案2】:

onMapReady 方法在地图片段准备就绪并显示地图时运行。

onConnected 方法在设备成功连接到 Google Play 位置服务并(如果可用)获取您最后的已知位置时运行。

如果您不希望相机移动到当前位置,请删除此条件之间的内容:

if(mLastLocation != null){...}

对于地图,相机是屏幕上可见的东西。 mMap.moveCamera(...) 方法告诉 Map 以特定的 LatLng 居中视图。

如果您的手机在连接 Google Play Location API 之前您的地图已准备就绪,那么当前可见的位置将是:

if (mLastLocation != null) {
    mLatitudeText = (Double.valueOf(mLastLocation.getLatitude()));
    mLongitudeText = (Double.valueOf(mLastLocation.getLongitude()));
    LatLng last = new LatLng( mLatitudeText,mLongitudeText);
    mMap.moveCamera(CameraUpdateFactory.newLatLng(last));
}

希望我很清楚。


请参阅 CameraFactory 文档以了解地图上的相机操作:https://developers.google.com/android/reference/com/google/android/gms/maps/CameraUpdateFactory

【讨论】:

    【解决方案3】:

    兄弟,您需要 GoogleApiClient 和 LocationRequest 以及清单中的两个用户权限,即“访问精细位置和访问粗略位置”,为了获取当前位置,您需要执行以下操作: 将其包含在清单中:-

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

    --> Acticity 中的当前位置代码将是这样的: --> 在Activity中全局创建这两个变量:

    GoogleApiClient mGoogleapiClient;
    LocationRequest mUserLocationRequest;
    

    --> 然后来到@override Onconnected() 并这样做:-

     @Override
    public void onConnected(Bundle bundle) {
        mUserLocationRequest = LocationRequest.create();
        /* Priority = High so that more Correct User Location will be Accessed
           up to date information ot highest information get*/
        /* Priority = Low if you Don't Want The Exect Location Of The User */
        mUserLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        /*For every 1 min I have to Fetch My User Location*/
        mUserLocationRequest.setInterval(1000);
    
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleapiClient, mUserLocationRequest,  (LocationListener) MainActivity.this);
    }
    

    --> 现在在 Activity 中实现 LocationListener 实现方法 onLocationChanged(): 并在 this 中执行此类操作,这将在用户更改其位置时为您提供最新信息:-

    @Override
    public void onLocationChanged(Location location) {
        if (location == null)
        {
            Toast.makeText(this, "Sorry We Can't able to Get Your Current Location", Toast.LENGTH_SHORT).show();
        }
        else
        {
            LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
            CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng,15);
            mGoogleMap.animateCamera(update);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 1970-01-01
      • 2013-09-03
      • 2012-11-26
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      相关资源
      最近更新 更多