android:改进查找当前位置

android:改进查找当前位置,android,google-maps,android-fusedlocation,Android,Google Maps,Android Fusedlocation,我想在android上查找当前用户位置 我使用以下代码: mLocationRequest = LocationRequest.create(); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationRequest.setInterval(1000); // Update location every second if (ContextCompat.chec

我想在android上查找当前用户位置

我使用以下代码:

mLocationRequest = LocationRequest.create();
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setInterval(1000); // Update location every second
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

            mMap.setMyLocationEnabled( true );
            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                    mGoogleApiClient);
            if (mLastLocation != null) {
                lat = String.valueOf(mLastLocation.getLatitude());
                lon = String.valueOf(mLastLocation.getLongitude());

            }
            firstLoction();
        }
        else
        {
            Toast.makeText(this, "Not promisseion", Toast.LENGTH_SHORT).show();
        }
它适用于某些网络(数据移动)。但并非适用于所有位置。 (还可与GPS配合使用)


我可以做更多的事情来更好地处理网络吗?

让您的活动实现LocationListener接口,然后利用FusedLocationApi,该API负责所有可用的提供商(例如GPS、网络)

Context ctx = this;
        gpsLocationListener = new OLL(ctx);
        networkLocationListener = new OLL(ctx);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Location temploc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

if (useGPS) {
          if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                     5000, 1, gpsLocationListener);
               }
        }
        if (lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
         lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
            5000, 1, networkLocationListener);
       }

public class OLL implements LocationListener {
Context ctx;
private final static String TAG = "TAG"; 
    public OVoidLL(Context ctx) {

        this.ctx = ctx;
    }
@Override
    public void onLocationChanged(Location location) {
Log.d(TAG, location.toString);

    }
    @Override
    public void onProviderDisabled(String provider) {
    }
    @Override
    public void onProviderEnabled(String provider) {
    }
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
}
在onConnected方法中,您需要按照以下步骤进行操作:

@Override
public void onConnected(Bundle connectionHint) {
    LocationRequest request = new LocationRequest();
    request.setInterval(10000);
    request.setFastestInterval(5000);
    request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    // using fused location api, taking care of all
    // available providers (e.g. GPS, NETWORK)
    // here do not forget to check for available LOCATION
    // permission before asking for updates
    LocationServices.FusedLocationApi.requestLocationUpdates(
        mGoogleApiClient, request, this);
}
由于您的活动实现LocationListener接口,您将在onLocationChanged方法中接收更新

@Override
public void onLocationChanged(Location location) {
    // this method is defined by LocationListener interface
    // here you will receive location updates based
    // on fused location api        
}
有关如何改进代码以减少蓄电池电量消耗的更多详细信息,请参阅


我看到你在活动中使用谷歌地图。也可以使用GoogleMap对象的方法setOnMyLocationChangeListener直接从该对象获取当前位置。不幸的是,此方法现在已被弃用,因此建议使用FusedLocationProviderApi。

使您的活动实现LocationListener接口,然后利用FusedLocationApi,该API将负责所有可用的提供程序(例如GPS、网络)

在onConnected方法中,您需要按照以下步骤进行操作:

@Override
public void onConnected(Bundle connectionHint) {
    LocationRequest request = new LocationRequest();
    request.setInterval(10000);
    request.setFastestInterval(5000);
    request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    // using fused location api, taking care of all
    // available providers (e.g. GPS, NETWORK)
    // here do not forget to check for available LOCATION
    // permission before asking for updates
    LocationServices.FusedLocationApi.requestLocationUpdates(
        mGoogleApiClient, request, this);
}
由于您的活动实现LocationListener接口,您将在onLocationChanged方法中接收更新

@Override
public void onLocationChanged(Location location) {
    // this method is defined by LocationListener interface
    // here you will receive location updates based
    // on fused location api        
}
有关如何改进代码以减少蓄电池电量消耗的更多详细信息,请参阅


我看到你在活动中使用谷歌地图。也可以使用GoogleMap对象的方法setOnMyLocationChangeListener直接从该对象获取当前位置。不幸的是,此方法现在已被弃用,因此建议使用FusedLocationProviderApi。

通过如何在Android应用程序中获取和使用位置数据查看此方法

通过如何在Android应用程序中获取和使用位置数据查看此方法

您不应使用getLastLocation。构建LocationRequest后,应根据此请求请求更新,并实现LocationListener接口以接收更新。不应使用getLastLocation。构建LocationRequest后,您应该基于此请求请求更新,并实现LocationListener接口以接收更新。