在Android中获取lat lng值的最佳方法是什么?

时间:2016-02-02 16:39:06

标签: android

在Android中获取用户定位位置的最有效方法是什么?

通过高效,我的意思是快速而不是过于侵扰权限(也是在Android 6.0上最近的权限更改之后)。

问题的第二部分是获取Google地图api以外的用户位置的其他方式吗?

2 个答案:

答案 0 :(得分:0)

使用LocationManager。

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double longitude = location.getLongitude();
double latitude = location.getLatitude();

  private final LocationListener locationListener = new LocationListener() {
  public void onLocationChanged(Location location) {
    longitude = location.getLongitude();
    latitude = location.getLatitude();
}
}

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);

如果您想使用GPS,则需要为您的应用程序提供ACCESS_FINE_LOCATION权限。

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

希望它有所帮助。

答案 1 :(得分:0)

更快,使用Google Api,而不是Android Api:

首先,让您的类扩展GoogleApiClient.ConnectionCallbacks和LocationListener接口,并声明一个GoogleApiClient变量。

private GoogleApiClient gApiClient;

其次,从onCreate或类似的方法调用此方法:

protected synchronized void buildGoogleApiClient() {
    gApiClient = new GoogleApiClient.Builder(getActivity())
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult connectionResult) {

                }
            })
            .addApi(LocationServices.API)
            .build();

    gApiClient.connect();

    createLocationRequest();
}

protected void createLocationRequest() {

    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(5000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}

最后覆盖此方法:

@Override
public void onLocationChanged(Location location) {
    tempLatitude=location.getLatitude();
    tempLongitude=location.getLongitude();
}

--- --- EDIT

我刚刚意识到我错过了一个方法,这个方法在连接fApiClient后自动调用:

@Override
public void onConnected(Bundle bundle) {
    Location lkn= LocationServices.FusedLocationApi.getLastLocation(
            gApiClient);

    if(lkn!=null){

        tempLatitud=lkn.getLatitude();
        tempLongitud=lkn.getLongitude();
    }

    LocationServices.FusedLocationApi.requestLocationUpdates(
            gApiClient, mLocationRequest, this);
}

而且,如果您正在使用地图,则需要扩展另外两个接口:OnMapReadyCallback和GoogleMap.OnMapClickListener,以防万一您需要对用户点击地图做出反应。第一个只需要实现onMapReady方法(GoogleMap map)。在该方法中,你可以做到

this.map=map;

(this.map指的是您在班级中声明的GoogleMap变量。)

之后,您的地图就可以使用了。

您将使用onLocationChanged方法更新设备的位置,以便您使用它们。

回答你的第二个问题,你可以通过细胞塔的三角测量来获得你的经纬度。看here